能否在scikit-learn Pipeline中直接用ravel()/to_numpy()转换目标变量?
在scikit-learn Pipeline内处理目标变量的形状问题
可以在Pipeline内完成目标变量的转换,推荐两种实用方案:
方法一:用TransformedTargetClassifier包裹模型与目标转换器
这个类专门用于对目标变量应用转换,完全适配你的场景。先定义一个将列向量转成1维数组的函数,再用FunctionTransformer包装它,最后和逻辑回归模型组合:
from sklearn.pipeline import Pipeline from sklearn.linear_model import LogisticRegression from sklearn.compose import TransformedTargetClassifier from sklearn.preprocessing import FunctionTransformer # 定义转换函数:自动识别并转换DataFrame列/二维数组为1维数组 def flatten_target(y): return y.values.ravel() if hasattr(y, 'values') else y.ravel() # 创建目标转换器 y_transformer = FunctionTransformer(flatten_target) # 组合模型与转换器 log_reg_pipe = TransformedTargetClassifier( estimator=LogisticRegression(), transformer=y_transformer ) # 训练并评估 log_reg_pipe.fit(X_train, y_train).score(X_val, y_val)
方法二:自定义逻辑回归估计器,自动处理y的形状
如果不想额外引入TransformedTargetClassifier,可以直接继承LogisticRegression,重写fit方法来自动处理目标变量的形状:
from sklearn.pipeline import Pipeline from sklearn.linear_model import LogisticRegression class LogRegWithFlattenY(LogisticRegression): def fit(self, X, y, sample_weight=None): # 自动转换y为1维数组 y = y.values.ravel() if hasattr(y, 'values') else y.ravel() # 调用父类的fit方法完成训练 return super().fit(X, y, sample_weight=sample_weight) # 构建Pipeline log_reg_pipe = Pipeline([ ('log_reg', LogRegWithFlattenY()) ]) # 训练并评估 log_reg_pipe.fit(X_train, y_train).score(X_val, y_val)
两种方案都能在模型训练流程内部完成目标变量的形状转换,无需提前手动处理y_train。
内容的提问来源于stack exchange,提问作者JonasEngstrom
相关产品推荐
相关产品推荐

