我有9个不同类别的多类别分类问题。我正在使用scikit-learn的AdaBoostClassifier
类,使用“单项技术”和“所有技术”来训练我的模型而无需,因为类的数量非常多,效率可能很低。
我已经尝试使用scikit学习[1]中的文档中的技巧,但是这里使用了一种vs all技术,这是本质上的不同。在我的方法中,每个事件只能得到一个预测,即,如果我有n个类别,则预测的结果是n个类别中的单个值。另一方面,对于“单项还是全部”方法,预测的结果是大小为n的数组,每类具有某种可能性值。
代码是:
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格式
如何解决?我是否缺少一些重要的概念?
答案 0 :(得分:0)
ROC(接收器工作特性曲线)由二元分类器的正阳性和负阳性图组成。
曲线下的区域表示二进制分类器的准确性。
对于多类问题,您可以找到准确性,但是如果您的数据倾向于不均匀地归入类别,则可能会产生误导。适当的采样可以克服这一问题。
您使用的AdaBoostClassifier
会给您score
,显示平均准确度。