實戰演練網格搜索與模型調參

實戰演練網格搜索與模型調參

超參數是模型外部的變量,它的值不能根據數據集來估計。超參數的值必須在學習過程開始之前就設置。例如,支持向量機中的 c,k-最近鄰中的 k,神經網絡中隱藏層的數目。

相反得是,參數是模型內部的變量,它的值和數據相關。例如,線性/邏輯迴歸的β係數或支持向量機中的支持向量。

網格搜索用於尋找模型的最佳超參數,從而得到最“準確”的預測。

我們通過使用網格搜索構建一個乳腺癌數據集的分類模型。

1. 導入數據集

導入數據集並查看前10行。

# 導入數據
data = pd.read_csv('breast-cancer-wisconsin.csv',header=None)
# 設置列名
data.columns = ['Sample Code Number','Clump Thickness','Uniformity of Cell Size',
'Uniformity of Cell Shape','Marginal Adhesion','Single Epithelial Cell Size',
'Bare Nuclei','Bland Chromatin','Normal Nucleoli','Mitoses','Class']
# 查看前10行
data.head(10)

輸出:

實戰演練網格搜索與模型調參

數據集中的每一行都有兩個可能的分類之一:良性(用2表示)和惡性(用4表示)。此外,數據集中還有其他10個屬性(如上所示)用於預測。

2. 清理數據

清理數據並將模型的分類值重命名為0和1(其中1表示惡性情況),並查看分佈情況

data = data.drop(['Sample Code Number'],axis=1) # 去掉第一列
data = data[data['Bare Nuclei'] != '?'] # 去掉丟失數據的行
data['Class'] = np.where(data['Class'] ==2,0,1) # 改變分類的表示
data['Class'].value_counts() # 計算

輸出:

實戰演練網格搜索與模型調參

其中良性病例444例,惡性病例239例。

3. 構建虛擬分類器

在構建分類模型之前,先構建一個虛擬分類器來確定“基準”性能。這可以回答一個問題: “如果只是簡單的預測,該模型的成功率會是多少?” 使用虛擬分類器可以簡單地預測多數分類。

# 將數據分為屬性和分類
X = data.drop(['Class'],axis=1)
y = data['Class']
# 進行訓練和 分割測試集
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42)
# 虛擬分類器
from sklearn.dummy import DummyClassifier
clf = DummyClassifier(strategy= 'most_frequent').fit(X_train,y_train)
y_pred = clf.predict(X_test)
# y測試集的分佈
print('y actual : \n' + str(y_test.value_counts()))
# y預測的分佈
print('y predicted : \n' + str(pd.Series(y_pred).value_counts()))

輸出:

實戰演練網格搜索與模型調參

實戰演練網格搜索與模型調參

從輸出可以看出,測試數據集中有68個惡性病例和103個良性病例。但是,我們的分類器將所有情況預測為良性(因為它是多數分類)。

4. 評估模型的性能

# 模型評估指標 
from sklearn.metrics import accuracy_score,recall_score,precision_score,f1_score
print('Accuracy Score : ' + str(accuracy_score(y_test,y_pred)))
print('Precision Score : ' + str(precision_score(y_test,y_pred)))
print('Recall Score : ' + str(recall_score(y_test,y_pred)))
print('F1 Score : ' + str(f1_score(y_test,y_pred)))
# 虛擬分類器混淆矩陣

from sklearn.metrics import confusion_matrix
print('Confusion Matrix : \n' + str(confusion_matrix(y_test,y_pred)))

輸出:

實戰演練網格搜索與模型調參

實戰演練網格搜索與模型調參

模型的準確度為60.2%,但這種情況下,準確度可能不是評估模型的最佳指標。先看看其他的評估指標。

實戰演練網格搜索與模型調參

上圖是混淆矩陣,添加了標籤和顏色。混淆矩陣總結:TRUE POSITIVES(TP)= 0,TRUE NEGATIVES(TN)= 103,FALSE POSITIVES(FP)= 0,FALSE NEGATIVES(FN)= 68.

評估指標的公式如下:

實戰演練網格搜索與模型調參

由於該模型沒有正確地對任何惡性病例進行分類,因此召回率和精確度指標為0。

5. 用默認參數構建邏輯迴歸模型

現在已經有了基準精度,接著用默認參數構建邏輯迴歸模型並評估。

# 邏輯迴歸
from sklearn.linear_model import LogisticRegression
clf = LogisticRegression().fit(X_train,y_train)
y_pred = clf.predict(X_test)
# 模型評估指標
from sklearn.metrics import accuracy_score,recall_score,precision_score,f1_score
print('Accuracy Score : ' + str(accuracy_score(y_test,y_pred)))
print('Precision Score : ' + str(precision_score(y_test,y_pred)))
print('Recall Score : ' + str(recall_score(y_test,y_pred)))
print('F1 Score : ' + str(f1_score(y_test,y_pred)))
# 邏輯迴歸分類器混淆矩陣
from sklearn.metrics import confusion_matrix
print('Confusion Matrix : \n' + str(confusion_matrix(y_test,y_pred)))

輸出:

實戰演練網格搜索與模型調參

實戰演練網格搜索與模型調參

通過使用默認參數擬合邏輯迴歸模型,我們得到了一個“更好”的模型。準確度為94.7%,同時精度達到了驚人的98.3%。現在再次看一下這個模型的混淆矩陣:

實戰演練網格搜索與模型調參

觀察錯誤分類的情況,可以看到有8例惡性病例被錯誤地歸類為良性(假陰性)。此外,只有一個良性病例被歸類為惡性病例(假陽性)。

假陰性更嚴重,因為疾病被忽視,可能導致患者死亡。同時,誤報會導致不必要的治療,產生額外費用。

讓我們使用網格搜索來找到最佳參數,儘量減少誤報。網格搜索可用於改進任何特定的評估指標。

需要關注的減少漏報的指標是召回率。

6. 網格搜索最大化召回率

# 網格搜索
from sklearn.model_selection import GridSearchCV
clf = LogisticRegression()
grid_values = {'penalty': ['l1', 'l2'],'C':[0.001,.009,0.01,.09,1,5,10,25]}
grid_clf_acc = GridSearchCV(clf, param_grid = grid_values,scoring = 'recall')
grid_clf_acc.fit(X_train, y_train)
# 新參數預測值
y_pred_acc = grid_clf_acc.predict(X_test)
# 新模型的評估指標
print('Accuracy Score : ' + str(accuracy_score(y_test,y_pred_acc)))
print('Precision Score : ' + str(precision_score(y_test,y_pred_acc)))
print('Recall Score : ' + str(recall_score(y_test,y_pred_acc)))
print('F1 Score : ' + str(f1_score(y_test,y_pred_acc)))
# 邏輯迴歸(網格搜索)混淆矩陣
confusion_matrix(y_test,y_pred_acc)

輸出:

實戰演練網格搜索與模型調參

實戰演練網格搜索與模型調參

我們要調整的超參數是:

  1. 罰項:l1或l2。
  2. C:正則化函數的反函數 - 較小的C值指定較強的正則化。

此外,在網格搜索函數中,我們有評分參數,可以在其中指定評估模型的指標(我們選擇召回率作為指標)。在下面的混淆矩陣中,我們可以看到假陰性的數量已經減少,但是這是以增加誤報為代價的。網格搜索後的召回率從88.2%升高至91.1%,而精度則從98.3%下降至87.3%。

實戰演練網格搜索與模型調參

您可以使用“f1”得分作為評估指標,進一步調整模型以在精度和召回率之間取得平衡。

網格搜索為指定的每個超參數組合構建模型,並評估每個模型。用於超參數調整的更有效的技術是隨機化搜索,使用超參數的隨機組合來找到最佳解決方案。


分享到:


相關文章: