Если у вас есть фрейм данных в следующей форме:
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.]]