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

标签 python machine-learning keras scikit-learn one-hot-encoding

我正在尝试让 Scikit-learn 处理包含 500 个观察值、20 个特征和 5 个分类目标标签(1、2、3、4、5)的数据集的分类问题。这些特征都是 float64 类型,并且已标准化为 z 分数。只要目标变量 (y) 作为一维 NumPy 数组输入,拟合和验证就可以正常工作。

但是,我最近意识到对目标变量进行 one-hot 编码的重要性,因为分类的结果似乎根据分配的整数的不同而略有不同。

例如,以下是对编码变量使用不同顺序的 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) 的 one-hot 编码矩阵给出。这会导致以下错误消息:

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 个最近邻中的大多数与实例属于同一类,则将实例分类为正确分类

我认为您的实现中还存在一些其他问题。在评估完成之前,可能会对数据集进行一些洗牌或其他随机采样(这当然会产生轻微或很大的影响,具体取决于数据集的大小和性能)。

或者您在进行更改时可能没有一致地修改标签

关于python - 如何在 scikit-learn 中有效地编码数字目标变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57886176/

相关文章:

python - plotly :如何以十六进制显示轴刻度?

machine-learning - 无法处理多类和连续的混合

python - 是否可以使用 CNN 对同一对象的图像 block 进行分类,但区域不同?

python - 在python中计算来自sqlite3的数据列表的平均值

python - 如何循环这个 python 脚本?

python - 如何在 python 中将 datetime.date 对象转换为 datetime.datetime?

python - 如何解释多类分类的输出?

python - 如何从图像的热图数据生成边界框数据?

python - 在 Keras 中从 .jpg 创建标准化数据集

python - 卷积层(CNN)在keras中如何工作?