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

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

直接调用fit和predict方法来对pipeline中的所有算法模型进行训练和预测。
可以结合grid search对参数进行选择。
如下所示,在models中放置了线性回归,岭回归,Lasso回归,以及弹性网络回归四个模型。需要注意的是后面三个后置的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([
            ('ss', StandardScaler()),
            ('poly', PolynomialFeatures()),
            ('linear', RidgeCV(alphas=np.logspace(-3,1,20)))
        ]),
    Pipeline([
            ('ss', StandardScaler()),
            ('poly', PolynomialFeatures()),
            ('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次的结果的均值作为对算法精度的估计)

发布了23 篇原创文章 · 获赞 6 · 访问量 4679

猜你喜欢

转载自blog.csdn.net/qq_34211618/article/details/103685975