Ошибка ключа: «ключ типа кортеж не найден и не является многоиндексным»

#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)
 

Чтобы получить ожидаемый сюжет.