从 sklearn 中的 Pipeline 对象返回系数

Posted

技术标签:

【中文标题】从 sklearn 中的 Pipeline 对象返回系数【英文标题】:return coefficients from Pipeline object in sklearn 【发布时间】:2017-10-06 23:10:36 【问题描述】:

我已经用RandomizedSearchCV 拟合了Pipeline 对象

pipe_sgd = Pipeline([('scl', StandardScaler()),
                    ('clf', SGDClassifier(n_jobs=-1))])

param_dist_sgd = 'clf__loss': ['log'],
                 'clf__penalty': [None, 'l1', 'l2', 'elasticnet'],
                 'clf__alpha': np.linspace(0.15, 0.35),
                 'clf__n_iter': [3, 5, 7]

sgd_randomized_pipe = RandomizedSearchCV(estimator = pipe_sgd, 
                                         param_distributions=param_dist_sgd, 
                                         cv=3, n_iter=30, n_jobs=-1)

sgd_randomized_pipe.fit(X_train, y_train)

我想访问best_estimator_coef_ 属性,但我做不到。我尝试使用以下代码访问coef_

sgd_randomized_pipe.best_estimator_.coef_

但是我得到以下 AttributeError...

AttributeError: 'Pipeline' 对象没有属性 'coef_'

scikit-learn 文档说coef_SGDClassifier 的一个属性,它是我的base_estimator_ 的类。

我做错了什么?

【问题讨论】:

【参考方案1】:

在使用named_steps dict 创建管道时,您始终可以使用分配给它们的名称。

scaler = sgd_randomized_pipe.best_estimator_.named_steps['scl']
classifier = sgd_randomized_pipe.best_estimator_.named_steps['clf']

然后访问所有属性,如coef_intercept_ 等,这些属性可用于相应的拟合估计器。

这是流水线公开的正式属性specified in the documentation:

named_steps:字典

只读属性,通过用户名访问任何步骤参数。键是步骤名称,值是步骤参数。

【讨论】:

【参考方案2】:

我认为这应该可行:

sgd_randomized_pipe.named_steps['clf'].coef_

【讨论】:

【参考方案3】:

我发现一种方法是使用steps 属性进行链接索引...

sgd_randomized_pipe.best_estimator_.steps[1][1].coef_

这是最佳做法,还是有其他方法?

【讨论】:

首选上述named_steps方法 这在将make_pipeline 与许多不同的分类器一起使用时效果很好!

以上是关于从 sklearn 中的 Pipeline 对象返回系数的主要内容,如果未能解决你的问题,请参考以下文章

sklearn.pipeline.Pileline

使用 sklearn Pipeline 中的索引提取子管道时出错

如何将 SHAP 与 sklearn 中的线性 SVC 模型一起使用 Pipeline?

使用sklearn Pipeline中的索引提取子管道时出错。

机器学习- Sklearn (交叉验证和Pipeline)

Sklearn ColumnTransformer + Pipeline = TypeError