#python #machine-learning #scikit-learn
Вопрос:
Я хочу построить кривую ROC для классификатора дерева решений. Мой код вызывает key of type tuple not found and not a MultiIndex
ошибку.
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics import roc_curve, auc
from sklearn.dummy import DummyClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
import pandas as pd
# Load the Fake news dataset
df_fake = pd.read_csv("C:/Users/User/Downloads/Fake.csv")
# Load the True news dataset
df_true = pd.read_csv("C:/Users/User/Downloads/True.csv")
# Set fake as 1 and true as 0
df_true["class"] = 0
df_fake["class"] = 1
# Concatenate true and fake datasets
df = pd.concat([df_fake, df_true])
# Sanity check
print(f'N rows={len(df)}, M columns={len(df.columns)}')
df.head()
Фрейм данных
df.head()
Название | текст | предмет | Дата | класс | |
---|---|---|---|---|---|
0 | Дональд Трамп Посылает Смущающий Новый Год»… | Дональд Трамп просто не мог пожелать этого всем американцам … | Новости | 31 декабря 2017 | 1 |
1 | Пьяный Хвастливый Сотрудник Трампа Начал По-Русски … | Председатель Комитета Палаты представителей по разведке Девин Ну… | Новости | 31 декабря 2017 | 1 |
2 | Шериф Дэвид Кларк Становится Интернет — Шуткой… | В пятницу стало известно, что бывший Милуок… | Новости | 31 декабря 2017 | 1 |
3 | Трамп Настолько Одержим, Что У Него Даже Есть Имя Обамы… | В день Рождества Дональд Трамп объявил об этом … | Новости | 31 декабря 2017 | 1 |
4 | Папа Франциск Только Что Вызвал Дональда Трампа… | Папа Франциск использовал свое ежегодное рождественское мессу… | Новости | 31 декабря 2017 | 1 |
# Extract title column in Tf-IDf
X = TfidfVectorizer(stop_words='english', max_features=50).fit_transform(df['title'])
N, M = X.shape
# Dataframe info
y = df["class"]
# Divide dataset into a separate training dataset (80%) and test dataset (20%)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.20, stratify=y, random_state=1)
# Baseline classification
dummy_clf = DummyClassifier(strategy="most_frequent")
dummy_clf.fit(X, y)
dummy_clf.predict(X)
dummy_clf.score(X, y)
def plot_roc(y_score):
fpr = {}
tpr = {}
roc_auc = {}
for i in range(M):
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"])
return roc_auc[1]
# Decision tree using the "gini" criterion
dt_gini = DecisionTreeClassifier(criterion="gini", random_state=0)
dt_gini_score = dt_gini.fit(X_train, y_train).predict(X_test)
plot_roc(dt_gini_score)
Обратная связь
> Traceback (most recent call last): File
> "C:/Users/User/PycharmProjects/Applied ML/Mod4.py", line 62, in
> <module>
> plot_roc(dt_gini_score) File "C:/Users/User/PycharmProjects/Applied ML/Mod4.py", line 49, in
> plot_roc
> fpr[i], tpr[i], _ = roc_curve(y_test[:, i], y_score[:, i]) File "C:UsersUserPycharmProjectsApplied
> MLvenvlibsite-packagespandascoreseries.py", line 966, in
> __getitem__
> return self._get_with(key) File "C:UsersUserPycharmProjectsApplied
> MLvenvlibsite-packagespandascoreseries.py", line 981, in
> _get_with
> return self._get_values_tuple(key) File "C:UsersUserPycharmProjectsApplied
> MLvenvlibsite-packagespandascoreseries.py", line 1016, in
> _get_values_tuple
> raise KeyError("key of type tuple not found and not a MultiIndex") KeyError: 'key of type tuple not found and not a MultiIndex'
>
> Process finished with exit code 1
Комментарии:
1. Вы можете попробовать это вместо
roc_auc
того, чтобы вручную заполнять цикл. scikit-learn.org/stable/modules/generated/…2. @tanmay2893
dt_gini = DecisionTreeClassifier(criterion="gini", random_state=0).fit(X_train, y_train).predict(X_test) dt_gini_score = roc_auc_score(y_test, dt_gini) plot_roc(dt_gini_score)
все еще вызывает'key of type tuple not found and not a MultiIndex'
ошибку.
Ответ №1:
Мы можем переписать plot_roc
функцию следующим образом (я попробовал ее с набором данных игрушек, представленным в вопросе) :
from sklearn import metrics
from matplotlib import pyplot as plt
def plot_roc(y_test, y_score):
fpr = dict()
tpr = dict()
roc_auc = dict()
# Compute micro-average ROC curve and ROC area
fpr["micro"], tpr["micro"], _ = metrics.roc_curve(y_test.ravel(), y_score.ravel())
roc_auc["micro"] = metrics.auc(fpr["micro"], tpr["micro"])
plt.figure()
lw = 2
plt.plot(fpr["micro"], tpr["micro"], color='darkorange',
lw=lw, label='ROC curve (area = %0.2f)' % roc_auc["micro"])
plt.plot([0, 1], [0, 1], color='navy', lw=lw, linestyle='--')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Receiver operating characteristic example')
plt.legend(loc="lower right")
plt.show()
И мы называем это именно так :
plot_roc(y_test, dt_gini_score)
Чтобы получить ожидаемый сюжет.