機器學習調參
- 常用調參方法舉例
-
- K鄰近算法(最正常版本)
- 加入交叉驗證
- 加上網格搜尋
- GridSearchCV
- 函數介紹
-
- GridSearchCV
- cross_val_score
常用調參方法舉例
sklearn使得我們在很多編寫代碼的時候更多的工作傾向于調參數而不是去寫算法本身,本篇文章整理了一下常用的調參方式。
K鄰近算法(最正常版本)
import numpy as np
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
# 導入鸢尾花資料
iris=datasets.load_iris()
iris_X=iris.data
iris_y=iris.target
#檢視前兩行資料
print(iris_X[:2,:])
#[[5.1 3.5 1.4 0.2]
#[4.9 3. 1.4 0.2]]
#檢視結果集
print(iris_y)
#劃分資料
X_train,X_test,y_train,y_test=train_test_split(iris_X,iris_y,test_size=0.3,random_state=3)
#訓練模型
knn=KNeighborsClassifier(n_neighbors=5)
knn.fit(X_train,y_train)
#預測值
print(knn.predict(X_test))
#檢視模型得分
print(knn.score(X_test,y_test))
# 0.9555555555555556
加入交叉驗證
注意因為代碼是在jupyter中運作,是以變量我就不重新定義了。
cross_val_score詳細介紹放在文章末尾。
from sklearn.model_selection import cross_val_score
#cross_val_score函數一般用到的參數(對照下面):模型 訓練資料測試資料 分為幾份 計分方式下面的accu為準确的值劃分
sorces=cross_val_score(knn,iris_X,iris_y,cv=5,scoring='accuracy')
print(sorces)
#[0.96666667 1. 0.93333333 0.96666667 1. ]
print(sorces.mean()) #求得分均值
#0.9733333333333334
加上網格搜尋
不知道這裡寫的對不對
import matplotlib.pyplot as plt
k_range=range(1,31)
k_sorces=[]
for k in k_range:
knn=L=KNeighborsClassifier(n_neighbors=k)
sorces=cross_val_score(knn,iris_X,iris_y,cv=10,scoring='accuracy')
k_sorces.append(sorces.mean())
#下面兩行是因為橫縱坐标會因為漢字報錯
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
plt.plot(k_range,k_sorces)
plt.xlabel('對應k值')
plt.ylabel('k值對應分數')
plt.show()
結果為
GridSearchCV
這個其實就是交叉驗證和網格搜尋的結合,直接得出最優的參數。GridSearchCV的函數資訊放在文章末尾(隻寫了幾個常用的參數)
from sklearn.model_selection import GridSearchCV
k_range=range(1,31)
params = {'n_neighbors':k_range}
grid_search = GridSearchCV(knn,params,cv=10,scoring='accuracy')
grid_search.fit(X_train, y_train)
print('模型最高分:{:.3f}'.format(grid_search.score(X_test, y_test)))
print('最優參數:{}'.format(grid_search.best_params_))
#模型最高分:0.956
#最優參數:{'n_neighbors': 5}
函數介紹
GridSearchCV
class sklearn.model_selection.GridSearchCV(estimator, param_grid, , scoring=None, n_jobs=None, refit=True, cv=None, verbose=0, pre_dispatch='2n_jobs’, error_score=nan, return_train_score=False)
參數 | 解釋 |
---|---|
estimator | 定義好的模型或者分類器 |
param_grid | 需要最優化的參數的取值,值為字典或者清單 |
scoring | 模型評價标準 |
n_jobs | 并行數,預設為1,最多就是你的cpu核數 |
cv | 交叉驗證參數,預設None,上文我用的就是常說的10倍交叉驗證 |
cross_val_score
sklearn.model_selection.cross_val_score(estimator, X, y=None, , groups=None, scoring=None, cv=None, n_jobs=None, verbose=0, fit_params=None, pre_dispatch='2n_jobs’, error_score=nan)
參數 | 解釋 |
---|---|
estimator | 估計器,也就是模型 |
X, y | 資料源 資料,标簽值 |
scoring | 調用的方法 |
n_jobs | 同時工作的cpu個數(-1代表全部) |
cv | 交叉驗證生成器或可疊代的次數 |