1. 程式人生 > >泰坦尼克號資料探勘專案實戰——Task6 模型調優

泰坦尼克號資料探勘專案實戰——Task6 模型調優

任務6:使用網格搜尋法對5個模型進行調優(調參時採用五折交叉驗證的方式),並進行模型評估。

參考:【1】https://blog.csdn.net/qfire/article/details/77601901

【2】https://blog.csdn.net/jasonding1354/article/details/50562522

【3】https://www.jianshu.com/p/55b9f2ea283b

【4】https://www.cnblogs.com/sddai/p/6440797.html

 【5】https://blog.csdn.net/wangrongrongwq/article/details/86349083

      首先,依然是日常的基礎知識補充——什麼是網格搜尋法(Grid Search)。

Grid Search:一種調參手段;窮舉搜尋:在所有候選的引數選擇中,通過迴圈遍歷,嘗試每一種可能性,表現最好的引數就是最終的結果。其原理就像是在數組裡找最大值。(為什麼叫網格搜尋?以有兩個引數的模型為例,引數a有3種可能,引數b有4種可能,把所有可能性列出來,可以表示成一個3*4的表格,其中每個cell就是一個網格,迴圈過程就像是在每個網格里遍歷、搜尋,所以叫grid search).

 可能存在的問題:

原始資料集劃分成訓練集和測試集以後,其中測試集除了用作調整引數,也用來測量模型的好壞;這樣做導致最終的評分結果比實際效果要好。(因為測試集在調參過程中,送到了模型裡,而我們的目的是將訓練模型應用在unseen data上);

解決方法:

對訓練集再進行一次劃分,分成訓練集和驗證集,這樣劃分的結果就是:原始資料劃分為3份,分別為:訓練集、驗證集和測試集;其中訓練集用來模型訓練,驗證集用來調整引數,而測試集用來衡量模型表現好壞。

交叉驗證經常與網格搜尋進行結合,作為引數評價的一種方法,這種方法叫做grid search with cross validation。sklearn因此設計了一個這樣的類GridSearchCV,這個類實現了fit,predict,score等方法,被當做了一個estimator,使用fit方法,該過程中:(1)搜尋到最佳引數;(2)例項化了一個最佳引數的estimator;

 接下來開始本次任務的程式碼部分:


#### task6 模型調優
## sklearn的類GridSearchCV

##邏輯迴歸調優
from sklearn.model_selection import GridSearchCV
from sklearn.linear_model import LogisticRegression
from sklearn.cross_validation import train_test_split,cross_val_score
from sklearn.metrics import *
import matplotlib.pyplot as plt
#把要調整的引數以及其候選值 列出來
parameters = {'penalty': ['l1', 'l2'],'C': [0.01,0.1,0.5,1,10]}
print("Parameters:{}".format(parameters))

grid_search = GridSearchCV(estimator = LogisticRegression(), param_grid=parameters,cv = 5) #例項化一個GridSearchCV類
TrainData, TestData,TrainLabel,TestLabel = train_test_split(train_X, target_Y, test_size=0.3,random_state = 2018)
grid_search.fit(TrainData,TrainLabel) #訓練,找到最優的引數,同時使用最優的引數例項化一個新的SVC estimator。
print("Test set score:{:.2f}".format(grid_search.score(TestData,TestLabel)))
print("Best parameters:{}".format(grid_search.best_params_))
print("Best score on train set:{:.2f}".format(grid_search.best_score_))
Parameters:{'penalty': ['l1', 'l2'], 'C': [0.01, 0.1, 0.5, 1, 10]}
Test set score:0.87
Best parameters:{'penalty': 'l2', 'C': 1}
Best score on train set:0.80
##支援向量機調優
from sklearn import svm
parameters = {'C':[0.01, 0.1, 1, 5, 10]}
print("Parameters:{}".format(parameters))
grid_search = GridSearchCV(estimator = svm.SVC(), param_grid=parameters,cv = 5) #例項化一個GridSearchCV類
TrainData, TestData,TrainLabel,TestLabel = train_test_split(train_X, target_Y, test_size=0.3,random_state = 2018)
grid_search.fit(TrainData,TrainLabel) #訓練,找到最優的引數,同時使用最優的引數例項化一個新的SVC estimator。
print("Test set score:{:.2f}".format(grid_search.score(TestData,TestLabel)))
print("Best parameters:{}".format(grid_search.best_params_))
print("Best score on train set:{:.2f}".format(grid_search.best_score_))
Parameters:{'C': [0.01, 0.1, 1, 5, 10]}
Test set score:0.76
Best parameters:{'C': 10}
Best score on train set:0.73
## 決策樹調優
#from sklearn import tree
from sklearn.tree import DecisionTreeClassifier

parameters = {'max_depth': [1, 5, 10]}
print("Parameters:{}".format(parameters))
grid_search = GridSearchCV(estimator = DecisionTreeClassifier(), param_grid=parameters,cv = 5) #例項化一個GridSearchCV類
TrainData, TestData,TrainLabel,TestLabel = train_test_split(train_X, target_Y, test_size=0.3,random_state = 2018)
grid_search.fit(TrainData,TrainLabel) #訓練,找到最優的引數,同時使用最優的引數例項化一個新的SVC estimator。
print("Test set score:{:.2f}".format(grid_search.score(TestData,TestLabel)))
print("Best parameters:{}".format(grid_search.best_params_))
print("Best score on train set:{:.2f}".format(grid_search.best_score_))
Parameters:{'max_depth': [1, 5, 10]}
Test set score:0.80
Best parameters:{'max_depth': 10}
Best score on train set:0.79
##隨機森林調優
from sklearn.ensemble import RandomForestClassifier
parameters = {'n_estimators':[1, 5, 10, 20]}
print("Parameters:{}".format(parameters))
grid_search = GridSearchCV(estimator = RandomForestClassifier(), param_grid=parameters,cv = 5) #例項化一個GridSearchCV類
TrainData, TestData,TrainLabel,TestLabel = train_test_split(train_X, target_Y, test_size=0.3,random_state = 2018)
grid_search.fit(TrainData,TrainLabel) #訓練,找到最優的引數,同時使用最優的引數例項化一個新的SVC estimator。
print("Test set score:{:.2f}".format(grid_search.score(TestData,TestLabel)))
print("Best parameters:{}".format(grid_search.best_params_))
print("Best score on train set:{:.2f}".format(grid_search.best_score_))
Parameters:{'n_estimators': [1, 5, 10, 20]}
Test set score:0.86
Best parameters:{'n_estimators': 20}
Best score on train set:0.78
## xgb 調優

from xgboost import XGBClassifier
parameter = {'n_estimators':[1, 5, 10, 20, 40]}
print("Parameters:{}".format(parameters))
grid_search = GridSearchCV(estimator = XGBClassifier(), param_grid=parameters,cv = 5) #例項化一個GridSearchCV類
TrainData, TestData,TrainLabel,TestLabel = train_test_split(train_X, target_Y, test_size=0.3,random_state = 2018)
grid_search.fit(TrainData,TrainLabel) #訓練,找到最優的引數,同時使用最優的引數例項化一個新的SVC estimator。
print("Test set score:{:.2f}".format(grid_search.score(TestData,TestLabel)))
print("Best parameters:{}".format(grid_search.best_params_))
print("Best score on train set:{:.2f}".format(grid_search.best_score_))
Parameters:{'n_estimators': [1, 5, 10, 20]}
Test set score:0.85
Best parameters:{'n_estimators': 1}
Best score on train set:0.81

從以上結果來看,測試集正確率最高的是邏輯迴歸。