Как лучше всего в python создать матрицу путаницы из уже агрегированной таблицы с подсчетом фактических меток и прогнозируемых меток - PullRequest
0 голосов
/ 09 июля 2020

Каков наилучший / самый быстрый способ создать матрицу путаницы в python, если данные доступны в следующем формате:

+--------------+-----------------+-------------------+
| Actual Label | Predicted Label | Count Occurrences |
+--------------+-----------------+-------------------+
| A            | A               | 200               |
+--------------+-----------------+-------------------+
| B            | B               | 150               |
+--------------+-----------------+-------------------+
| C            | D               | 15                |
+--------------+-----------------+-------------------+
| X            | Y               | 5                 |
+--------------+-----------------+-------------------+
| ...          | ...             | ...               |
+--------------+-----------------+-------------------+

1 Ответ

2 голосов
/ 09 июля 2020

Если у вас есть фрейм данных в следующей форме:

import pandas as pd


df = pd.DataFrame({
    'Actual Label': ['A', 'A', 'A', 'A', 'B', 'B', 'C', 'D'],
    'Predicted Label': ['A', 'B', 'C', 'D', 'B', 'C', 'D', 'D'],
    'Count Occurences': [200, 150, 100, 150, 50, 100, 70, 80]
})

, который будет выглядеть так:

  Actual Label Predicted Label  Count Occurences
0            A               A               200
1            A               B               150
2            A               C               100
3            A               D               150
4            B               B                50
5            B               C               100
6            C               D                70
7            D               D                80

Затем вы можете использовать функцию .pivot_table() для создания матрицы -подобная таблица:

df = df.pivot_table(values='Count Occurences', index='Actual Label', columns='Predicted Label')

, что похоже на матрицу путаницы:

Predicted Label      A      B      C      D
Actual Label                               
A                200.0  150.0  100.0  150.0
B                  NaN   50.0  100.0    NaN
C                  NaN    NaN    NaN   70.0
D                  NaN    NaN    NaN   80.0

Если вы хотите избавиться от имен столбцов и индексов, просто используйте атрибут values чтобы получить массив numpy только со значениями фрейма данных. Вы также можете использовать .fillna(), чтобы избавиться от значений NaN и заменить их на 0:

df.fillna(0, inplace=True)
print(df.values)

# Output

[[200. 150. 100. 150.]
 [  0.  50. 100.   0.]
 [  0.   0.   0.  70.]
 [  0.   0.   0.  80.]]

РЕДАКТИРОВАТЬ

Могут быть случаи, когда не все фактические метки были предсказаны, и поэтому некоторые из них могут отсутствовать. Пример:

  Actual Label Predicted Label  Count Occurences
0            A               A               200
1            A               B               150
2            A               C               100
3            B               B               150
4            B               C                50
5            C               D               100
6            D               D                70
7            E               A                80

Обратите внимание, что метка E никогда не была предсказана. Приведенный выше код сгенерирует такую ​​матрицу:

[[200. 150. 100.   0.]
 [  0. 150.  50.   0.]
 [  0.   0.   0. 100.]
 [  0.   0.   0.  70.]
 [ 80.   0.   0.   0.]]

В таких случаях вы можете вручную добавить все отсутствующие столбцы, чтобы создать матрицу путаницы:

missing_cols = [col for col in df.index if col not in df.columns]

for col in missing_cols:
    df[col] = 0

# This will ensure that the index and columns have the same order
df = df[df.index.values]

и получить

[[200. 150. 100.   0.   0.]
 [  0. 150.  50.   0.   0.]
 [  0.   0.   0. 100.   0.]
 [  0.   0.   0.  70.   0.]
 [ 80.   0.   0.   0.   0.]]
...