Sci-kit научиться печатать этикетки для матрицы путаницы? - PullRequest
0 голосов
/ 14 мая 2018

Поэтому я использую sci-kit научиться классифицировать некоторые данные. У меня есть 13 различных значений классов / категорий для классификации данных. Теперь я смог использовать перекрестную проверку и распечатать матрицу путаницы Тем не менее, он показывает только TP и FP и т. Д. Без меток классов, поэтому я не знаю, что это за класс. Ниже мой код и мой вывод:

def classify_data(df, feature_cols, file):
    nbr_folds = 5
    RANDOM_STATE = 0
    attributes = df.loc[:, feature_cols]  # Also known as x
    class_label = df['task']  # Class label, also known as y.
    file.write("\nFeatures used: ")
    for feature in feature_cols:
        file.write(feature + ",")
    print("Features used", feature_cols)

    sampler = RandomOverSampler(random_state=RANDOM_STATE)
    print("RandomForest")
    file.write("\nRandomForest")
    rfc = RandomForestClassifier(max_depth=2, random_state=RANDOM_STATE)
    pipeline = make_pipeline(sampler, rfc)
    class_label_predicted = cross_val_predict(pipeline, attributes, class_label, cv=nbr_folds)
    conf_mat = confusion_matrix(class_label, class_label_predicted)
    print(conf_mat)
    accuracy = accuracy_score(class_label, class_label_predicted)
    print("Rows classified: " + str(len(class_label_predicted)))
    print("Accuracy: {0:.3f}%\n".format(accuracy * 100))
    file.write("\nClassifier settings:" + str(pipeline) + "\n")
    file.write("\nRows classified: " + str(len(class_label_predicted)))
    file.write("\nAccuracy: {0:.3f}%\n".format(accuracy * 100))
    file.writelines('\t'.join(str(j) for j in i) + '\n' for i in conf_mat)

#Output
Rows classified: 23504
Accuracy: 17.925%
0   372 46  88  5   73  0   536 44  317 0   200 127
0   501 29  85  0   136 0   655 9   154 0   172 67
0   97  141 78  1   56  0   336 37  429 0   435 198
0   135 74  416 5   37  0   507 19  323 0   128 164
0   247 72  145 12  64  0   424 21  296 0   304 223
0   190 41  36  0   178 0   984 29  196 0   111 43
0   218 13  71  7   52  0   917 139 177 0   111 103
0   215 30  84  3   71  0   1175    11  55  0   102 62
0   257 55  156 1   13  0   322 184 463 0   197 160
0   188 36  104 2   34  0   313 99  827 0   69  136
0   281 80  111 22  16  0   494 19  261 0   313 211
0   207 66  87  18  58  0   489 23  157 0   464 239
0   113 114 44  6   51  0   389 30  408 0   338 315

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

Есть ли способ печати этикеток?

Ответы [ 4 ]

0 голосов
/ 14 мая 2018

Важно убедиться, что способ, которым вы помечаете строки и столбцы матрицы путаницы, точно соответствует способу, которым sklearn закодировал классы.Истинный порядок меток можно узнать с помощью атрибута .classes_ классификатора.Вы можете использовать приведенный ниже код для подготовки фрейма данных путаницы.

labels = rfc.classes_
conf_df = pd.DataFrame(confusion_matrix(class_label, class_label_predicted, columns=labels, index=labels))
conf_df.index.name = 'True labels'

Второе, на что следует обратить внимание, это то, что ваш классификатор плохо предсказывает метки.Количество правильно предсказанных меток показано на главной диагонали матрицы путаницы.У вас есть ненулевые значения по всей матрице, и некоторые классы не были предсказаны вообще - столбцы, которые все равны нулю.Было бы неплохо запустить классификатор с его параметрами по умолчанию, а затем попытаться оптимизировать их.

0 голосов
/ 14 мая 2018

Из doc кажется, что нет такой возможности печатать строки и метки столбцов матрицы путаницы.Однако вы можете указать порядок меток, используя аргумент labels=...

Пример:

from sklearn.metrics import confusion_matrix

y_true = ['yes','yes','yes','no','no','no']
y_pred = ['yes','no','no','no','no','no']
print(confusion_matrix(y_true, y_pred))
# Output:
# [[3 0]
#  [2 1]]
print(confusion_matrix(y_true, y_pred, labels=['yes', 'no']))
# Output:
# [[1 2]
#  [0 3]]

Если вы хотите напечатать матрицу путаницы с метками, вы можете попробовать pandas и установитьindex и columns из DataFrame.

import pandas as pd

print(pd.DataFrame(confusion_matrix(y_true, y_pred, labels=['yes', 'no']), index=['true:yes', 'true:no'], columns=['pred:yes', 'pred:no']))
# Output:
#           pred:yes  pred:no
# true:yes         1        2
# true:no          0        3

или

unique_label = np.unique(y_true)
print(pd.DataFrame(confusion_matrix(y_true, y_pred, labels=unique_label), 
                   index=['true:{:}'.format(x) for x in unique_label], 
                   columns=['pred:{:}'.format(x) for x in unique_label]))
# Output:
#           pred:no  pred:yes
# true:no         3         0
# true:yes        2         1
0 голосов
/ 14 мая 2018

Поскольку матрица путаницы - это просто пустая матрица, она не содержит никакой информации о столбцах. Что вы можете сделать, это преобразовать вашу матрицу в кадр данных, а затем распечатать этот кадр данных.

import pandas as pd
import numpy as np

def cm2df(cm, labels):
    df = pd.DataFrame()
    # rows
    for i, row_label in enumerate(labels):
        rowdata={}
        # columns
        for j, col_label in enumerate(labels): 
            rowdata[col_label]=cm[i,j]
        df = df.append(pd.DataFrame.from_dict({row_label:rowdata}, orient='index'))
    return df[labels]

cm = np.arange(9).reshape((3, 3))
df = cm2df(cm, ["a", "b", "c"])
print(df)

Фрагмент кода из https://gist.github.com/nickynicolson/202fe765c99af49acb20ea9f77b6255e

Выход:

   a  b  c
a  0  1  2
b  3  4  5
c  6  7  8
0 голосов
/ 14 мая 2018

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

Если это не так, и ваши данные об обучении имеют фактические метки, вы можете передать список уникальных меток в confusion_matrix

conf_mat = confusion_matrix(class_label, class_label_predicted, df['task'].unique())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...