我在使用逻辑回归算法进行多类文本分类。我需要一种方法来获取与类别一起的信心得分。例如,如果我将文本 = “你好,这是样本文本” 传递给模型,我应该得到 预测类别 = 类别 A 和信心 = 80% 作为结果。
回答:
对于 scikit-learn 中的大多数模型,我们可以通过 predict_proba
获取类的概率估计。请注意,这是逻辑函数的实际输出,得到的结果分类是通过选择概率最高的输出获得的,即在输出上应用了 argmax
。如果我们查看 这里 的实现,你可以看到它本质上是在做以下操作:
def predict(self, X): # 对输入数组进行决策函数 scores = self.decision_function(X) # 每行最大值的列索引 indices = scores.argmax(axis=1) # 使用索引对类数组进行索引 return self.classes_[indices]
在调用 predict_proba
而不是 predict
的情况下,返回的是 scores
。这是一个使用 LogisticRegression
进行训练的示例用例:
from sklearn.datasets import load_irisfrom sklearn.linear_model import LogisticRegressionfrom sklearn.model_selection import train_test_splitX, y = load_iris(return_X_y=True)X_train, X_test, y_train, y_test = train_test_split(X, y)lr= LogisticRegression()lr.fit(X_train, y_train)y_pred_prob = lr.predict_proba(X_test)y_pred_probarray([[1.06906558e-02, 9.02308167e-01, 8.70011771e-02], [2.57953117e-06, 7.88832490e-03, 9.92109096e-01], [2.66690975e-05, 6.73454730e-02, 9.32627858e-01], [9.88612145e-01, 1.13878133e-02, 4.12714660e-08], ...
我们可以通过取 argmax
得到概率,如前所述,并按如下方式索引类数组:
classes = load_iris().target_namesclasses[indices]array(['virginica', 'virginica', 'versicolor', 'virginica', 'setosa', 'versicolor', 'versicolor', 'setosa', 'virginica', 'setosa',...
因此,对于单个预测,通过预测的概率我们可以轻松地做如下操作:
y_pred_prob = lr.predict_proba(X_test[0,None])ix = y_pred_prob.argmax(1).item()print(f'预测类别 = {classes[ix]} 和信心 = {y_pred_prob[0,ix]:.2%}')# 预测类别 = virginica 和信心 = 90.75%