Python 如何在scikit learn中有效地编码数字目标变量?
我试图让Scikit learn处理一个包含500个观察值、20个特征和5个分类目标标签(1、2、3、4、5)的数据集的分类问题。这些特征都是float64类型的,并且它们已经被标准化为z分数。只要将目标变量(y)作为一维NumPy数组输入,拟合和验证就可以正常工作 然而,我最近意识到了对目标变量进行一次热编码的重要性,因为分类的结果似乎略有不同,这取决于分配给类的整数 例如,这里通过对编码变量使用不同的顺序快速概述了k-NN分类器的平均结果: (1, 2, 3, 4, 5) = 52,7%, (2,4,6,8,10)=52,5%和 (4, 3, 5, 1, 2) = 52,1%. 这是有问题的,因为y的标签最初是字符串,而整数本身并没有告诉任何关于数据的信息 解决这个问题的一种方法当然是将y作为字符串值(例如“1”、“2”、“3”、“4”、“5”)输入。但是,我发现只要值可以转换为整数,scikit learn就会自动将字符串转换为整数。这并不能消除问题本身,因为(“1”、“2”、“3”、“4”、“5”)的平均准确度仍然是52.7%。使用诸如(“a”、“b”、“c”、“d”、“e”)之类的值可能是一种解决方案,但它会导致错误消息: ValueError:基数为10的int()的文本无效:“a” 与Keras不同,似乎目标变量必须作为一维NumPy数组输入,因此,不能作为形状为(500,5)的一个热编码矩阵给出。这将导致以下错误消息: ValueError:输入形状不正确(500,5) 下面是一个简单高斯朴素贝叶斯模型的代码示例:Python 如何在scikit learn中有效地编码数字目标变量?,python,machine-learning,keras,scikit-learn,one-hot-encoding,Python,Machine Learning,Keras,Scikit Learn,One Hot Encoding,我试图让Scikit learn处理一个包含500个观察值、20个特征和5个分类目标标签(1、2、3、4、5)的数据集的分类问题。这些特征都是float64类型的,并且它们已经被标准化为z分数。只要将目标变量(y)作为一维NumPy数组输入,拟合和验证就可以正常工作 然而,我最近意识到了对目标变量进行一次热编码的重要性,因为分类的结果似乎略有不同,这取决于分配给类的整数 例如,这里通过对编码变量使用不同的顺序快速概述了k-NN分类器的平均结果: (1, 2, 3, 4, 5) = 52,7%,
random_state = 123
n_splits = 10
cv = StratifiedKFold(n_splits=n_splits, random_state=random_state,
shuffle=False)
model = GaussianNB()
for train, test in cv.split(X, y):
y_dummies = np_utils.to_categorical(y)
y_dummies = y_dummies[:, 1:]
X_train, X_test = X[train], X[test]
y_train, y_test = y_dummies[train], y_dummies[test]
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
conf = confusion_matrix(y_test.argmax(axis=1), y_pred)
print(conf)
最后,我希望能够输出混淆矩阵(conf),这消除了为五个类别中的每个类别分配的抽象数字标签的影响。使用K-NN时,表示类别/目标标签的方式不会影响用于评估模型的准确性/精确度/召回所有其他指标 因为如果k个最近邻中的大多数都属于实例的同一类,则将实例分类为正确分类 我认为你的建议中还有其他问题。在评估完成之前,可能会对数据集进行一些随机抽样或其他随机抽样(当然,这会对数据集的大小和性能产生轻微或很大的影响)
或者,在使用K-NN进行更改时,您可能没有始终如一地修改标签。您表示类别/目标标签的方式不会影响用于评估模型的准确性/精确度/召回率所有其他指标 因为如果k个最近邻中的大多数都属于实例的同一类,则将实例分类为正确分类 我认为你的建议中还有其他问题。在评估完成之前,可能会对数据集进行一些随机抽样或其他随机抽样(当然,这会对数据集的大小和性能产生轻微或很大的影响)
或者,在进行更改时,您可能没有始终如一地修改标签这很奇怪,因为K-NN在模型计算中没有以任何方式使用标签(不像神经网络,在神经网络中,一个热编码工作得很好),除了检查实例在邻域中是否正确分类之外,这很奇怪,因为K-NN在模型计算中没有以任何方式使用标签(不像神经网络,在神经网络中,一个热编码工作得很好),除了检查实例在邻域中是否正确分类之外