算法篩查(spot checking)用來(lái)發(fā)現(xiàn)可以很好解決機(jī)器學(xué)習(xí)問(wèn)題的算法。在著手做之前若未,你永遠(yuǎn)也不知道哪種算法最契合你的數(shù)據(jù)。因此你必須嘗試大量的算法,找出一個(gè)最有潛力的算法磷斧,繼續(xù)深入挖掘。本文中會(huì)展示六種適用于分類問(wèn)題的算法捷犹,我們可以使用scikit-learn進(jìn)行算法篩查弛饭。
算法篩查
在為你的機(jī)器學(xué)習(xí)問(wèn)題選擇算法時(shí),問(wèn)題不是:我應(yīng)該使用哪種算法萍歉?而是:哪些算法可以用于我的算法篩查侣颂?你可以推測(cè)哪些算法可能適合你的數(shù)據(jù)集,這是一個(gè)好的開(kāi)始枪孩。我推薦嘗試混合一些算法憔晒,看看哪一個(gè)可以最好的反映出你的數(shù)據(jù)結(jié)構(gòu)。
- 嘗試混合具有不同表征的算法 (instances and trees)蔑舞。
- 嘗試混合不同的學(xué)習(xí)算法 (different algorithms for learning the same type of representation)拒担。
- 嘗試混合不同的建模類型的算法 (linear and nonlinear functions or parametric and nonparametric)。
我們將了解6個(gè)分類算法攻询,可以用于算法篩查从撼。
兩個(gè)線性機(jī)器學(xué)習(xí)算法:
- Logistic Regression
- Linear Discriminant Analysis
四個(gè)非線性的機(jī)器學(xué)習(xí)算:
- K-Nearest Neighbors
- Naive Bayes
- Classification and Regression Trees
- Support Vector Machines
使用Pima Indians onset of Diabetes 數(shù)據(jù)集。變量為數(shù)值型钧栖,是一個(gè)關(guān)于二分分類問(wèn)題的數(shù)據(jù)低零。統(tǒng)一使用10-fold的交叉驗(yàn)證來(lái)展示如何進(jìn)行算法篩選婆翔,使用平均的準(zhǔn)確率來(lái)代表算法的表現(xiàn)。
6種算法
- 邏輯回歸假設(shè)數(shù)值型輸入掏婶,數(shù)值符合高斯分布啃奴,用于二分的分類問(wèn)題。使用LogisticRegression類構(gòu)建模型气堕。
- 線性判別分析用于二分或者多分的分類問(wèn)題纺腊。同樣假設(shè)數(shù)值符合高斯分布。使用LinearDiscriminantAnalysis類構(gòu)建模型茎芭。
- K近鄰使用距離的方法為新數(shù)據(jù)找到K個(gè)相似的實(shí)例揖膜,把鄰居的平均作為預(yù)測(cè)結(jié)果。使用KNeighborsClassifier類構(gòu)建模型梅桩。
- 樸素貝葉斯算法計(jì)算每個(gè)類別的概率和已知輸入值的每個(gè)類別的條件概率壹粟。新的數(shù)據(jù)計(jì)算以上概率,假設(shè)它們彼此獨(dú)立的情況下宿百,做乘法趁仙。使用GaussianNB類構(gòu)建模型。
- 分類和回歸數(shù)(CART or just decision trees) 使用訓(xùn)練數(shù)據(jù)構(gòu)建二分樹(shù)垦页。通過(guò)評(píng)價(jià)數(shù)據(jù)變量最小化cost函數(shù)來(lái)獲得分割點(diǎn)雀费。使用DecisionTreeClassifier類構(gòu)建模型。
- 支持向量機(jī)找到一條線可以分離兩類痊焊。與分割線最近的數(shù)據(jù)實(shí)例叫做支持向量盏袄,這些支持向量對(duì)分離線有決定性影響。該算法的一個(gè)要點(diǎn)是使用不同的核函數(shù)來(lái)建立模型薄啥。Radial Basis Function是默認(rèn)的核函數(shù)辕羽。使用SVC類構(gòu)建模型。
代碼如下(在原代碼的基礎(chǔ)上做了一個(gè)循環(huán)):
# Logistic Regression Classification
import pandas
from sklearn import model_selection
from sklearn.linear_model import LogisticRegression
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
from sklearn.neighbors import KNeighborsClassifier
from sklearn.naive_bayes import GaussianNB
from sklearn.tree import DecisionTreeClassifier
from sklearn.svm import SVC
url = "https://archive.ics.uci.edu/ml/machine-learning-databases/pima-indians-diabetes/pima-indians-diabetes.data"
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
dataframe = pandas.read_csv(url, names=names)
array = dataframe.values
X = array[:,0:8]
Y = array[:,8]
seed = 7
kfold = model_selection.KFold(n_splits=10, random_state=seed)
def build_model(model_name):
model = model_name()
return model
for model_name in [LogisticRegression,LinearDiscriminantAnalysis,KNeighborsClassifier,GaussianNB,DecisionTreeClassifier,SVC]:
model = build_model(model_name)
results = model_selection.cross_val_score(model, X, Y, cv=kfold)
print("%s mean accuracy:%s")%(model_name,results.mean())
結(jié)果如下:
<class 'sklearn.linear_model.logistic.LogisticRegression'> mean accuracy:0.76951469583
<class 'sklearn.discriminant_analysis.LinearDiscriminantAnalysis'> mean accuracy:0.773462064252
<class 'sklearn.neighbors.classification.KNeighborsClassifier'> mean accuracy:0.726555023923
<class 'sklearn.naive_bayes.GaussianNB'> mean accuracy:0.75517771702
<class 'sklearn.tree.tree.DecisionTreeClassifier'> mean accuracy:0.696548188653
<class 'sklearn.svm.classes.SVC'> mean accuracy:0.651025290499
主要知識(shí)點(diǎn)
- model_selection.KFold
- model_selection.cross_val_score
- results.mean
- linear_model.LogisticRegression
- discriminat_analysis.LinearDiscriminantAnalysis
- neighbors.KNeighborsClassifier
- naive_bayes.GaussianNB
- tree.DecisionTreeClassifier
- svm.SVC
原文鏈接:Spot-Check Classification Machine Learning Algorithms in Python with scikit-learn