1. 程式人生 > 其它 >scilit基礎和機器學習入門(12) 模型的優化

scilit基礎和機器學習入門(12) 模型的優化

超引數的取值和搜尋

超引數是不直接在估計器內學習的引數。在 scikit-learn 包中,它們作為估計器類中建構函式的引數進行傳遞。典型的例子有:用於支援向量分類器的 C 、kernel 和 gamma ,用於Lasso的 alpha等。

網格搜尋法,隨機搜尋法,模型特定交叉驗證,資訊準則優化。網格搜尋法,隨機搜尋法,模型特定交叉驗證,資訊準則優化。

網格搜尋法

網格搜尋法在指定的超引數空間中對每一種可能的情況進行交叉驗證評分並選出最好的超引數組
合。

使用網格搜尋法或隨機搜尋法可以對Pipeline進行引數優化,也可以指定多個評估指標。

from sklearn import svm, datasets
from sklearn.model_selection import GridSearchCV
from sklearn.model_selection import ShuffleSplit
iris = datasets.load_iris()
# 估計器
svc = svm.SVC()
# 超引數空間
param_grid = [
{'C': [1, 10, 100, 1000], 'kernel': ['linear']},
{'C': [1, 10, 100, 1000], 'gamma': [0.001, 0.0001], 'kernel': ['rbf']}
]
# 交叉驗證方案
cv = ShuffleSplit(n_splits=10, test_size=0.3, random_state=0)
# 打分函式
scoring = 'accuracy'
# 指定搜尋或採樣方法
clf = GridSearchCV(svc,param_grid,scoring = scoring,cv = cv)
clf.fit(iris.data, iris.target) #得到的clf是一個優化了的分類器
print(clf.predict(iris.data)) # 用優化的clf對資料進行分類
clf.get_params() #檢視全部引數
clf.best_params_ # 檢視最優引數

對於clf = GridSearchCV(svc,param_grid,scoring = scoring,cv = cv),第一個引數是模型的型別,第二個引數是引數的定址範圍,第三個引數是定義的切分策略。

關於cv,見前一章交叉驗證的內容

隨機搜尋法

隨機搜尋法和網格搜尋法作用類似,但是隻在超引數空間中進行指定次數的不同取樣。取樣次數通過n_iter引數指定,通過調整其大小可以在效率和效能方面取得平衡。其取樣方法呼叫ParameterSampler函式,取樣空間必須用字典進行指定。

網格搜尋法只能在有限的超引數空間進行暴力搜尋,但隨機搜尋法可以在無限的超引數空間進行隨機搜尋。

from sklearn import svm, datasets
from sklearn.model_selection import RandomizedSearchCV
from sklearn.model_selection import ShuffleSplit
from scipy.stats.distributions import expon
iris = datasets.load_iris()
# 估計器
svc = svm.SVC()
# 超引數取樣空間
param_distributions = {'C': [1, 10, 100, 1000],
'gamma': [0.001,0.0001,0.00001,0.000001],
'kernel': ['rbf','linear']}
# 交叉驗證方案
cv = ShuffleSplit(n_splits=3, test_size=0.3, random_state=0)
# 打分函式
scoring = 'accuracy'
# 指定搜尋或採樣方法
clf = RandomizedSearchCV(svc, param_distributions,
scoring = scoring,cv = cv,n_iter = 20 )
clf.fit(iris.data, iris.target) #得到的clf是一個優化了的分類器
print(clf.predict(iris.data)) # 用優化的clf對資料進行分類
clf.get_params() #檢視引數
print(clf.best_params_) #最優引數
clf.best_score_ #最優得分

隨機搜尋在空間很小時和網格搜尋沒有直接區別,但當取值空間為下面的型別是,有很好的效果

from sklearn.model_selection import ParameterSampler
from scipy.stats.distributions import expon
import numpy as np
np.random.seed(0)
param_grid = {'a':[1, 2], 'b': expon()} # b 按指數分佈取樣
param_list = list(ParameterSampler(param_grid, n_iter=10))
param_list

模型特定交叉驗證

一些特定的模型,sklearn構建了一些內部含有交叉驗證優化機制的估計器。
它們主要是在linear_model模組。

例如:

linear_model.ElasticNetCV

inear_model.LogisticRegressionCV

linear_model.RidgeCV

可見,使得交叉驗證評估策略可以大大提高模型效能

資訊準則優化

模型選擇主要由兩個思路。

解釋性框架:好的模型應該是最能解釋現有資料的模型。可以用似然函式來度量模型對資料集描述能力。

預測性框架:好的模型應該是最能預測結果的模型。通常模型引數越多越複雜,越容易出現過擬合。

所以,模型選擇問題在模型複雜度與模型對資料集描述能力(即似然函式)之間尋求最佳平衡。

AIC(赤池資訊準則)和BIC(貝葉斯資訊準則)對模型的選擇提供了一種判據。

AIC資訊準則選擇AIC最大的模型。

BIC資訊準則選擇BIC最大的模型。當樣本數量較大時,BIC對引數個數的懲罰大於AIC。

\[AIC = 2ln(L)-2k \]\[BLC = 2ln(L)-kln(n) \]

linear_model.LassoLarsIC 採用了資訊準則進行優化。

很喜歡聽到一個老師說的“半年理論”,現在做出的努力,一般要在半年的沉澱之後,才能出結果,所以在遇到瓶頸之時,不妨再努力半年