使用OutputCodeClassifier调用predict_proba()时遇AttributeError问题求助
我在使用多分类器时,调用predict_proba()方法遇到如下错误:
AttributeError: 'OutputCodeClassifier' object has no attribute 'predict_proba'
我查了scikit-learn的文档,看到MultiOutputClassifier支持predict_proba()方法,但实际调用时还是出了上面的错。我写的代码如下:
X_train_logregr, X_test_logregr, y_train_logregr, y_test_logregr = train_test_split(X_train, y_train, test_size = 0.3, random_state=42) scaler_logregr = StandardScaler() X_train_scaled_logregr = scaler_logregr.fit_transform(X_train_logregr) X_test_scaled_logregr = scaler_logregr.transform(X_test_logregr) logreg = LogisticRegression() output = OutputCodeClassifier(logreg) output.fit(X_train_scaled_logregr, y_train_logregr) y_pred = output.predict(X_test_scaled_logregr) y_pred_proba = output.predict_proba(X_test_scaled_logregr)
运行后依旧报错:
AttributeError: 'OutputCodeClassifier' object has no attribute 'predict_proba'
问题根源:你搞混了
OutputCodeClassifier和MultiOutputClassifier。scikit-learn里,MultiOutputClassifier确实支持predict_proba(),但OutputCodeClassifier是单标签多分类的编码策略工具,它本身没实现predict_proba()方法,这是官方设计的限制。办法1:换成MultiOutputClassifier(多标签任务用)
如果你的任务是多标签分类(一个样本可以属于多个类别),直接把OutputCodeClassifier换成MultiOutputClassifier就行:from sklearn.multioutput import MultiOutputClassifier logreg = LogisticRegression() output = MultiOutputClassifier(logreg) output.fit(X_train_scaled_logregr, y_train_logregr) y_pred_proba = output.predict_proba(X_test_scaled_logregr)办法2:自己算概率(单标签多分类且必须用OutputCodeClassifier)
如果你是单标签多分类场景,且一定要用OutputCodeClassifier,可以通过它内部的二分类器概率来推导最终类别概率:OutputCodeClassifier会训练多个二分类器对应编码位,你可以拿到每个分类器的概率,再结合编码矩阵计算类别概率。示例代码:import numpy as np # 获取所有基分类器的正类概率 base_probs = [] for clf in output.estimators_: prob = clf.predict_proba(X_test_scaled_logregr) base_probs.append(prob[:, 1]) base_probs = np.array(base_probs).T # 结合编码矩阵计算类别概率(用点积近似,之后归一化) code_matrix = output.code_book_ class_probs = np.dot(base_probs, code_matrix.T) # 把结果归一到0-1区间 class_probs = (class_probs - class_probs.min(axis=1, keepdims=True)) / (class_probs.max(axis=1, keepdims=True) - class_probs.min(axis=1, keepdims=True))注意:这种是近似计算,不是官方支持的概率输出,结果可靠性需要自己验证。
内容的提问来源于stack exchange,提问作者Rasaa

