Как получить кривую ROC для дерева решений?

Я пытаюсь найти кривую ROC и AUROC для дерева решений. Мой код был что-то вроде

clf.fit(x,y)
y_score = clf.fit(x,y).decision_function(test[col])
pred = clf.predict_proba(test[col])
print(sklearn.metrics.roc_auc_score(actual,y_score))
fpr,tpr,thre = sklearn.metrics.roc_curve(actual,y_score)

выход:

 Error()
'DecisionTreeClassifier' object has no attribute 'decision_function'

в основном ошибка появляется при поиске y_score, Пожалуйста, объясните, что это такое y_score и как решить эту проблему?

2 ответа

Решение

Прежде всего, DecisionTreeClassifier не имеет атрибута decision_function,

Если я предполагаю из структуры вашего кода, вы видели этот пример

В этом случае классификатор - это не дерево решений, а OneVsRestClassifier, который поддерживает метод solution_function.

Вы можете увидеть доступные атрибуты DecisionTreeClassifier Вот

Возможный способ сделать это состоит в том, чтобы преобразовать классы в двоичную форму и затем вычислить auc для каждого класса:

Пример:

from sklearn.metrics import roc_curve, auc
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import label_binarize
from sklearn.tree import DecisionTreeClassifier
from scipy import interp


iris = datasets.load_iris()
X = iris.data
y = iris.target

y = label_binarize(y, classes=[0, 1, 2])
n_classes = y.shape[1]

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

classifier = DecisionTreeClassifier()

y_score = classifier.fit(X_train, y_train).predict(X_test)

fpr = dict()
tpr = dict()
roc_auc = dict()
for i in range(n_classes):
    fpr[i], tpr[i], _ = roc_curve(y_test[:, i], y_score[:, i])
    roc_auc[i] = auc(fpr[i], tpr[i])

# Compute micro-average ROC curve and ROC area
fpr["micro"], tpr["micro"], _ = roc_curve(y_test.ravel(), y_score.ravel())
roc_auc["micro"] = auc(fpr["micro"], tpr["micro"])

#ROC curve for a specific class here for the class 2
roc_auc[2]

Результат

0.94852941176470573

Подумайте, что для дерева решений вы можете использовать.predict_proba() вместо.decision_function(), чтобы вы получили что-то, как показано ниже:

y_score = classifier.fit(X_train, y_train).predict_proba(X_test)

Тогда остальная часть кода будет такой же. Фактически, функция roc_curve из scikit learn может принимать два типа входных данных: "Целевые оценки могут быть оценками вероятности положительного класса, доверительными значениями или мерой решения без пороговых значений (как возвращено параметром Solution_function в некоторых классификаторах).) ". Смотрите здесь для более подробной информации.

Другие вопросы по тегам