我正在尝试为社交网络帖子识别训练模型,并且遇到了一件奇怪的事情。我正在获取用户的帖子文本,并且模型预测了一个类别,但是最高的概率对应于另一个类别。我在下面给出了最简单的示例,但在其他模型中也发现了同样的情况。可能是我对predict_proba方法一无所知。
型号:
texts = np.array(get_train_texts()[0])
labels = np.array(get_train_texts()[1])
X_train, X_test, y_train, y_test = train_test_split(texts, labels,
test_size=0.25, random_state=True)
gbc_model = Pipeline([
('tf_idf', TfidfVectorizer()),
('gbc', GradientBoostingClassifier(n_estimators=128,
max_depth=16,
criterion='friedman_mse'))])
gbc_model.fit(X_train, y_train)
text_to_recognize = [get_post(id, offset, access_token)]
label = gbc_model.predict(text_to_recognize)
grades = gbc_model.predict_proba(text_to_recognize)
grades = [f'{classes[i]}: {round(grades[0][i] * 100, 4)} %' for i in range(len(classes))]
输出:
...
['science']
['science: 3.6298 %', 'cinema: 1.0597 %', 'IT: 1.5812 %', 'art: 2.1504 %', 'games: 91.5788 %']
因此,如果我由argmax从年级中选择,我会得到不正确的“游戏”类而不是“科学”类,这对应的很好:
grades = gbc_model.predict_proba(text_to_recognize)
result = classes[np.argmax(grades)]
print(result)
输出:
['science']
['science: 3.6298 %', 'cinema: 1.0597 %', 'IT: 1.5812 %', 'art: 2.1504 %', 'games: 91.5788 %']
games
为什么会这样?
答案 0 :(得分:0)
gbc模型使用的类顺序与您使用的顺序不同。您选择了classes[i]
,但是不能保证GradientBoostingClassifier
使用的类的索引是相同的。
实际上,分类器按字母顺序对类进行分类,使科学成为最后一个类,并且在您的示例中概率最大。这就是为什么您应该使用内部gbc_model.classes_
属性或LabelEncoder
的原因。
换句话说,分类器就可以了。