Python機(jī)器學(xué)習(xí)入門(mén)(五)之Python算法審查
程序測(cè)試是展現(xiàn)BUG存在的有效方式,但令人絕望的是它不足以展現(xiàn)其缺位。
——艾茲格·迪杰斯特拉(Edsger W. Dijkstra)
算法審查時(shí)選擇合適的機(jī)器學(xué)習(xí)算法主要方式之一。審查算法前并不知道哪個(gè)算法對(duì)問(wèn)題最有效,必須設(shè)計(jì)一定的實(shí)驗(yàn)進(jìn)行驗(yàn)證,以找到對(duì)問(wèn)題最有效的算法。
審查算法前沒(méi)有辦法判斷那個(gè)算法對(duì)數(shù)據(jù)集最有效、能夠生成最優(yōu)模型,必須通過(guò)一些列的實(shí)驗(yàn)進(jìn)行驗(yàn)證才能夠得出結(jié)論,從而選擇最優(yōu)的算法。這個(gè)過(guò)程被稱(chēng)為審查算法。
審查算法時(shí),要嘗試多種代表性算法、機(jī)器學(xué)習(xí)算法以及多種模型,通過(guò)大量實(shí)驗(yàn)才能找到最有效的算法。
1.審查分類(lèi)算法
1.1線(xiàn)性算法審查
1.1.1邏輯回歸
邏輯回歸其實(shí)是一個(gè)分類(lèi)算法而不是回歸算法,通常是利用已知的自變量來(lái)預(yù)測(cè)一個(gè)離散型因變量的值(如二進(jìn)制0/1、真/假)。簡(jiǎn)單來(lái)說(shuō),它就是通過(guò)擬合一個(gè)邏輯回歸函數(shù)(Logistic Function)來(lái)預(yù)測(cè)事件發(fā)生的概率。所以它預(yù)測(cè)的是一個(gè)概率值,它的輸出值應(yīng)該為0~1,因此非常適合二分類(lèi)問(wèn)題。
from pandas import read_csv from sklearn.model_selection import KFold from sklearn.model_selection import cross_val_score from sklearn.linear_model import LogisticRegression#邏輯回歸 filename = 'pima_data.csv' names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class'] data = read_csv(filename, names=names) array = data.values X = array[:, 0:8] Y = array[:, 8] #邏輯回歸 num_folds = 10 seed = 7 kfold = KFold(n_splits=num_folds, random_state=seed, shuffle=True) model = LogisticRegression(max_iter=3000) result = cross_val_score(model, X, Y, cv=kfold) print(result.mean())
執(zhí)行結(jié)果如下:0.7721633629528366
1.1.2線(xiàn)性判別分析
線(xiàn)性判別分析(Linear DIscriminant Analysis,LDA),也叫做Fisher線(xiàn)性判別(Fisher Linear Discriminant Analysis,F(xiàn)LD)。它的思想是將高維的模式樣本投影到最佳鑒別矢量空間,以達(dá)到抽取分類(lèi)信息和壓縮特征空間維數(shù)的效果,投影后保證模式樣本在新的子空間有最大類(lèi)間距離和最小類(lèi)內(nèi)距離。因此,他是一種有效的特征抽取方法。(完全不懂它是什么東西。。。)
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis #相同代碼不再贅述 #線(xiàn)性判別分析 model = LinearDiscriminantAnalysis() result = cross_val_score(model, X, Y, cv=kfold) print(result.mean())
執(zhí)行結(jié)果如下:
0.7669685577580315
1.2非線(xiàn)性算法審查
1.2.1K近鄰算法
K近鄰算法的基本思路是:如果一個(gè)樣本在特征空間中的k個(gè)最相似的樣本中大多數(shù)屬于某一個(gè)類(lèi)別,則該樣本也屬于這個(gè)了類(lèi)別。在scikit-learn中通過(guò)KNeighborsClassifier實(shí)現(xiàn)。
from sklearn.neighbors import KNeighborsClassifier #相同代碼不再贅述 #K近鄰 model = KNeighborsClassifier() result = cross_val_score(model, X, Y,cv=kfold) print(result.mean())
0.7109876965140123
1.2.2貝葉斯分類(lèi)器
貝葉斯分類(lèi)器的分類(lèi)原理是通過(guò)某對(duì)象的先驗(yàn)概率,利用貝葉斯公式計(jì)算出其在所有類(lèi)別上的后驗(yàn)概率,即該對(duì)象屬于某一類(lèi)的來(lái)率,選擇具有最大后驗(yàn)概率的類(lèi)作為該對(duì)象所屬的類(lèi)。
from sklearn.naive_bayes import GaussianNB #貝葉斯分類(lèi)器 model = GaussianNB() result = cross_val_score(model, X, Y,cv=kfold) print(result.mean())
0.7591421736158578
1.2.3分類(lèi)與回歸樹(shù)
分類(lèi)與回歸樹(shù)(CART).CART算法由以下兩布組成:
- 樹(shù)的生成:基于訓(xùn)練集生成決策樹(shù),生成的決策樹(shù)要盡量大。
- 樹(shù)的剪枝:用驗(yàn)證集對(duì)已生成的樹(shù)進(jìn)行剪枝,并選擇最優(yōu)子樹(shù),這時(shí)以損失函數(shù)最小作為剪枝標(biāo)準(zhǔn)。
from sklearn.tree import DecisionTreeClassifier #分類(lèi)與回歸樹(shù) model = DecisionTreeClassifier() result = cross_val_score(model, X, Y,cv=kfold) print(result.mean())
0.688961038961039
1.2.4支持向量機(jī)
from sklearn.svm import SVC #支持向量機(jī) model = SVC() result = cross_val_score(model, X, Y,cv=kfold) print(result.mean())
0.760457963089542
2.審查回歸算法
本部分使用波士頓房?jī)r(jià)的數(shù)據(jù)集來(lái)審查回歸算法,采用10折交叉驗(yàn)證來(lái)分離數(shù)據(jù),并應(yīng)用到所有的算法上。
2.1線(xiàn)性算法審查
2.1.1線(xiàn)性回歸算法
線(xiàn)性回歸算法時(shí)利用數(shù)理統(tǒng)計(jì)中的回歸分析,來(lái)確定兩種或兩種以上變量間相互依賴(lài)的定量關(guān)系的一種統(tǒng)計(jì)分析方法。在回歸分析中,若只包含一個(gè)自變量和一個(gè)因變量,且二者的關(guān)系可用一條直線(xiàn)近似表示,這種回歸分析成為一元線(xiàn)性回歸分析。如果回歸分析中包含兩個(gè)或兩個(gè)以上的自變量,且因變量和自變量之間是線(xiàn)性關(guān)系,則稱(chēng)為多元線(xiàn)性回歸分析。
from pandas import read_csv
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
from sklearn.linear_model import LinearRegression
filename = 'housing.csv'
names = ['CRIM','ZN','INDUS','CHAS','NOX','RM','AGE','DIS','RAD','TAX','PRTATIO','B','LSTAT','MEDV']
data = read_csv(filename,names=names,delim_whitespace=True)
array = data.values
X = array[:,0:13]
Y = array[:,13]
n_splits = 10
seed = 7
kfold = KFold(n_splits=n_splits,random_state=seed,shuffle=True)
#線(xiàn)性回歸算法
model = LinearRegression()
scoring = 'neg_mean_squared_error'
result = cross_val_score(model, X, Y, cv=kfold, scoring=scoring)
print("線(xiàn)性回歸算法:%.3f" % result.mean())
線(xiàn)性回歸算法:-23.747
2.1.2嶺回歸算法
嶺回歸算法是一種專(zhuān)門(mén)用于共線(xiàn)性數(shù)據(jù)分析的有偏估計(jì)回歸方法,實(shí)際上是一種改良的最小二乘估計(jì)法,通過(guò)放棄最小二乘法的無(wú)偏性,以損失部分信息、降低精度為代價(jià),獲得回歸系數(shù)更符合實(shí)際、更可靠的回歸方法,對(duì)病態(tài)數(shù)據(jù)的擬合要強(qiáng)于最小二乘法。
from sklearn.linear_model import Ridge
#嶺回歸算法
model = Ridge()
scoring = 'neg_mean_squared_error'
result = cross_val_score(model, X, Y, cv=kfold, scoring=scoring)
print("嶺回歸算法:%.3f" % result.mean())
嶺回歸算法:-23.890
2.1.3套索回歸算法
套索回歸算法與嶺回歸算法類(lèi)似,套索回歸算法也會(huì)懲罰回歸系數(shù),在套索回歸中會(huì)懲罰回歸系數(shù)的絕對(duì)值大小。此外,它能夠減少變化程度并提高線(xiàn)性回歸模型的精度。
from sklearn.linear_model import Lasso
#套索回歸算法
model = Lasso()
scoring = 'neg_mean_squared_error'
result = cross_val_score(model, X, Y, cv=kfold, scoring=scoring)
print("套索回歸算法:%.3f" % result.mean())
套索回歸算法:-28.746
2.1.4彈性網(wǎng)絡(luò)回歸算法
彈性網(wǎng)絡(luò)回歸算法是套索回歸算法和嶺回歸算法的混合體,在模型訓(xùn)練時(shí)彈性網(wǎng)絡(luò)回歸算法綜合使用L1和L2兩種正則化方法。當(dāng)有多個(gè)相關(guān)的特征時(shí),彈性網(wǎng)絡(luò)回歸算法是很有用的,套索回歸算法會(huì)隨機(jī)挑選一個(gè),而彈性網(wǎng)絡(luò)回歸算法則會(huì)選擇兩個(gè)。它的優(yōu)點(diǎn)是允許彈性網(wǎng)絡(luò)回歸繼承循環(huán)狀態(tài)下嶺回歸的一些穩(wěn)定性。
from sklearn.linear_model import ElasticNet
#彈性網(wǎng)絡(luò)回歸算法
model = ElasticNet()
scoring = 'neg_mean_squared_error'
result = cross_val_score(model, X, Y, cv=kfold, scoring=scoring)
print("彈性網(wǎng)絡(luò)回歸算法:%.3f" % result.mean())
彈性網(wǎng)絡(luò)回歸算法:-27.908
2.2非線(xiàn)性算法審查
2.2.1K近鄰算法
在scikit-learn中對(duì)回歸算法的K近鄰算法的實(shí)現(xiàn)類(lèi)是KNeighborsRegressor。默認(rèn)距離參數(shù)為閔氏距離。
from sklearn.neighbors import KNeighborsRegressor
#K近鄰算法
model = KNeighborsRegressor()
scoring = 'neg_mean_squared_error'
result = cross_val_score(model, X, Y, cv=kfold, scoring=scoring)
print("K近鄰算法:%.3f" % result.mean())
K近鄰算法:-38.852
2.2.2分類(lèi)與回歸樹(shù)
在scikit-learn中分類(lèi)與回歸樹(shù)的實(shí)現(xiàn)類(lèi)是DecisionTreeRegressor。
from sklearn.tree import DecisionTreeRegressor
#分類(lèi)與回歸樹(shù)算法
model = DecisionTreeRegressor()
scoring = 'neg_mean_squared_error'
result = cross_val_score(model, X, Y, cv=kfold, scoring=scoring)
print("分類(lèi)與回歸樹(shù)算法:%.3f" % result.mean())
K近鄰算法:-38.852
分類(lèi)與回歸樹(shù)算法:-21.527
2.2.3支持向量機(jī)
from sklearn.svm import SVR
#支持向量機(jī)
model = SVR()
scoring = 'neg_mean_squared_error'
result = cross_val_score(model, X, Y, cv=kfold, scoring=scoring)
print("支持向量機(jī):%.3f" % result.mean())
支持向量機(jī):-67.641
3.算法比較
比較不同算法的準(zhǔn)確度,選擇合適的算法,在處理機(jī)器學(xué)習(xí)的問(wèn)題時(shí)是分廠(chǎng)重要的。接下來(lái)將介紹一種模式,在scikit-learn中可以利用它比較不同的算法,并選擇合適的算法。
當(dāng)?shù)玫揭粋€(gè)新的數(shù)據(jù)集時(shí),應(yīng)該通過(guò)不同的維度來(lái)審查數(shù)據(jù),以便找到數(shù)據(jù)的特征。一種比較好的方法是通過(guò)可視化的方式來(lái)展示平均準(zhǔn)確度、方差等屬性,以便于更方便地選擇算法。
最合適的算法比較方法是:使用相同數(shù)據(jù)、相同方法來(lái)評(píng)估不同算法,以便得到一個(gè)準(zhǔn)確的結(jié)果。
使用Pima Indias數(shù)據(jù)集來(lái)介紹如何比較算法。采用10折交叉驗(yàn)證來(lái)分離數(shù)據(jù),并采用相同的隨機(jī)數(shù)分配方式來(lái)確保所有算法都使用相同的數(shù)據(jù)。為了便于理解,為每個(gè)算法設(shè)定一個(gè)短名字。
from pandas import read_csv
from sklearn.model_selection import KFold
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import cross_val_score
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
from sklearn.neighbors import KNeighborsRegressor
from sklearn.tree import DecisionTreeRegressor
from sklearn.svm import SVC
from sklearn.naive_bayes import GaussianNB
from matplotlib import pyplot
filename = 'pima_data.csv'
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = read_csv(filename,names=names)
array = data.values
X = array[:,0:8]
Y = array[:,8]
num_folds = 10
seed = 7
kfold = KFold(n_splits=num_folds,random_state=seed,shuffle=True)
models={}
models['LR'] = LogisticRegression(max_iter=3000)
models['LDA'] = LinearDiscriminantAnalysis()
models['KNN'] = KNeighborsRegressor()
models['CART'] = DecisionTreeRegressor()
models['SVM'] = SVC()
models['NB'] = GaussianNB()
results = []
for name in models:
result = cross_val_score(models[name], X, Y, cv=kfold)
results.append(result)
msg = '%s: %.3f (%.3f)' % (name, result.mean(), result.std())
print(msg)
#圖表顯示
fig = pyplot.figure()
fig.suptitle('Algorithm Comparison')
ax = fig.add_subplot(111)
pyplot.boxplot(results)
ax.set_xticklabels(models.keys())
pyplot.show()
執(zhí)行結(jié)果如下:
LR: 0.772 (0.050)
LDA: 0.767 (0.048)
KNN: 0.081 (0.159)
CART: -0.478 (0.257)
SVM: 0.760 (0.035)
NB: 0.759 (0.039)

總結(jié)
本文主要介紹了算法審查以及如何選擇最合適的算法,在第三部分中提供了代碼實(shí)例,可以直接將其作為模板使用到項(xiàng)目中以選擇最優(yōu)算法。
到此這篇關(guān)于Python機(jī)器學(xué)習(xí)入門(mén)(五)算法審查的文章就介紹到這了,更多相關(guān)Python機(jī)器學(xué)習(xí)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python3報(bào)錯(cuò)check_hostname?requires?server_hostname的解決
這篇文章主要介紹了python3報(bào)錯(cuò)check_hostname?requires?server_hostname的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12
Python實(shí)現(xiàn)CAN報(bào)文轉(zhuǎn)換工具教程
python實(shí)戰(zhàn)教程之OCR文字識(shí)別方法匯總
Python Flask實(shí)現(xiàn)圖片驗(yàn)證碼與郵箱驗(yàn)證碼流程詳細(xì)講解
Python matplotlib 畫(huà)圖窗口顯示到gui或者控制臺(tái)的實(shí)例
Qt調(diào)用Python詳細(xì)圖文過(guò)程記錄
詳解pycharm2020.1.1專(zhuān)業(yè)版安裝指南(推薦)
基于python實(shí)現(xiàn)語(yǔ)音錄入識(shí)別代碼實(shí)例

