我相当清楚树对一个热编码(OHE)目标很敏感,但是我想了解为什么它返回这样的预测:
`array([[0, 0, 0, 0],
[0, 0, 0, 0],
.
.
.
[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 1, 0],
[0, 0, 0, 0]])`
对于大多数样本,它都不会预测任何类别。我会将我的目标编码为序数(因为它适用),但如果不是的话怎么办?那该怎么办呢?这是 OHE 之前的样子:
array(['4 -8 weeks', '13 - 16 weeks', '17 - 20 weeks', ..., '9 - 12 weeks',
'13 - 16 weeks'], dtype=object)
提前致谢!
完整代码:
from sklearn.preprocessing import LabelBinarizer
mlb = LabelBinarizer()
b = mlb.fit_transform(Class)
list(mlb.classes_)
# Split the data into training and test sets
X_train, X_test, y_train, y_test = train_test_split(data, b, test_size=0.2, random_state=42)
# Create a multi-label classifier
classifier = RandomForestClassifier()
# Train the classifier
classifier.fit(X_train, y_train)
# Make predictions on the test set
y_pred = classifier.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
当目标是 one-hot 编码时,sklearn 会将问题视为多标签问题(每一行可以有任意数量的标签)。因此,您可以获得每个标签的预测概率,并且这些概率独立地阈值设置为 0.5,以便进行类别预测。
当目标按顺序编码时,sklearn 会将问题视为多类问题(每一行只有一个类)。尽管有数字排序,sklearn 并不关心(好吧,除了平局)并将类视为无序。预测概率之和为 1,预测类别是概率最大的类别。
您根本不需要对标签进行编码。sklearn 会在内部对它们进行编码以提高计算效率;但将字符串保留为标签是可以的,将被视为多类,并且允许类预测也是字符串(无需解码)。