我有一个多个类的分类问题,让我们称它们为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