针对多类问题,一个热编码类标签的正确方法



我有一个多个类的分类问题,让我们称它们为a、B、C和D。我的数据有以下形状:

X=[#samples, #features, 1], y=[#samples,1].

更具体地说,y看起来像这样:

[['A'], ['B'], ['D'], ['A'], ['C'], ...]

当我在这些标签上训练随机森林分类器时,这很好,但我多次读到类标签也需要是一个热编码的。在一次热编码之后,y是

[[1,0,0,0], [0,1,0,0], ...]

并且具有形状

[#samples, 4]

当我尝试将其用作分类器输入时,问题就出现了。该模型单独预测四个标签中的每一个,这意味着它也能够产生类似[0 0 0]的输出,这是我不想要的。rfc.classes_返回

# [array([0, 1]), array([0, 1]), array([0, 1]), array([0, 1])]

我该如何告诉模型,标签是一个热编码的,而不是多个相互独立预测的标签?我需要更改y还是需要更改模型的一些设置?

您最初的方法,没有一个热编码,就是做您想要的事情。

一个热编码用于许多模型的输入,但仅用于少数模型的输出(例如,训练具有交叉熵损失的神经网络(。因此,这些只是一些算法实现所需要的,而其他算法没有它也可以做得很好

对于输出标签,像RandomForest这样的分类器可以很好地处理字符串和多个类。

sklearn中使用随机林时,不必进行一次热编码。

你需要的是"标签编码器",你的Y应该看起来像

from sklearn.preprocessing import LabelEncoder
y = ["A","B","D","A","C"]
le = LabelEncoder()
le.fit_transform(y)
# array([0, 1, 3, 0, 2], dtype=int64)

我试图修改sklearn提供的示例代码:

from sklearn.ensemble import RandomForestClassifier
import numpy as np
from sklearn.datasets import make_classification
>>> X, y = make_classification(n_samples=1000, n_features=4,
...                            n_informative=2, n_redundant=0,
...                            random_state=0, shuffle=False)
y = np.random.choice(["A","B","C","D"],1000)
print(y.shape)
>>> clf = RandomForestClassifier(max_depth=2, random_state=0)
>>> clf.fit(X, y)
>>> clf.classes_
# array(['A', 'B', 'C', 'D'], dtype='<U1')

无论是使用标签编码还是不使用标签编码处理y,都可以使用RandomForestClassifier

这里不需要对标签进行编码,无论是字符串还是数字,都可以保持原样据我所知,当使用神经网络时,你应该考虑一种热编码/标签编码示例是在bbc分类数据的情况下

model.predict(sample_data)

阵列([‘娱乐’],dtype='<U13'(

如果训练集中有文本数据,则必须使用一种热编码:例如

name         fuel type
baleno         petrol
MG hector      electric

在热编码之后

name         fuel type_petrol    fuel_type_electric

baleno         1                       0

MG hector      0                       1

相关内容

  • 没有找到相关文章

最新更新