Как преобразовать матрицу путаницы во фрейм данных в python? - PullRequest
0 голосов
/ 25 марта 2020

Я хотел бы знать, как преобразовать путаницу из scikit, изученного в dataframe. Как я могу это сделать ?

Я не знаю, возможно ли смешать все m c разных моделей. Почему я спрашиваю это из-за читабельности. Я должен всегда печатать в терминале и копировать m c в файл Excel, и это действительно требовательно, так как я запускаю скрипт несколько раз в зависимости от выбранных параметров.


models = {'Model_SVC': model1, 'Model_G_NB': model2, 'Model_LR': model3, 'Model_RF': model4,      'Model_KN': model5, 'Model_MLP': model6}


    cv_splitter = KFold(n_splits=10, shuffle=False, random_state=None)

    for model_name, model in models.items():
        y_pred = cross_val_predict(model, features, ylabels, cv=cv_splitter)

        print("Model: {}".format(model_name))
        print("Accuracy: {}".format(accuracy_score(ylabels, y_pred)))

        cm = confusion_matrix(ylabels, y_pred)

        output = pd.DataFrame()


        print("matrice confusion: {}".format(cm), file=f)

матричный вид как это:

Model: Model_SVC
Accuracy: 0.5692307692307692
matrice confusion: [[ 34   4  46]
 [ 10   2  33]
 [ 16   3 112]]
Model: Model_G_NB
Accuracy: 0.43846153846153846
matrice confusion: [[31 22 31]
 [10 13 22]
 [27 34 70]]
Model: Model_LR
Accuracy: 0.5461538461538461
matrice confusion: [[ 30   4  50]
 [ 11   0  34]
 [ 16   3 112]]
Model: Model_RF
Accuracy: 0.5846153846153846
matrice confusion: [[ 40   5  39]
 [ 17   1  27]
 [ 20   0 111]]
Model: Model_KN
Accuracy: 0.4846153846153846
matrice confusion: [[33 10 41]
 [14 12 19]
 [41  9 81]]
Model: Model_MLP
Accuracy: 0.5153846153846153
matrice confusion: [[ 17   0  67]
 [ 12   0  33]
 [ 13   1 117]]

Я хочу что-то вроде этого:

   F    C   M
0  34   4  46
1  10   2  33
2  16   3 112  
3  31  22  31   => second cm 
4  10  13  22
5  27  34  70
6  30   4  50  => third cm
7  11   0  34
8  16   3 112
...

Поскольку я использую «для», я бы хотел, чтобы cm следовал друг за другом так, чтобы в конце Я смогу экспортировать данные в один файл Excel или CSV. Фрейм данных, который может объединять все см см один за другим.

Ответы [ 2 ]

1 голос
/ 25 марта 2020

Сохранить в списке и затем использовать np.vstack():

import numpy as np

all_cm = list()
for model_name, model in models.items():
    y_pred = cross_val_predict(model, features, ylabels, cv=cv_splitter)

    print("Model: {}".format(model_name))
    print("Accuracy: {}".format(accuracy_score(ylabels, y_pred)))

    cm = confusion_matrix(ylabels, y_pred)
    all_cm.append(cm)

final_matrix = np.vstack(all_cm)
print(final_matrix)

Пример с искусственными данными:

import numpy as np
np.random.seed(0)

all_cm = list()
for i in range(3):
    all_cm.append(np.random.rand(3,3))
final_matrix = np.vstack(all_cm)
print(final_matrix)

[[0.5488135  0.71518937 0.60276338]
 [0.54488318 0.4236548  0.64589411]
 [0.43758721 0.891773   0.96366276]
 [0.38344152 0.79172504 0.52889492]
 [0.56804456 0.92559664 0.07103606]
 [0.0871293  0.0202184  0.83261985]
 [0.77815675 0.87001215 0.97861834]
 [0.79915856 0.46147936 0.78052918]
 [0.11827443 0.63992102 0.14335329]]

1 голос
/ 25 марта 2020

Преобразование любой двумерной матрицы (путаница или нет) в pandas фрейм данных прост:

from sklearn.metrics import confusion_matrix
y_true = [2, 0, 2, 2, 0, 1]
y_pred = [0, 0, 2, 2, 0, 2]
cm = confusion_matrix(y_true, y_pred)
print(cm)
# result:
[[2 0 0]
 [0 0 1]
 [1 0 2]]  

import pandas as pd
df = pd.DataFrame(cm)
print(df)
# result:
   0  1  2
0  2  0  0
1  0  0  1
2  1  0  2

заполнено, с именами как строк, так и столбцов.

Слияние фреймов данных также возможно прямолинейно:

cm2 = [[1, 0, 0],
       [0, 0, 1],
       [2, 0, 1]]
df2 = pd.DataFrame(cm2)

cm3 = [[0, 0, 2],
       [1, 2, 1],
       [2, 0, 0]]
df3 = pd.DataFrame(cm3)

frames = [df, df2, df3]

final = pd.concat(frames)
print(final)
# result:
   0  1  2
0  2  0  0
1  0  0  1
2  1  0  2
0  1  0  0
1  0  0  1
2  2  0  1
0  0  0  2
1  1  2  1
2  2  0  0

Если вы используете его в al oop, вы всегда можете начать с пустого списка frames=[], использовать frames.append(df) для каждого нового кадра данных и pd.concat(frames), чтобы получить окончательный вариант кадр:

frames = []

for model_name, model in models.items():
        y_pred = cross_val_predict(model, features, ylabels, cv=cv_splitter)
        cm = confusion_matrix(y_true, y_pred)
        df = pd.DataFrame(cm)
        frames.append(df)

final = pd.concat(frames)
...