【发布时间】:2019-06-06 14:26:43
【问题描述】:
我构建了一个管道,该管道采用已拆分为分类和数字列的 pandas 数据框。我正在尝试在我的结果上运行 GridSearchCV,并最终查看 GridSearchCV 选择的最佳性能模型的重要性排名特征。我遇到的问题是 sklearn 管道输出 numpy 数组对象并在此过程中丢失任何列信息。因此,当我去检查模型中最重要的系数时,我留下了一个未标记的 numpy 数组。
我已阅读到构建自定义转换器可能是解决此问题的一种可能,但我自己没有任何经验。我也研究过利用 sklearn-pandas 包,但我犹豫是否尝试实现一些可能不会与 sklearn 并行更新的东西。任何人都可以建议他们认为解决此问题的最佳途径吗?我也对任何涉及 pandas 和 sklearn 管道应用的文献持开放态度。
我的管道:
# impute and standardize numeric data
numeric_transformer = Pipeline([
('impute', SimpleImputer(missing_values=np.nan, strategy="mean")),
('scale', StandardScaler())
])
# impute and encode dummy variables for categorical data
categorical_transformer = Pipeline([
('impute', SimpleImputer(missing_values=np.nan, strategy="most_frequent")),
('one_hot', OneHotEncoder(sparse=False, handle_unknown='ignore'))
])
preprocessor = ColumnTransformer(transformers=[
('num', numeric_transformer, numeric_features),
('cat', categorical_transformer, categorical_features)
])
clf = Pipeline([
('transform', preprocessor),
('ridge', Ridge())
])
交叉验证:
kf = KFold(n_splits=4, shuffle=True, random_state=44)
cross_val_score(clf, X_train, y_train, cv=kf).mean()
网格搜索:
param_grid = {
'ridge__alpha': [.001, .1, 1.0, 5, 10, 100]
}
gs = GridSearchCV(clf, param_grid, cv = kf)
gs.fit(X_train, y_train)
检查系数:
model = gs.best_estimator_
predictions = model.fit(X_train, y_train).predict(X_test)
model.named_steps['ridge'].coef_
这是在 seaborn "mpg" 数据集上执行时模型系数的输出:
array([-4.64782052e-01, 1.47805207e+00, -3.28948689e-01, -5.37033173e+00,
2.80000700e-01, 2.71523808e+00, 6.29170887e-01, 9.51627968e-01,
...
-1.50574860e+00, 1.88477450e+00, 4.57285471e+00, -6.90459868e-01,
5.49416409e+00])
理想情况下,我想保留 pandas 数据框信息并在调用 OneHotEncoder 和其他方法后检索派生列名。
【问题讨论】:
-
this 可能有帮助
-
难道不能直接把输入传给管道的'transform'层,然后从那里得到'ridge'层的输入(X_train_transf)对应的列名吗?当使用@ sklearn 中的 987654327@ 类,
.coef数组存储拟合模型的系数并保留顺序,因此如果您知道列名,您可以将它们映射到“未标记”数组:param_coef_df = pd.DataFrame({'feature':X_train_transf.columns, 'coefficient': model.named_steps['ridge'].coef_})、param_coef_df = param_coef_df.sort_values(by='coefficient') -
@JacoSolari 您介意将该评论转换为显示工作示例的答案吗?
-
@JacoSolari 我已经有一段时间没有重新审视这个问题了,但是在我自己的工作中,我已经在我的代码中实现了相同的逻辑,将转换后的系数名称组合到 pandas 数据帧中。我相信在处理管道时必须将每个单独的转换称为命名步骤仍然存在限制。如果 ColumnTransformer.get_feature_names 方法支持管道,那就太好了,但目前还不支持。
-
@lurscher 我添加了一个答案,如果它适合您的需要,请告诉我。
标签: python pandas scikit-learn