Python 如何反转标签的一个热编码以评估ML/DL模型?

Python 如何反转标签的一个热编码以评估ML/DL模型?,python,scikit-learn,deep-learning,one-hot-encoding,Python,Scikit Learn,Deep Learning,One Hot Encoding,这个问题在Stackoverflow上已经提到过几次了,但是没有一次提供了我目前面临的问题/错误的解决方案 目前,我作为标签使用的数据集的y必须使用一种热编码进行转换,以便我的深度学习网络/模型能够将其作为分类信息处理 但是现在问题出现了,为了评估我的数据,它需要重新使用原始标签来预测y import pandas as pd import numpy as np keypoints = pd.read_csv('keypoints.csv') X = keypoints.iloc[:,1:

这个问题在Stackoverflow上已经提到过几次了,但是没有一次提供了我目前面临的问题/错误的解决方案

目前,我作为标签使用的数据集的y必须使用一种热编码进行转换,以便我的深度学习网络/模型能够将其作为分类信息处理

但是现在问题出现了,为了评估我的数据,它需要重新使用原始标签来预测y

import pandas as pd
import numpy as np

keypoints = pd.read_csv('keypoints.csv')

X = keypoints.iloc[:,1:76]
y = keypoints.iloc[:,-1]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0, stratify=y)
这里y是3个不同标签的列表,比如a、B和C,形状为(63564,1)

因此,使用一个热编码,我能够将其拆分:

le = LabelEncoder()
y = le.fit_transform(y)
ohe = OneHotEncoder(categorical_features = [0])
y = ohe.fit_transform(y[:,None]).toarray()
这里的新y的形状为(63564,3),看起来像:

[[0. 0. 1.]
 [0. 0. 1.]
 [0. 0. 1.]
 ...
 [1. 0. 0.]
 [1. 0. 0.]
 [1. 0. 0.]]
运行我的深度学习网络后,我希望通过以下方式对其进行评估:

......
#Evaluation and such
y_pred = model.predict(X_test, verbose=0)
y_classes = model.predict_classes(X_test, verbose=0)

#Reduce to 1D
y_pred = y_pred[:, 0]
y_classes = y_classes[:, 0]

#Confution Matrix
print(confusion_matrix(y_test, y_classes))

#Accuracy: (tp + tn) / (p + n)
accuracy = accuracy_score(y_test, y_classes)
print('Accuracy: %f' % accuracy)
#Precision tp / (tp + fp)
precision = precision_score(y_test, y_classes)
print('Precision: %f' % precision)
#Recall: tp / (tp + fn)
recall = recall_score(y_test, y_classes)
print('Recall: %f' % recall)
#F1: 2 tp / (2 tp + fp + fn)
f1 = f1_score(y_test, y_classes)
print('F1 score: %f' % f1)
但这当然不会接受0和1作为标签:

ValueError:分类指标无法处理未知和未知数据的混合 连续多输出目标

所以我的问题是

如何重新设置一个热编码标签,以便运行 我的DL模型的评估


您可能需要
逆变换
,如


您可以使用
argmax
将概率转换为分类决策:

y_test_classes = y_test.argmax(1)
y_pred_classes = y_pred.argmax(1)

print(confusion_matrix(y_true=y_test_classes, y_pred=y_pred_classes, labels=['A', 'B', 'C']))
用这个。您想首先使用argmax函数转换一个热编码数据,以比较您的预测。”
说到预测部分,您想将1D数组转换为第3行中所述的2D数组,谢谢您的回复,但我对前两行的命名感到困惑,因为它们没有在打印混淆矩阵行中重复使用?因为我在应用上述内容时仍然会遇到相同的错误。感谢您的编辑,不幸的是,我仍然会遇到错误值错误:分类指标无法处理多标签指标和多类别目标的混合。-y_test_类和y_pred_类的输出如下:y_test_类-->
[[0 0 0][0 0][0 0 0]…[0 0 0 0 0 0][0 0 0]
-y_test_类.shape-->
(12713,3)
-y_pred_类-->
[2 0…0 0 0 2]
y_pred_类.shape-->
<12713,
谢谢您的回复,不幸的是,我无法让它工作。因为我在y上应用了我的一个热编码,然后将其馈送到序列测试分割,当我将y返回到逆变换时,混淆矩阵的维度不匹配:
ValueError:找到了样本数不一致的输入变量:[1271363564]
将y\u测试作为输入进行逆变换,会产生以下错误:
ValueError:Found array with dim 3。预计估计数
y_test_classes = y_test.argmax(1)
y_pred_classes = y_pred.argmax(1)

print(confusion_matrix(y_true=y_test_classes, y_pred=y_pred_classes, labels=['A', 'B', 'C']))
y_classes = np.argmax(y_test_4, axis=1)


y_classes = model_4.predict_classes(x_test_4, verbose=0)
y_classes =  np.reshape(yhat_classes_4, (-1, 1))

y_classes= y_classes[:, 0]
 
# accuracy: (tp + tn) / (p + n)
accuracy_4 = accuracy_score(y_test_classes_4, y_classes)
print('Accuracy: %f' % accuracy_4)
# precision tp / (tp + fp)
precision_4 = precision_score(y_test_classes_4, y_classes)
print('Precision: %f' % precision_4)
# recall: tp / (tp + fn)
recall_4 = recall_score(y_test_classes_4, y_classes)
print('Recall: %f' % recall_4)
# f1: 2 tp / (2 tp + fp + fn)
f1_4 = f1_score(y_test_classes_4, y_classes)
print('F1 score: %f' % f1_4)