我正在尝试让 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/