我正在使用逻辑回归算法进行多类文本分类。我需要一种方法来获取置信度分数以及类别。例如 - 如果我将文本 ="你好,这是示例文本"传递给模型,我应该得到预测类 = 类 A 和置信度 = 80%的结果。
对于scikit-learn中的大多数模型,我们可以通过predict_proba
获得类的概率估计。请记住,这是逻辑函数的实际输出,通过选择具有最高概率的输出来获得结果分类,即对输出应用argmax
。如果我们在这里看到实现,你可以看到它本质上是在做:
def predict(self, X):
# decision func on input array
scores = self.decision_function(X)
# column indices of max values per row
indices = scores.argmax(axis=1)
# index class array using indices
return self.classes_[indices]
在调用predict_proba
而不是predict
的情况下,返回scores
。下面是一个训练LogisticRegression
的示例用例:
from sklearn.datasets import load_iris
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
X, 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_prob
array([[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_names
classes[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'predicted class = {classes[ix]} and confidence = {y_pred_prob[0,ix]:.2%}')
# predicted class = virginica and confidence = 90.75%