第一个问题, 我觉得下面的代码更好理解:
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次的结果的均值作为对算法精度的估计)