请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

GridSearchCV与PipeLine结合使用的疑问

请问波波老师三个问题:
1、我想把GridSearchCV与PipeLine结合起来使用,可以吗?比如pipeline中有2个元素,一个是PCA,一个是RandomForestClassifier,这两个元素需要搜寻的超参数是不相同的,那么总起来放到GridSearchCV中可以吗?如何做?原来我们用GridSearchCV的时候只针对PCA或只针对RandomForestClassifier,现在把两个放在一个pipeline中,是如何玩的?
2、PCA之前是不是不要做StandardScaler?我在网上看到很多人StandardScaler后再PCA,我觉得无法理解。
3、对于我们训练的模型,我们是通过一定的样本得到的,对于新的样本超出了训练样本的范围(也就是我们平时说的外延),是如何处理的?是要把新的样本加入到老的训练样本中,重新训练吗?

正在回答

3回答

1

可以。可以参考这里:http://coding.imooc.com/learn/questiondetail/61679.html


2

应该先 PCA,再做 StandardScaler


3

一些算法支持直接对新样本训练,比如小批量梯度下降法或者随机梯度下降法可以求解的模型。可以回忆一下,所谓的小批量梯度下降法,就是每次处理一小批数据,相应的优化一下模型参数。那么来了一批新数据,也可以这样处理。


当然,随机梯度下降法也ok,随机梯度下降法更极端,每次只处理一个数据:)


还有一些算法,天然支持这个问题。比如 kNN,什么都不用想,把新的数据扔进去就好了。


但是,另外一些算法,必须把新老样本放到一起,重新训练。比如决策树。


整体,这个问题的本质,就是在线学习。在线学习这个课程没有专门涉及。不过如上面所说,其实随机梯度下降法和小批量梯度下降法,是最最基本的在线学习方式。更加复杂的在线学习的方式,可以看一些其他资料。


比如这个 MIT 的课程中所涉及的内容,有兴趣都可以查查看:http://www.mit.edu/~rakhlin/6.883/#schedule


继续加油!:)

0 回复 有任何疑惑可以回复我~
  • 提问者 cjwzhoubo #1
    非常感谢!我已经很明白了!
    回复 有任何疑惑可以回复我~ 2020-03-20 15:04:31
  • 提问者 cjwzhoubo #2
    我终于明白pipeline中每个字典,为什么要给算法取一个别名了,可以在交叉验证中构建参数名了。
    回复 有任何疑惑可以回复我~ 2020-03-20 15:07:15
提问者 cjwzhoubo 2020-03-20 15:11:15

波波老师,希望您持续推出一系列的机器学习/深度学习课程啊,我们如饥似渴啊。当然,能先推出概率论的是最急迫了。线代的课我在听第二遍了!

0 回复 有任何疑惑可以回复我~
提问者 cjwzhoubo 2020-03-20 15:06:08

第一个问题, 我觉得下面的代码更好理解:

sklearn中pipeline的实现,及GridSearchCV寻找最优参数

Pipeline可以将许多算法模型串联起来,比如将特征提取、归一化、分类组织在一起形成一个典型的机器学习问题工作流。主要带来两点好处:

(1)直接调用fit和predict方法来对pipeline中的所有算法模型进行训练和预测。

(2)可以结合grid search对参数进行选择。

如下所示,在models中放置了线性回归,岭回归,Lasso回归,以及弹性网络回归等4个模型。需要注意的是后面三个后置的cv表示其附带有交叉验证过程,参数的变化范围是alphas的值。弹性网络额外包含一个l1_ratio为L1正则项的权重,l2正则项的权重为1-l1_ratio.

一个pipeline中一般包含标准化、多项式拓展、以及回归算法几个部分。

models = [

    Pipeline([

            ('Poly', PolynomialFeatures(include_bias=False)),

            ('Linear', LinearRegression(fit_intercept=False))

        ]),

    Pipeline([

            ('Poly', PolynomialFeatures(include_bias=False)),

            # alpha给定的是Ridge算法中,L2正则项的权重值,也就是ppt中的兰姆达

            # alphas是给定CV交叉验证过程中,Ridge算法的alpha参数值的取值的范围

            ('Linear', RidgeCV(alphas=np.logspace(-3,2,50), fit_intercept=False))

        ]),

    Pipeline([

            ('Poly', PolynomialFeatures(include_bias=False)),

            ('Linear', LassoCV(alphas=np.logspace(0,1,10), fit_intercept=False))

        ]),

    Pipeline([

            ('Poly', PolynomialFeatures(include_bias=False)),

            # la_ratio:给定EN算法中L1正则项在整个惩罚项中的比例,这里给定的是一个列表;

            # 表示的是在CV交叉验证的过程中,EN算法L1正则项的权重比例的可选值的范围

            ('Linear', ElasticNetCV(alphas=np.logspace(0,1,10), l1_ratio=[.1, .5, .7, .9, .95, 1], fit_intercept=False))

        ])

]

其参数可以单独设置,比如:

models[1].set_params(Poly__degree=2)#这便是给models第二个岭回归中的‘Poly’,设置一个degree参数,值为2.

同样其参数值也可以获取:

lin = model[2].get_params(‘Linear’)[‘Linear’]#这里便是从第三个Lasso回归中Linear的数据

 

更为常用的方式是通过网格搜索来寻找最适合的参数

from sklearn.linear_model import LinearRegression, LassoCV, RidgeCV, ElasticNetCV

from sklearn.pipeline import Pipeline

from sklearn.model_selection import train_test_split

from sklearn.preprocessing import StandardScaler

from sklearn.model_selection import GridSearchCV

#岭回归和Lasso回归两个

models = [

    Pipeline([

            ('poly', PolynomialFeatures()),

            ('ss', StandardScaler()),

            ('linear', RidgeCV(alphas=np.logspace(-3,1,20)))

        ]),

    Pipeline([

            ('poly', PolynomialFeatures()),

            ('ss', StandardScaler()),

            ('linear', LassoCV(alphas=np.logspace(-3,1,20)))

        ])

# 参数字典, 字典中的key是属性的名称,value是可选的参数列表,需要注意下划线是两个

parameters = {

    "poly__degree": [3,2,1], 

    "poly__interaction_only": [True, False],#不产生交互项,如X1*X1 

    "poly__include_bias": [True, False],#多项式幂为零的特征作为线性模型中的截距

    "linear__fit_intercept": [True, False]

}

# 获取模型并设置参数

# GridSearchCV: 进行交叉验证,选择出最优的参数值出来

# 第一个输入参数:进行参数选择的模型,

 # param_grid: 用于进行模型选择的参数字段,要求是字典类型;cv: 进行几折交叉验证

 model = GridSearchCV(models[0], param_grid=parameters,cv=5, n_jobs=1)#五折交叉验证

  # 模型训练-网格搜索

 model.fit(x_train, y_train)

 

 y_predict = model.predict(x_test)

 print(model.best_score_)

GridSearchCV是用交叉验证选出最优参数,其中第一个参数是pipeline,第二个参数param_grid是关于参数多个选择的字典;第三个参数cv是交叉验证的折数(例如5折交叉验证(5-fold cross validation),将数据集分成5份,轮流将其中4份做训练1份做验证,5次的结果的均值作为对算法精度的估计)


0 回复 有任何疑惑可以回复我~
  • 感谢分享!:)
    回复 有任何疑惑可以回复我~ 2020-03-20 15:17:54
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信