能否用Sklearn单Pipeline同时转换数据、标签并完成特征选择?
问题解答
不能直接用scikit-learn的标准Pipeline组件实现该流程,因为标准Pipeline仅负责按顺序处理特征矩阵X,无法自动对标签y执行编码并将编码后的标签传递给需要依赖标签的特征选择步骤(RFE)。
解决方案
通过自定义一个整合标签序数编码与逻辑回归的分类器,将其作为RFE的评估器,再结合X的预处理流程构建单个Pipeline,即可满足你的调用需求。
完整代码实现
import numpy as np from sklearn.base import BaseEstimator, ClassifierMixin from sklearn.pipeline import Pipeline from sklearn.impute import SimpleImputer from sklearn.preprocessing import StandardScaler, OrdinalEncoder from sklearn.linear_model import LogisticRegression from sklearn.feature_selection import RFE # 自定义整合标签编码与逻辑回归的分类器 class EncodedLogisticRegression(BaseEstimator, ClassifierMixin): def __init__(self): self.encoder = OrdinalEncoder() self.clf = LogisticRegression() def fit(self, X, y): # 对字符串标签执行序数编码 y_encoded = self.encoder.fit_transform(y.reshape(-1, 1)).ravel() self.clf.fit(X, y_encoded) return self def predict(self, X): return self.clf.predict(X) def predict_proba(self, X): return self.clf.predict_proba(X) def score(self, X, y): y_encoded = self.encoder.transform(y.reshape(-1, 1)).ravel() return self.clf.score(X, y_encoded) @property def coef_(self): return self.clf.coef_ # 构建目标Pipeline pipe = Pipeline([ ('preprocessing', Pipeline([ ('imputer', SimpleImputer(strategy='mean')), ('scaler', StandardScaler()) ])), ('rfe', RFE(estimator=EncodedLogisticRegression(), n_features_to_select=2)) ]) # 调用示例(假设X、y已定义) # important_matrix = pipe.fit_transform(X, y)
流程说明
- 预处理阶段:先对
X执行均值填充缺失值,再做标准化处理; - 特征选择阶段:RFE使用自定义的
EncodedLogisticRegression作为评估器,该评估器会在拟合时自动将字符串标签y编码为数值型,再训练逻辑回归模型,最终筛选出2个最重要的特征。
内容的提问来源于stack exchange,提问作者HARSHIL PANDEY
相关产品推荐
相关产品推荐

