在Python中没有一个vs全部的多类分类的ROC曲线

时间:2019-06-04 08:37:00

标签: python scikit-learn multiclass-classification

我有9个不同类别的多类别分类问题。我正在使用scikit-learn的AdaBoostClassifier类,使用“单项技术”和“所有技术”来训练我的模型而无需,因为类的数量非常多,效率可能很低。

我已经尝试使用scikit学习[1]中的文档中的技巧,但是这里使用了一种vs all技术,这是本质上的不同。在我的方法中,每个事件只能得到一个预测,即,如果我有n个类别,则预测的结果是n个类别中的单个值。另一方面,对于“单项还是全部”方法,预测的结果是大小为n的数组,每类具有某种可能性值。

[1] https://scikit-learn.org/stable/auto_examples/model_selection/plot_roc.html#sphx-glr-auto-examples-model-selection-plot-roc-py

代码是:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt # Matplotlib plotting library for basic visualisation
%matplotlib inline

from sklearn.model_selection import train_test_split 
from sklearn.ensemble import AdaBoostClassifier
from sklearn.metrics import accuracy_score
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import roc_curve, auc
from sklearn import preprocessing


# Read data
df = pd.read_pickle('data.pkl')

# Create the dependent variable class
# This will substitute each of the n classes from 
# text to number
factor = pd.factorize(df['target_var'])
df.target_var= factor[0]
definitions = factor[1]

X = df.drop('target_var', axis=1)
y = df['target_var]

X_train, X_test, y_train, y_test = train_test_split(X, y, random_state = 0)

bdt_clf = AdaBoostClassifier(
    DecisionTreeClassifier(max_depth=2),
    n_estimators=250,
    learning_rate=0.3)

bdt_clf.fit(X_train, y_train)

y_pred = bdt_clf.predict(X_test)

#Reverse factorize (converting y_pred from 0s,1s, 2s, etc. to their original values
reversefactor = dict(zip(range(9),definitions))
y_test_rev = np.vectorize(reversefactor.get)(y_test)
y_pred_rev = np.vectorize(reversefactor.get)(y_pred)

我直接尝试了roc曲线函数,还对标签进行了二值化处理,但是我总是收到相同的错误消息。

def multiclass_roc_auc(y_test, y_pred):
    lb = preprocessing.LabelBinarizer()
    lb.fit(y_test)
    y_test = lb.transform(y_test)
    y_pred = lb.transform(y_pred)
    return roc_curve(y_test, y_pred)

multiclass_roc_auc(y_test, y_pred_test)

错误消息是:

  

ValueError:不支持multilabel-indicator格式

如何解决?我是否缺少一些重要的概念?

1 个答案:

答案 0 :(得分:0)

ROC(接收器工作特性曲线)由二元分类器的正阳性和负阳性图组成。

曲线下的区域表示二进制分类器的准确性。

对于多类问题,您可以找到准确性,但是如果您的数据倾向于不均匀地归入类别,则可能会产生误导。适当的采样可以克服这一问题。

您使用的AdaBoostClassifier会给您score,显示平均准确度。