Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在scikit learn中有效地编码数字目标变量?_Python_Machine Learning_Keras_Scikit Learn_One Hot Encoding - Fatal编程技术网

Python 如何在scikit learn中有效地编码数字目标变量?

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%,

我试图让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)

下面是一个简单高斯朴素贝叶斯模型的代码示例:

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在模型计算中没有以任何方式使用标签(不像神经网络,在神经网络中,一个热编码工作得很好),除了检查实例在邻域中是否正确分类之外