我构建了一个管道,该管道采用了已被分为类别和数字列的熊猫数据框。我试图在结果上运行GridSearchCV,并最终查看GridSearchCV选择的最佳性能模型的重要性排名。我遇到的问题是sklearn管道输出numpy数组对象,并在此过程中丢失任何列信息。因此,当我去检查模型中最重要的系数时,会留下一个未标记的numpy数组。
我已经读到,构建自定义转换器可能是解决此问题的一种方法,但我本人没有任何这样做的经验。我还研究了利用sklearn-pandas软件包的方法,但是我很犹豫尝试实现一些可能无法与sklearn并行更新的内容。任何人都可以提出他们认为是解决此问题的最佳途径的建议吗?我也欢迎任何涉及熊猫和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_
以下是在海洋“ 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和其他方法后检索派生的列名。