原文作者:Sunil Ray
譯者:TalkingData 張永超
原文鏈接:https://www.analyticsvidhya.com/blog/2017/09/common-machine-learning-algorithms/
簡介
從廣義上講,機器學習算法有三種類型:
監督學習
該算法是由一個目標/結果變量(也成為因變量)組成,該變量可以從一組給定的預測變量中預測出來。使用這些變量的組合,我們可以生成一個由輸入映射到所需輸出的的函數。該算法的訓練過程會嘗試將模型的預測準確度提高到訓練數據所需的程度。具體的算法有:回歸、決策樹、隨機森林、kNN、Logistic回歸等等。
無監督學習
該算法中,沒有任何的目標/結果變量以用來預測/估計?;旧嫌糜诓煌娜后w間的聚類,通常該算法用于對不同的群體進行分組。具體的算法有: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)
GBM
XGBoost
LightGBM
CatBoos
線性回歸
線性回歸主要用于根據連續的變量來估計實際值(例如:房屋成本,通話次數,總銷售額等)。在該算法中,我們通過擬合最佳的分界線來建立獨立變量和因變量之間的關系。該最佳的擬合線稱為回歸線,并可以由線性方程Y = a * X + b表示。例如:我們要求一個五年級的孩子根據班上同學的體重來排序,而不告訴他同學們的具體體重。他會怎么做呢?他可能會根據同學們的身高和體型來判斷某個同學的體重,然后進行排序。我們并沒有告訴他身高和體型與體重之間的關系,而他已經可以通過眼睛的觀察來得到身高和體型與體重之間的關系了,而這個關系是符合上述線性回歸的方程的。
在上述方程中:
Y --- 因變量
a --- 傾斜量
X --- 自變量
b --- 截距
系數a和b是基于最小化數據點與回歸線之間的距離的平方差的總和而得出的。
假設我們有一些人員的身體和體重的數據,將其繪制在圖表中。如下圖所示:
這里我們已經找到了最佳的擬合線,其方程表示為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 object
10linear = linear_model.LinearRegression()
11# Train the model using the training sets and check score
12linear.fit(x_train, y_train)
13linear.score(x_train, y_train)
14# Equation coefficient and Intercept
15print('Coefficient: \n', linear.coef_)
16print('Intercept: \n', linear.intercept_)
17# Predict Output
18predicted= linear.predict(x_test)
2邏輯回歸
不要被這個名字所糊弄了! 其實邏輯回歸并不是回歸算法。它基于給定的一組自變量來估計離散值(二進制值,如0/1,是/否,真/假)。簡單的說,它通過將數據擬合到logit函數來預測事件發生的可能性。因此,它通常也被稱為logit回歸。因為它預測了可能性,即概率,因此其輸出值在0和1之間。例如:你的朋友給你出了一道難題,并且他并不知道你的知識范圍,而你能給出的結果只有能解決或者不能解決。假如這道題是高級物理學科的題目,你可能只有大學本科的經歷,你給出能解決的概率可能只有20%,而如何你恰好是一個物理學博士,你給出解決的概率可能就有80%了,這就是邏輯回歸。
從數學的含義上講,邏輯回歸就是結果的對數幾率被建模為預測變量的線性組合。如下:
1odds = p / (1- p) = probabilityofevent occurrence / probabilityofnotevent occurrence
2ln(odds) = ln(p / (1- p))
3logit(p) = ln(p / (1- p)) = b0+b1X1+b2X2+b3X3....+bkXk
上述公式中,p是存在感興趣特征的概率。它選擇最大化觀察樣本值的可能性的參數,而不是最小化平方誤差的總和(如在普通回歸中那樣)。
Python code
1# Import Library
2fromsklearn.linear_modelimportLogisticRegression
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 Intercept
10print('Coefficient: \n', model.coef_)
11print('Intercept: \n', model.intercept_)
12# Predict Output
13predicted= model.predict(x_test)
3決策樹
決策樹是一種主要用于分類問題的監督學習算法。該算法不僅僅支持分類問題,還支持連續因變量問題。在這個算法中,我們將人口分成兩個或更多的齊次集合。這是基于最重要的屬性/獨立變量來完成的,以盡可能地形成不同的組。
如上圖所示,可以看到該算法根據多個屬性將一個群體分為了四個不同的群體,以識別“他們是否會參加比賽”。為了分組,它使用各種技術,如基尼,信息增益,卡方,熵等。
另一種理解決策樹的絕佳方式是玩一個微軟上經典的游戲 --- Jezzball。基本上,你有一個有活動墻壁的房間,你需要創造墻壁,這樣最大的區域就會被清理掉。
因此,每一次你使用墻壁來劃分房間,你都將試圖將一個房間劃分為兩部分。決策樹也非常類似這種方式。
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 Output
12predicted= model.predict(x_test)
4SVM(支持向量機)
SVM是一個分類方法。在該算法中,我們將每個數據項繪制為n維空間中的一個點(其中n是您擁有的要素數),每個要素的值都是特定坐標的值。
例如,如果我們只有個人的身高和頭發長度兩個特征,我們首先在二維空間中繪制這兩個變量,其中每個點有兩個坐標(這些坐標被稱為支持向量)。
現在,我們將找到一些分割兩個不同分類數據組之間線。而這條線將使得兩組數據中最近點的距離最遠。
在上面所示的例子中,將數據分成兩個不同分類組的線是黑線,因為兩個最近點離線最遠。這條線就是我們的分類器。然后,根據測試數據在線兩側的位置,就可以區分測試數據屬于哪個類了。
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 Output
10predicted= model.predict(x_test)
5樸素貝葉斯
樸素貝葉斯是一種基于貝葉斯定理的分類技術,假設預測變量之間具有獨立性。簡而言之,樸素貝葉斯分類器假定類中特定特征的存在與任何其他特征的存在無關。例如,如果果實呈紅色,圓形,直徑約3英寸,則可認為其為蘋果。即使這些特征依賴于彼此或者依賴于其他特征的存在,樸素貝葉斯分類器也會考慮所有這些特性來獨立地貢獻該水果是蘋果的可能性。
樸素貝葉斯模型很容易構建,對于非常大的數據集特別有用。貝葉斯定理提供了一種從P(c),P(x)和P(x | c)計算后驗概率P(c | x)的方法??聪旅娴墓剑?/p>
這里:
P(c | x)是給定預測器(屬性)的類(目標)的后驗概率。
P(c)是類的先驗概率。
P(x | c)是預測器給定類的概率的可能性。
P(x)是預測變量的先驗概率。
例子:讓我們用一個例子來理解它。下面我有一個天氣和相應的目標變量“是否參加比賽”的訓練數據集?,F在,我們需要根據天氣情況來分類球員是否參加比賽。讓我們按照以下步驟來執行它。
將數據集轉換為頻率表
通過查找像Overcast probability = 0.29和播放概率為0.64的概率來創建Likelihood表。
現在,使用樸素貝葉斯方程來計算每個類別的后驗概率。具有最高后驗概率的類別是預測的結果。
Python code
1# Import Library
2fromsklearn.naive_bayesimportGaussianNB
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 model = GaussianNB() # there is other distribution for multinomial classes like Bernoulli Naive Bayes, Refer link
5# Train the model using the training sets and check score
6model.fit(X, y)
7# Predict Output
8predicted= model.predict(x_test)
6kNN (k-最近鄰)
kNN可以用于分類和回歸問題。然而,它在業內的分類問題中被更廣泛地使用。 K最近鄰算法是一個簡單的算法,它存儲所有可用的案例,并通過其k個鄰居的多數投票來分類新案例。被分配給類的情況在距離函數測量的k近鄰中最為常見。
這些距離函數可以是歐幾里得,曼哈頓,閔可夫斯基和海明距離。前三個函數用于連續函數,第四個函數(Hamming)用于分類變量。如果K = 1,那么該情況被簡單地分配給其最近鄰居的類別。有時,在執行kNN建模時選擇K是一項挑戰。
kNN可以很容易地映射到我們的真實生活中。如果你想了解一個你沒有信息的人,你可能想知道他的親密朋友和他進入的圈子并獲得他/她的信息!
選擇kNN之前需要考慮的事項: * KNN在計算上很耗時 * 在使用kNN時,變量應該被標準化,否則更高的范圍變量會偏向它 * 在進入kNN之前要更多地進行數據預處理,如異常值,噪音消除等。
Python code
1# Import Library
2fromsklearn.neighborsimportKNeighborsClassifier
3# Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
4# Create KNeighbors classifier object model
5KNeighborsClassifier(n_neighbors=6)# default value for n_neighbors is 5
6# Train the model using the training sets and check score
7model.fit(X, y)
8# Predict Output
9predicted= model.predict(x_test)
7K-均值(K-Means)
K-均值是一種解決聚類問題的無監督算法。其過程遵循一個簡單的方法,通過一定數量的聚類(假設k個聚類)對給定的數據集進行分類。群集內的數據點與同級群組是同質且異質的。
例如在白紙上隨機撒上的墨水, K-均值有點類似這個活動,每一塊墨水水漬可以理解為一個群組。
K-means如何形成群集:
K-means為每個簇選取k個點,稱為質心。
每個數據點形成具有最接近質心的群集,即k個群集。
根據現有集群成員查找每個集群的質心。這里我們有新的質心。
由于我們有新的質心,請重復步驟2和3.從新質心找到每個數據點的最近距離,并與新的k-簇進行關聯。重復這個過程直到收斂發生,即質心不變。
如何確定K的值:
在K-means中,我們有簇,每個簇都有自己的質心。質心與聚類內的數據點之間的差的平方和構成該聚類的平方值的和。另外,當所有群集的平方值總和相加時,群集解決方案的平方和總和為總和。
我們知道,隨著群集數量的增加,這個值會持續下降,但是如果您繪制結果,您可能會看到平方距離的總和急劇下降到某個k值,然后再慢得多。在這里,我們可以找到聚類的最佳數量。
Python code
1# Import Library
2from sklearn.cluster import KMeans
3# Assumed you have, X (attributes) for training data set and x_test(attributes) of test_dataset
4# Create KNeighbors classifier object model
5k_means = KMeans(n_clusters=3, random_state=0)
6# Train the model using the training sets and check score
7model.fit(X)
8# Predict Output
9predicted= model.predict(x_test)
8
隨機森林
隨機森林是一個決策樹集合的術語。在隨機森林中,集成了多個決策樹(所謂的“森林”)。要根據屬性對新對象進行分類,每棵樹都會給出一個分類,并且該樹會為該分類“投票”。森林選擇票數最多的分類,即為最終的分類。
每株樹種植和生長如下:
如果訓練集中的病例數為N,則隨機抽取N個病例的樣本,但需要更換。這個樣本將成為培育樹的培訓集。
如果有M個輸入變量,則指定一個數m << M,以便在每個節點處從M中隨機選擇m個變量,并且使用這些m上的最佳分割來分割節點。在森林生長期間,m的值保持不變。
每棵樹都盡可能地生長。沒有修剪。
Python code
1# Import Library
2from sklearn.ensemble import RandomForestClassifier
3# Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
4# Create Random Forest object
5model= RandomForestClassifier()
6# Train the model using the training sets and check score
7model.fit(X, y)
8# Predict Output
9predicted= 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 dataset
10test_reduced = pca.transform(test)
10梯度下降算法
10.1. GBM
當我們處理大量數據以進行具有高預測能力的預測時,GBM是一種增強算法。 Boosting實際上是一種學習算法集合,它將幾個基本估計量的預測結合起來,以提高單個估計量的魯棒性。它將多個弱預測器或平均預測器組合成強大的預測器。這些提升算法在Kaggle,AV Hackathon,CrowdAnalytix等數據科學競賽中始終運作良好。
Python code
1# Import Library
2from sklearn.ensemble import GradientBoostingClassifier
3# Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
4# Create Gradient Boosting Classifier object
5model= GradientBoostingClassifier(n_estimators=100, learning_rate=1.0, max_depth=1, random_state=0)
6# Train the model using the training sets and check score
7model.fit(X, y)
8# Predict Output
9predicted= 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 data
11y_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 features
11data = 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
1importpandasaspd
2importnumpyasnp
3fromcatboostimportCatBoostRegressor
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 performance
11X = train.drop(['Item_Outlet_Sales'], axis=1)
12y = train.Item_Outlet_Sales
13fromsklearn.model_selectionimporttrain_test_split
14X_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 model
17fromcatboostimportCatBoostRegressormodel=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庫中也常內置了各種數據集,你可以查看相應的官方文檔查找并直接使用。