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)

看起来写了很多,但是自己整理一遍,会发现其实这个语法非常简单:)

加油!

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值