為了提升模型的泛化性能,我們可以通過調參來實現。
在嘗試調參之前,重要的是理解參數的含義,找到一個模型的重要參數(提供最佳泛化性能的參數)的取值是一項棘手的任務,但對于幾乎所有模型和數據集來說都是必要的。由于這項任務如此常見,所以scikit-learn中有一些標準方法可以實現,其中最常用的方法就是網格搜索,它只要是指嘗試我們關心的參數的所有可能組合。
考慮一個具有RBF(徑向基函數)核的核SVM的例子,它在SVC類中實現。它有兩個重要參數,:核寬度gamma和正則化參數C。假設我們希望嘗試C和gamma都有6個不同的取值,所以總共有36中參數組合,設置表如下所示:
我們可以實現一個簡單的網格搜索,在2個參數上使用for循環,對每種參數組合分別訓練并評估一個分類器:
from sklearn.svm import SVC
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_splitiris=load_iris()X_train,X_test,y_train,y_test=train_test_split(iris.data,iris.target,random_state=0)
print('訓練集大小:{} 測試集大小:{}'.format(X_train.shape[0],X_test.shape[0]))best_score=0for gamma in [0.001,0.01,0.1,1,10,100]:for C in [0.001,0.01,0.1,1,10,100]:#對每種參數組合都訓練一個SVCsvm=SVC(gamma=gamma,C=C)svm.fit(X_train,y_train)score=svm.score(X_test,y_test)if score>best_score:best_score=scorebest_parameters={'C':C,'gamma':gamma}print('最高精度:{:.2f}'.format(best_score))
print('最好參數組合:{}'.format(best_parameters))