c语言网格搜索,使用逻辑回归时怎么利用网格搜索来查找degree,c等超参数
非常好的問題。如何將自定義的Pipline對象應用于sklearn內置的網格搜索確實是課程沒有講的一個sklearn使用上的語法細節:)
首先,你在31行的注釋分析的是正確的。由于此時,你在構建grid_search的時候,傳入的算法是log_reg。而log_reg是LogisticRegression的對象,但是創建LogisticRegression是并不需要參數degree,所以,這里會報錯。
正確的做法是,我們要對你創建的PolynomialLogisticRegression這個函數返回的對象進行網格搜索。這個函數的邏輯是返回了一個Pipeline的對象,這個Pipeline的對象中創建PolynomialFeatures時使用了degree這個參數。
為了方便起見,在這里,我為這個PolynomialLogisticRegression添加上了默認值。def?PolynomialLogisticRegression(degree?=?1,?C?=?0.1):
return?Pipeline([
('poly',?PolynomialFeatures(degree=degree)),
('std_scaler',?StandardScaler()),
('log_reg',?LogisticRegression(C=C))
])
poly_log_reg?=?PolynomialLogisticRegression()
我們需要針對poly_log_reg這個對象進行網格搜索:)
但是,在這里,poly_log_reg中包含三部分,每部分都有自己的參數。按照你寫的param_grid,參數名稱直接寫degree和C,GridSearchCV是無法認得這些參數名隸屬于哪一部分的。所以,在這種情況下,我們在設置param_grid的時候,參數名要顯示地表明這個參數屬于哪個部分。表示的方法是:{$Pipeline中的對象名稱}__{$參數名}
即,在Pipeline中的對象名稱,加上雙下換線(__),再加上參數名稱。
所以,我們在網格搜索中,要搜索的兩個參數名稱應該是:poly__degree
log_reg__C
其中的poly和log_reg,是你在實例化這個Pipeline對象的時候,給每一部分起的那個名稱。
綜上,此時我們的param_grid,要這樣聲明:C_PARM?=?[0.1,0.2,0.3,0.4,0.5]
param_grid?=?[
{
'poly__degree':?[i?for?i?in?range(1,?11)],
'log_reg__C':?[i?for?i?in?C_PARM]
}
]
現在,就可以按照以前一樣的方法使用GridSearchCV啦:)grid_search?=?GridSearchCV(poly_log_reg,?param_grid)
grid_search.fit(X_train,y_train)
整理一遍,我們的整個代碼就是這樣的:def?PolynomialLogisticRegression(degree?=?1,C?=?0.1):
return?Pipeline([
('poly',?PolynomialFeatures(degree=degree)),
('std_scaler',?StandardScaler()),
('log_reg',?LogisticRegression(C=C))
])
#?待進行網格搜索的算法
poly_log_reg?=?PolynomialLogisticRegression()
#?準備待搜索的參數列表
C_PARM?=?[0.1,0.2,0.3,0.4,0.5]
param_grid?=?[
{
'poly__degree':?[i?for?i?in?range(1,?11)],
'log_reg__C':?[i?for?i?in?C_PARM]
}
]
#?實例化GridSearchCV進行網格搜索
grid_search?=?GridSearchCV(poly_log_reg,?param_grid)
grid_search.fit(X_train,y_train)
看起來寫了很多,但是自己整理一遍,會發現其實這個語法非常簡單:)
加油!
總結
以上是生活随笔為你收集整理的c语言网格搜索,使用逻辑回归时怎么利用网格搜索来查找degree,c等超参数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【微课堂】汽车软件工程解决方案(现场实录
- 下一篇: 如何统计项目代码行数