У меня есть проблема классификации нескольких классов с 9 различными классами. Я использую класс AdaBoostClassifier
из scikit-learn для обучения моей модели без , используя технику «один против всех», поскольку количество классов очень велико и может быть неэффективным.
Я попытался использовать подсказки из документации в scikit learn [1], но там используется метод «один против всех», который существенно отличается. В моем подходе я получаю только одно предсказание на событие, т. Е. Если у меня есть n классов, результатом предсказания является одно значение в пределах n классов. Для подхода «один против всех», с другой стороны, результатом предсказания является массив размера n со своего рода значением вероятности на класс.
[1]
https://scikit -learn.org / стабильный / auto_examples / model_selection / plot_roc.html # sphx-GLR-авто-примеры-модель выбора-сюжетно-Рух-ру
Код:
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: формат с несколькими метками не поддерживается
Как это можно уладить? Я скучаю по какой-то важной концепции?