预测和 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.

的原因

换句话说,分类器一切正常。