GridSearchCV与PipeLine结合使用的疑问
来源:8-2 scikit-learn中的多项式回归与Pipeline

cjwzhoubo
2020-03-20
请问波波老师三个问题:
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
继续加油!:)
022020-03-20 -
cjwzhoubo
提问者
2020-03-20
波波老师,希望您持续推出一系列的机器学习/深度学习课程啊,我们如饥似渴啊。当然,能先推出概率论的是最急迫了。线代的课我在听第二遍了!
00 -
cjwzhoubo
提问者
2020-03-20
第一个问题, 我觉得下面的代码更好理解:
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次的结果的均值作为对算法精度的估计)
012020-03-20
相似问题