scikit-learn Pipeline管道能否支持多输出标签的训练拟合?
问题解决方法
报错原因
默认的LogisticRegression仅支持单标签分类任务,要求输入的标签y为一维数组,你传入的3列二维数组属于多输出/多标签的标签格式,与默认逻辑回归的输入要求不匹配,因此触发报错。
对应解决方案
根据你的标签类型选择对应修改方式:
情况1:3列是单标签多分类的one-hot编码(每个样本仅属于3个类别中的一个)
你需要先将one-hot格式的二维标签转换为一维的类别标签,修改y的取值逻辑即可:
import numpy as np X = newDf.iloc[:, 0:10].values # 取one-hot编码最大值的下标,转换为1维类别标签 y = np.argmax(newDf.iloc[:, 10:13].values, axis=1) X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=1) pipe_lr = make_pipeline(StandardScaler(), PCA(n_components=2), LogisticRegression(random_state=1, solver='lbfgs')) pipe_lr.fit(X_train, y_train)
情况2:3列是多标签任务(每个样本可同时命中多个标签)
这种情况不需要修改y的格式,只需要用MultiOutputClassifier封装LogisticRegression,让模型支持多输出训练即可,修改管道定义部分:
from sklearn.multioutput import MultiOutputClassifier X = newDf.iloc[:, 0:10].values y = newDf.iloc[:, 10:13].values X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=1) pipe_lr = make_pipeline(StandardScaler(), PCA(n_components=2), # 封装逻辑回归为多输出模型 MultiOutputClassifier(LogisticRegression(random_state=1, solver='lbfgs'))) pipe_lr.fit(X_train, y_train)
注意事项
如果是多标签任务,后续模型评估需要使用适配多标签的指标,例如计算F1值时需要指定average参数为micro/macro,不能直接使用单分类的默认评估逻辑。
内容的提问来源于stack exchange,提问作者Umberto Tessitore
相关产品推荐
相关产品推荐

