预测概率与预测概率之间的巨大差异

时间:2020-07-26 05:37:45

标签: python machine-learning xgboost

我正在尝试为社交网络帖子识别训练模型,并且遇到了一件奇怪的事情。我正在获取用户的帖子文本,并且模型预测了一个类别,但是最高的概率对应于另一个类别。我在下面给出了最简单的示例,但在其他模型中也发现了同样的情况。可能是我对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

为什么会这样?

1 个答案:

答案 0 :(得分:0)

gbc模型使用的类顺序与您使用的顺序不同。您选择了classes[i],但是不能保证GradientBoostingClassifier使用的类的索引是相同的。

实际上,分类器按字母顺序对类进行分类,使科学成为最后一个类,并且在您的示例中概率最大。这就是为什么您应该使用内部gbc_model.classes_属性或LabelEncoder的原因。

换句话说,分类器就可以了。