预测和 predict_proba 概率之间的巨大差异
Big difference between predict and predict_proba probabilities
我正在尝试训练社交网络 post 的识别模型,遇到了一件奇怪的事情。我收到用户 post 的文本,模型预测一个 class,但最高概率对应另一个。我在下面给出了最简单的例子,但我在其他模型中也发现了同样的事情。可能是我对 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,我会得到不正确的class“游戏”而不是“科学”,这对应得很好:
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
为什么会这样?
gbc 模型使用的 class 顺序与您使用的顺序不同。你selectclasses[i]
,但不能保证GradientBoostingClassifier
使用的classes的索引是一样的
事实上,classifier 按字母顺序 class排序,使科学排在最后,class在您的示例中概率最高的一个。这就是您应该使用内部 gbc_model.classes_
属性或 LabelEncoder
.
的原因
换句话说,分类器一切正常。
我正在尝试训练社交网络 post 的识别模型,遇到了一件奇怪的事情。我收到用户 post 的文本,模型预测一个 class,但最高概率对应另一个。我在下面给出了最简单的例子,但我在其他模型中也发现了同样的事情。可能是我对 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,我会得到不正确的class“游戏”而不是“科学”,这对应得很好:
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
为什么会这样?
gbc 模型使用的 class 顺序与您使用的顺序不同。你selectclasses[i]
,但不能保证GradientBoostingClassifier
使用的classes的索引是一样的
事实上,classifier 按字母顺序 class排序,使科学排在最后,class在您的示例中概率最高的一个。这就是您应该使用内部 gbc_model.classes_
属性或 LabelEncoder
.
换句话说,分类器一切正常。