Кривая ROC для классификации нескольких классов без одного против всех в питоне - PullRequest
0 голосов
/ 04 июня 2019

У меня есть проблема классификации нескольких классов с 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: формат с несколькими метками не поддерживается

Как это можно уладить? Я скучаю по какой-то важной концепции?

1 Ответ

0 голосов
/ 04 июня 2019

ROC (кривая рабочих характеристик приемника) формируется из графика истинных положительных и ложных положительных результатов от двоичного классификатора.

Область под кривой дает представление о точности для двоичного классификатора.

Для задач мультикласса вы можете найти точность, но это может ввести в заблуждение, если ваши данные имеют тенденцию неравномерно распределяться по категориям.Соответствующая выборка может преодолеть это.

Используемое AdaBoostClassifier даст вам score, показывающее среднюю точность.

...