当前位置: 首页 > 知识库问答 >
问题:

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

程鸿煊
2023-03-14

这个问题在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)

这里是3个不同标签的列表,比如形状为(63564,1)的A,B和C

因此,使用One-Hot编码,我能够将其拆分:

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作为标签:

分类指标不能处理未知和连续多输出目标的混合

所以我的问题是

我如何尊重一热编码标签,以便我可以运行我的DL模型的评估?

共有3个答案

钱经业
2023-03-14
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)

用这个。您想首先使用argmax函数转换一个热编码数据,以比较您的预测。”在预测部分,您需要将1D数组转换为2D数组,如第3行所述

丰景同
2023-03-14

您可以使用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']))
陈刚洁
2023-03-14

您可能需要逆变换,如sklearn示例部分所述。预处理。OneHotEncoder

>>> from sklearn.preprocessing import OneHotEncoder
>>> enc = OneHotEncoder(handle_unknown='ignore')
>>> X = [['Male', 1], ['Female', 3], ['Female', 2]]
>>> enc.transform([['Female', 1], ['Male', 4]]).toarray()
array([[1., 0., 1., 0., 0.],
       [0., 1., 0., 0., 0.]])
>>> enc.inverse_transform([[0, 1, 1, 0, 0], [0, 0, 0, 1, 0]])
array([['Male', 1],
       [None, 2]], dtype=object)
 类似资料:
  • 问题内容: 我如何创建一些简单的ajax评级,如本页http://watir.com/documentation/所示?每个访问者都应该能够评分,我不需要设置权限。我想将评级存储在列中。因此,用户可以按评分排序。请举一个详细的例子。我不是JavaScript专家。 我找到了一个从头开始创建评分的示例。但是它授权用户。有人可以向我显示创建没有评分者(用户)的评分的指南吗?它不仅应存储值,还应计算票数

  • 模型在训练集上的误差通常称为 “训练误差” 或 “经验误差”,而在新样本上的误差称为 “泛化误差”。显然,机器学习的目的是得到泛化误差小的学习器。然而,在实际应用中,新样本是未知的,所以只能使训练误差尽量小。 当模型在训练集上表现很好而在新样本上误差很大时,称为 “过拟合”;反之,模型在训练集上误差就很大时,称为 “欠拟合”。 欠拟合通常容易解决,如 增加数据、增大训练次数、增大学习率或使用更复杂

  • 我有一个移动价格分类数据集,其中我有20个特征和一个目标变量,称为price_range。我需要将手机价格分为低、中、高、非常高。我已经对我的目标变量应用了一个热编码。之后,我将数据拆分为trainX,testX,trainy,testy。所以我对trainX和trainy的形状分别是(1600,20)和(1600,4)。现在,当我试图使trainX和trainy符合后勤计划时,即- 所以现在我完

  • 我试图将youtube视频网址粘贴到tkinter GUI文本框中,并让浏览按钮启动一个子进程调用,该子进程调用需要硬编码的youtube-dl代码,并添加文本框网址。我似乎无法将硬编码的YouTube-dl代码和变量传递到命令行。 谷歌搜索了很多东西来寻找答案,但似乎找不到任何答案。。。 错误代码我在Tkinter回调回溯(最近一次调用上次)中收到异常:文件“C:\Users\hutch\App

  • 我正在尝试使用线性回归解决WEKA中数字属性的数字分类问题,然后我想在现有数据集上测试我的模型,并在当前测试数据集上重新评估模型。 作为评估的结果,我得到了总结: 相关系数0.9924平均绝对误差1.1017均方根误差1.2445实例总数17 但我没有这里显示的结果:http://weka.wikispaces.com/Making预言 如何让WEKA达到我需要的结果? 非常感谢。 要回答我的问题