技術專欄丨10大機器學習算法速覽,帶你開啓AI之旅

譯者:TalkingData 張永超

原文鏈接:https://www.analyticsvidhya.com/blog/2017/09/common-machine-learning-algorithms/

簡介

從廣義上講,機器學習算法有三種類型:

監督學習

該算法是由一個目標/結果變量(也成爲因變量)組成,該變量可以從一組給定的預測變量中預測出來。使用這些變量的組合,我們可以生成一個由輸入映射到所需輸出的的函數。該算法的訓練過程會嘗試將模型的預測準確度提高到訓練數據所需的程度。具體的算法有:迴歸、決策樹、隨機森林、kNN、Logistic迴歸等等。

無監督學習

該算法中,沒有任何的目標/結果變量以用來預測/估計。基本上用於不同的羣體間的聚類,通常該算法用於對不同的羣體進行分組。具體的算法有:Apriori算法,K-means等。

強化學習

該算法是比較新的一個機器學習算法分類,使用該算法,機器會被訓練來做出一些特定的決策。此時機器會被暴露在一個特定的環境中,通過反覆試驗不斷的訓練自己,知道最終得到一個比較好的決策結果。該算法會從過去的經驗中學習,並嘗試捕捉最佳的結果知識以做出更加準確的決策。典型的算法有:馬爾可夫決策過程等。

“通用機器學習算法列表

下面是一些通用的機器學習算法,這些算法基本上能夠解決大部分的數據相關問題:

1. 線性迴歸(Linear Regression)

2. 邏輯迴歸(Logistic Regression)

3. 決策樹(Decision Tree)

4. 支持向量機(SVM)

5. 樸素貝葉斯(Naive Bayes)

6. k近鄰(kNN)

7. k均值(K-Means)

8. 隨機森林(Random Forest)

9. 降維算法(Dimensionality Reduction Algorithms)

10. 梯度增強算法(Gradient Boosting algorithms)

GBMXGBoostLightGBMCatBoost1線性迴歸

線性迴歸主要用於根據連續的變量來估計實際值(例如:房屋成本,通話次數,總銷售額等)。在該算法中,我們通過擬合最佳的分界線來建立獨立變量和因變量之間的關係。該最佳的擬合線稱爲迴歸線,並可以由線性方程Y = a * X + b表示。例如:我們要求一個五年級的孩子根據班上同學的體重來排序,而不告訴他同學們的具體體重。他會怎麼做呢?他可能會根據同學們的身高和體型來判斷某個同學的體重,然後進行排序。我們並沒有告訴他身高和體型與體重之間的關係,而他已經可以通過眼睛的觀察來得到身高和體型與體重之間的關係了,而這個關係是符合上述線性迴歸的方程的。

在上述方程中:

Y --- 因變量a --- 傾斜量X --- 自變量b --- 截距

係數a和b是基於最小化數據點與迴歸線之間的距離的平方差的總和而得出的。

假設我們有一些人員的身體和體重的數據,將其繪製在圖表中。如下圖所示:

技術專欄丨10大機器學習算法速覽,帶你開啓AI之旅

這裏我們已經找到了最佳的擬合線,其方程表示爲y = 0.2811*x + 13.9,爲圖中黑色線。那麼我們就可以使用這個方程來根據某人的身高,得到其體重了。

線性迴歸主要有兩種類型:單一線性迴歸和多元線性迴歸。單一線性迴歸顧名思義,就是僅由一個獨立的自變量表徵,而多元線性迴歸由多於一個自變量來表徵。在尋找最佳擬合線時,可以擬合多項式或曲線迴歸。

本文中的代碼大部分爲演示所用,在實際應用中需要替換甚至重寫部分代碼,請慎重複制粘貼!

Python code

 1# Import Library 2# Import other necessary libraries like pandas, numpy... 3from sklearn import linear_model 4# Load Train and Test datasets 5# Identify feature and response variable(s) and values must be numeric and numpy arrays 6x_train=input_variables_values_training_datasets 7y_train=target_variables_values_training_datasets 8x_test=input_variables_values_test_datasets 9# Create linear regression object10linear = linear_model.LinearRegression()11# Train the model using the training sets and check score12linear.fit(x_train, y_train)13linear.score(x_train, y_train)14# Equation coefficient and Intercept15print('Coefficient: n', linear.coef_)16print('Intercept: n', linear.intercept_)17# Predict Output18predicted= linear.predict(x_test)
2邏輯迴歸

不要被這個名字所糊弄了! 其實邏輯迴歸並不是迴歸算法。它基於給定的一組自變量來估計離散值(二進制值,如0/1,是/否,真/假)。簡單的說,它通過將數據擬合到logit函數來預測事件發生的可能性。因此,它通常也被稱爲logit迴歸。因爲它預測了可能性,即概率,因此其輸出值在0和1之間。例如:你的朋友給你出了一道難題,並且他並不知道你的知識範圍,而你能給出的結果只有能解決或者不能解決。假如這道題是高級物理學科的題目,你可能只有大學本科的經歷,你給出能解決的概率可能只有20%,而如何你恰好是一個物理學博士,你給出解決的概率可能就有80%了,這就是邏輯迴歸。

從數學的含義上講,邏輯迴歸就是結果的對數幾率被建模爲預測變量的線性組合。如下:

1odds = p / (1 - p) = probability of event occurrence / probability of not event occurrence2ln(odds) = ln(p / (1 - p))3logit(p) = ln(p / (1 - p)) = b0+b1X1+b2X2+b3X3....+bkXk

上述公式中,p是存在感興趣特徵的概率。它選擇最大化觀察樣本值的可能性的參數,而不是最小化平方誤差的總和(如在普通迴歸中那樣)。

技術專欄丨10大機器學習算法速覽,帶你開啓AI之旅

Python code

 1# Import Library 2from sklearn.linear_model import LogisticRegression 3# Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset 4# Create logistic regression object 5model = LogisticRegression() 6# Train the model using the training sets and check score 7model.fit(X, y) 8model.score(X, y) 9# Equation coefficient and Intercept10print('Coefficient: n', model.coef_)11print('Intercept: n', model.intercept_)12# Predict Output13predicted= model.predict(x_test)
3決策樹

決策樹是一種主要用於分類問題的監督學習算法。該算法不僅僅支持分類問題,還支持連續因變量問題。在這個算法中,我們將人口分成兩個或更多的齊次集合。這是基於最重要的屬性/獨立變量來完成的,以儘可能地形成不同的組。

技術專欄丨10大機器學習算法速覽,帶你開啓AI之旅

如上圖所示,可以看到該算法根據多個屬性將一個羣體分爲了四個不同的羣體,以識別“他們是否會參加比賽”。爲了分組,它使用各種技術,如基尼,信息增益,卡方,熵等。

另一種理解決策樹的絕佳方式是玩一個微軟上經典的遊戲 --- Jezzball。基本上,你有一個有活動牆壁的房間,你需要創造牆壁,這樣最大的區域就會被清理掉。

技術專欄丨10大機器學習算法速覽,帶你開啓AI之旅

因此,每一次你使用牆壁來劃分房間,你都將試圖將一個房間劃分爲兩部分。決策樹也非常類似這種方式。

Python code

 1# Import Library 2# Import other necessary libraries like pandas, numpy... 3from sklearn import tree 4# Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset 5# Create tree object 6model = tree.DecisionTreeClassifier(criterion='gini') # for classification, here you can change the algorithm as gini or entropy (information gain) by default it is gini 7# model = tree.DecisionTreeRegressor() for regression 8# Train the model using the training sets and check score 9model.fit(X, y)10model.score(X, y)11# Predict Output12predicted= model.predict(x_test)
4SVM(支持向量機)

SVM是一個分類方法。在該算法中,我們將每個數據項繪製爲n維空間中的一個點(其中n是您擁有的要素數),每個要素的值都是特定座標的值。

例如,如果我們只有個人的身高和頭髮長度兩個特徵,我們首先在二維空間中繪製這兩個變量,其中每個點有兩個座標(這些座標被稱爲支持向量)。

技術專欄丨10大機器學習算法速覽,帶你開啓AI之旅

現在,我們將找到一些分割兩個不同分類數據組之間線。而這條線將使得兩組數據中最近點的距離最遠。

技術專欄丨10大機器學習算法速覽,帶你開啓AI之旅

在上面所示的例子中,將數據分成兩個不同分類組的線是黑線,因爲兩個最近點離線最遠。這條線就是我們的分類器。然後,根據測試數據在線兩側的位置,就可以區分測試數據屬於哪個類了。

Python code

 1# Import Library 2from sklearn import svm 3# Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset 4# Create SVM classification object 5model = svm.svc() # there is various option associated with it, this is simple for classification. You can refer link, for mo# re detail. 6# Train the model using the training sets and check score 7model.fit(X, y) 8model.score(X, y) 9# Predict Output10predicted= model.predict(x_test)
5樸素貝葉斯

樸素貝葉斯是一種基於貝葉斯定理的分類技術,假設預測變量之間具有獨立性。簡而言之,樸素貝葉斯分類器假定類中特定特徵的存在與任何其他特徵的存在無關。例如,如果果實呈紅色,圓形,直徑約3英寸,則可認爲其爲蘋果。即使這些特徵依賴於彼此或者依賴於其他特徵的存在,樸素貝葉斯分類器也會考慮所有這些特性來獨立地貢獻該水果是蘋果的可能性。

樸素貝葉斯模型很容易構建,對於非常大的數據集特別有用。貝葉斯定理提供了一種從P(c),P(x)和P(x | c)計算後驗概率P(c | x)的方法。看下面的公式:

技術專欄丨10大機器學習算法速覽,帶你開啓AI之旅

這裏:

P(c | x)是給定預測器(屬性)的類(目標)的後驗概率。P(c)是類的先驗概率。P(x | c)是預測器給定類的概率的可能性。P(x)是預測變量的先驗概率。

例子:讓我們用一個例子來理解它。下面我有一個天氣和相應的目標變量“是否參加比賽”的訓練數據集。現在,我們需要根據天氣情況來分類球員是否參加比賽。讓我們按照以下步驟來執行它。

將數據集轉換爲頻率表通過查找像Overcast probability = 0.29和播放概率爲0.64的概率來創建Likelihood表。現在,使用樸素貝葉斯方程來計算每個類別的後驗概率。具有最高後驗概率的類別是預測的結果。

Python code

1# Import Library2from sklearn.naive_bayes import GaussianNB3# Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset4# Create SVM classification object model = GaussianNB() # there is other distribution for multinomial classes like Bernoulli Naive Bayes, Refer link5# Train the model using the training sets and check score6model.fit(X, y)7# Predict Output8predicted= model.predict(x_test)
6kNN (k-最近鄰)

kNN可以用於分類和迴歸問題。然而,它在業內的分類問題中被更廣泛地使用。 K最近鄰算法是一個簡單的算法,它存儲所有可用的案例,並通過其k個鄰居的多數投票來分類新案例。被分配給類的情況在距離函數測量的k近鄰中最爲常見。

這些距離函數可以是歐幾里得,曼哈頓,閔可夫斯基和海明距離。前三個函數用於連續函數,第四個函數(Hamming)用於分類變量。如果K = 1,那麼該情況被簡單地分配給其最近鄰居的類別。有時,在執行kNN建模時選擇K是一項挑戰。

技術專欄丨10大機器學習算法速覽,帶你開啓AI之旅

kNN可以很容易地映射到我們的真實生活中。如果你想了解一個你沒有信息的人,你可能想知道他的親密朋友和他進入的圈子並獲得他/她的信息!

選擇kNN之前需要考慮的事項: * KNN在計算上很耗時 * 在使用kNN時,變量應該被標準化,否則更高的範圍變量會偏向它 * 在進入kNN之前要更多地進行數據預處理,如異常值,噪音消除等。

Python code

1# Import Library2from sklearn.neighbors import KNeighborsClassifier3# Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset4# Create KNeighbors classifier object model 5KNeighborsClassifier(n_neighbors=6) # default value for n_neighbors is 56# Train the model using the training sets and check score7model.fit(X, y)8# Predict Output9predicted= model.predict(x_test)
7K-均值(K-Means)

K-均值是一種解決聚類問題的無監督算法。其過程遵循一個簡單的方法,通過一定數量的聚類(假設k個聚類)對給定的數據集進行分類。羣集內的數據點與同級羣組是同質且異質的。

例如在白紙上隨機撒上的墨水, K-均值有點類似這個活動,每一塊墨水水漬可以理解爲一個羣組。

技術專欄丨10大機器學習算法速覽,帶你開啓AI之旅

K-means如何形成羣集:K-means爲每個簇選取k個點,稱爲質心。每個數據點形成具有最接近質心的羣集,即k個羣集。根據現有集羣成員查找每個集羣的質心。這裏我們有新的質心。由於我們有新的質心,請重複步驟2和3.從新質心找到每個數據點的最近距離,並與新的k-簇進行關聯。重複這個過程直到收斂發生,即質心不變。

如何確定K的值:

在K-means中,我們有簇,每個簇都有自己的質心。質心與聚類內的數據點之間的差的平方和構成該聚類的平方值的和。另外,當所有羣集的平方值總和相加時,羣集解決方案的平方和總和爲總和。

我們知道,隨着羣集數量的增加,這個值會持續下降,但是如果您繪製結果,您可能會看到平方距離的總和急劇下降到某個k值,然後再慢得多。在這裏,我們可以找到聚類的最佳數量。

技術專欄丨10大機器學習算法速覽,帶你開啓AI之旅

Python code

1# Import Library2from sklearn.cluster import KMeans3# Assumed you have, X (attributes) for training data set and x_test(attributes) of test_dataset4# Create KNeighbors classifier object model 5k_means = KMeans(n_clusters=3, random_state=0)6# Train the model using the training sets and check score7model.fit(X)8# Predict Output9predicted= model.predict(x_test)
8隨機森林

隨機森林是一個決策樹集合的術語。在隨機森林中,集成了多個決策樹(所謂的“森林”)。要根據屬性對新對象進行分類,每棵樹都會給出一個分類,並且該樹會爲該分類“投票”。森林選擇票數最多的分類,即爲最終的分類。

每株樹種植和生長如下:

如果訓練集中的病例數爲N,則隨機抽取N個病例的樣本,但需要更換。這個樣本將成爲培育樹的培訓集。如果有M個輸入變量,則指定一個數m << M,以便在每個節點處從M中隨機選擇m個變量,並且使用這些m上的最佳分割來分割節點。在森林生長期間,m的值保持不變。每棵樹都儘可能地生長。沒有修剪。

Python code

1# Import Library2from sklearn.ensemble import RandomForestClassifier3# Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset4# Create Random Forest object5model= RandomForestClassifier()6# Train the model using the training sets and check score7model.fit(X, y)8# Predict Output9predicted= model.predict(x_test)
9維度降低算法

在過去的4-5年裏,在每個可能的階段數據採集呈指數級增長。企業/政府機構/研究機構不僅擁有新的資源,而且還在詳細捕獲數據。

例如:電子商務公司正在抓住更多有關客戶的細節,例如他們的人口統計數據,網絡爬行歷史,他們喜歡或不喜歡的內容,購買歷史記錄,反饋信息等等,以便爲他們提供比最近的雜貨店老闆更多的個性化關注。

作爲一名數據科學家,我們提供的數據還包含許多功能,這對構建良好的健壯模型聽起來不錯,但是存在挑戰。你如何確定1000或2000年以外的重要變量?在這種情況下,降維算法可以幫助我們連同各種其他算法,如決策樹,隨機森林,PCA,因子分析,基於相關矩陣的識別,缺失值比等。

Python code

 1# Import Library 2from sklearn import decomposition 3# Assumed you have training and test data set as train and test 4# Create PCA obeject pca= decomposition.PCA(n_components=k) #default value of k =min(n_sample, n_features) 5# For Factor analysis 6# fa= decomposition.FactorAnalysis() 7# Reduced the dimension of training dataset using PCA 8train_reduced = pca.fit_transform(train) 9# Reduced the dimension of test dataset10test_reduced = pca.transform(test) 
10梯度下降算法

10.1. GBM

當我們處理大量數據以進行具有高預測能力的預測時,GBM是一種增強算法。 Boosting實際上是一種學習算法集合,它將幾個基本估計量的預測結合起來,以提高單個估計量的魯棒性。它將多個弱預測器或平均預測器組合成強大的預測器。這些提升算法在Kaggle,AV Hackathon,CrowdAnalytix等數據科學競賽中始終運作良好。

Python code

1# Import Library2from sklearn.ensemble import GradientBoostingClassifier3# Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset4# Create Gradient Boosting Classifier object5model= GradientBoostingClassifier(n_estimators=100, learning_rate=1.0, max_depth=1, random_state=0)6# Train the model using the training sets and check score7model.fit(X, y)8# Predict Output9predicted= model.predict(x_test)

10.2. XGBoost

XGBoost是另一個經典的漸變增強算法,被稱爲在一些Kaggle比賽中獲勝的關鍵性算法。

XGBoost具有非常高的預測能力,使其成爲事件精確度的最佳選擇,因爲它具有線性模型和樹學習算法,使得該算法比現有梯度增強技術快近10倍。

支持包括各種目標函數,包括迴歸,分類和排名。

XGBoost最有趣的事情之一就是它也被稱爲正規化提升技術。這有助於減少過度裝配建模,並且對Scala,Java,R,Python,Julia和C ++等一系列語言提供大量支持。

在許多包含GCE,AWS,Azure和Yarn羣集的機器上支持分佈式和廣泛的培訓。 XGBoost還可以與Spark,Flink和其他雲數據流系統集成在一起,每次迭代過程中都有內置的交叉驗證。

Python code

 1from xgboost import XGBClassifier 2from sklearn.model_selection import train_test_split 3from sklearn.metrics import accuracy_score 4X = dataset[:,0:10] 5Y = dataset[:,10:] 6seed = 1 7X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.33, random_state=seed) 8model = XGBClassifier() 9model.fit(X_train, y_train)10#Make predictions for test data11y_pred = model.predict(X_test)

10.3. LightGBM

LightGBM是一種梯度提升框架,使用基於樹的學習算法。它的設計是分佈式和高效的,具有以下優點:

更快的訓練速度和更高的效率降低內存使用量更好的準確性支持並行和GPU學習能夠處理大型數據

該框架是一種基於決策樹算法的快速高性能梯度提升算法,用於排序、分類和許多其他機器學習任務。它是在Microsoft的分佈式機器學習工具包項目下開發的。

由於LightGBM基於決策樹算法,因此它將樹葉以最佳擬合進行分割。因此,當在Light GBM中的同一片葉上生長時,葉式算法可以比平面式算法減少更多的損失,因此可以獲得更好的精度,而現有的任何增強算法都很難達到這些精度。

Python code

 1data = np.random.rand(500, 10) # 500 entities, each contains 10 features 2label = np.random.randint(2, size=500) # binary target 3train_data = lgb.Dataset(data, label=label) 4test_data = train_data.create_valid('test.svm') 5param = {'num_leaves':31, 'num_trees':100, 'objective':'binary'} 6param['metric'] = 'auc' 7num_round = 10 8bst = lgb.train(param, train_data, num_round, valid_sets=[test_data]) 9bst.save_model('model.txt')10# 7 entities, each contains 10 features11data = np.random.rand(7, 10)12ypred = bst.predict(data)

10.4. Catboost

CatBoost是Yandex最近開源的機器學習算法。它可以輕鬆地與Google的TensorFlow和Apple的Core ML等深度學習框架相整合。

CatBoost最棒的部分是它不需要像其他ML模型那樣的大量數據訓練,並且可以處理各種數據格式;不會破壞它的可靠性。

在使用和執行Catboost算法之前,請確保數據中的缺失值已經被處理。

Catboost可以自動處理分類變量而不顯示類型轉換錯誤,這有助於您更專注於更好地調整模型。

Python code

 1import pandas as pd 2import numpy as np 3from catboost import CatBoostRegressor 4#Read training and testing files 5train = pd.read_csv("train.csv") 6test = pd.read_csv("test.csv") 7#Imputing missing values for both train and test 8train.fillna(-999, inplace=True) 9test.fillna(-999,inplace=True)10#Creating a training set for modeling and validation set to check model performance11X = train.drop(['Item_Outlet_Sales'], axis=1)12y = train.Item_Outlet_Sales13from sklearn.model_selection import train_test_split14X_train, X_validation, y_train, y_validation = train_test_split(X, y, train_size=0.7, random_state=1234)15categorical_features_indices = np.where(X.dtypes != np.float)[0]16#importing library and building model17from catboost import CatBoostRegressormodel=CatBoostRegressor(iterations=50, depth=3, learning_rate=0.1, loss_function='RMSE')18model.fit(X_train, y_train,cat_features=categorical_features_indices,eval_set=(X_validation, y_validation),plot=True)19submission = pd.DataFrame()20submission['Item_Identifier'] = test['Item_Identifier']21submission['Outlet_Identifier'] = test['Outlet_Identifier']22submission['Item_Outlet_Sales'] = model.predict(test)
總結

至此,相信你對機器學習的各個主要算法有了一個大概的瞭解,文中給出了各個算法的邏輯代碼,你可以從這裏開始,嘗試解決一些問題,並在過程中加深理解。關於數據,你可以在網絡上找到很多,而且在一些所使用到的Python庫中也常內置了各種數據集,你可以查看相應的官方文檔查找並直接使用。

相關文章