大家好,欢迎来到IT知识分享网。
非常好的问题。如何将自定义的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)
看起来写了很多,但是自己整理一遍,会发现其实这个语法非常简单:)
加油!
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/14556.html