You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python文本分类:如何获取模型预测精确值判断类间接近程度

如何获取文本分类模型的类别置信度数值?

我正在使用Python的kNN、Naive Bayes和SVM三种算法进行文本分类,包含easy(编码为0)、medium(编码为1)、hard(编码为2)三类,模型准确率表现尚可。目前使用predict()方法仅能得到0、1、2这类离散标签,想了解是否可以获取类似0.5897237489这样的精确数值,以此判断分类结果与其他类别(如easy或hard)的接近程度。以下是我的部分代码片段:

Train_X, Test_X, Train_Y, Test_Y = model_selection.train_test_split( df['tokens'], df['class'], test_size=0.3, random_state=42)
Encoder = LabelEncoder()
Train_Y = Encoder.fit_transform(Train_Y)
Test_Y = Encoder.fit_transform(Test_Y)
Tfidf_vect = TfidfVectorizer(max_features=35)
Tfidf_vect.fit([' '.join(arr) for arr in df['tokens']])
Train_X_Tfidf = Tfidf_vect.transform([' '.join(arr) for arr in Train_X])
Test_X_Tfidf = Tfidf_vect.transform([' '.join(arr) for arr in Test_X])
Naive = naive_bayes.MultinomialNB()
Naive.fit(Train_X_Tfidf, Train_Y)
predictions_NB = Naive.predict(Test_X_Tfidf)
print(round(accuracy_score(predictions_NB, Test_Y)*100, 2))
解决方案:获取各类别的概率/置信度数值

针对你用到的三种算法,都有对应的方法可以获取每个样本属于不同类别的精确数值,这些数值能反映模型对分类结果的置信度,或是样本与各类别的接近程度,具体操作如下:

1. 朴素贝叶斯(MultinomialNB)

MultinomialNB 原生支持 predict_proba() 方法,它会返回每个测试样本属于每个类别的概率值,所有类别概率总和为1。你只需替换原来的predict()调用即可:

# 替换predict()为predict_proba(),获取三类概率值
predictions_proba_NB = Naive.predict_proba(Test_X_Tfidf)

# 示例:打印第一个测试样本的三类概率(对应0=easy、1=medium、2=hard)
print(predictions_proba_NB[0])
# 输出可能类似:[0.213, 0.5897, 0.1973]

数值越大代表模型认为样本属于该类的概率越高,通过这些数值就能直观判断样本和其他类的接近程度。

2. SVM算法

SVM的处理分两种情况,取决于你使用的具体实现类:

情况1:使用SVC类

如果用的是sklearn.svm.SVC,需要在初始化时设置probability=True(训练阶段会额外拟合概率转换模型),之后就能用predict_proba()获取概率值:

from sklearn.svm import SVC

# 初始化SVC时开启概率计算
svm_model = SVC(probability=True, random_state=42)
svm_model.fit(Train_X_Tfidf, Train_Y)

# 获取各类别概率
predictions_proba_SVM = svm_model.predict_proba(Test_X_Tfidf)
print(predictions_proba_SVM[0])
# 输出可能类似:[0.15, 0.72, 0.13]

情况2:使用LinearSVC类

LinearSVC默认不支持概率计算,但可以用decision_function()获取样本到各类别超平面的距离值,距离大小能反映样本与类别的接近程度。如果需要转换为概率,可以用softmax函数做归一化处理:

from sklearn.svm import LinearSVC
import numpy as np

svm_linear = LinearSVC(random_state=42)
svm_linear.fit(Train_X_Tfidf, Train_Y)

# 获取样本到各类别超平面的距离值
decision_values = svm_linear.decision_function(Test_X_Tfidf)

# 用softmax转换为概率值
predictions_proba_LinearSVC = np.exp(decision_values) / np.sum(np.exp(decision_values), axis=1, keepdims=True)
print(predictions_proba_LinearSVC[0])
# 输出可能类似:[0.2, 0.65, 0.15]

3. kNN算法

KNeighborsClassifier同样支持predict_proba()方法,它返回的是每个样本属于各类别的比例(基于k个邻居中各类别的数量占比):

from sklearn.neighbors import KNeighborsClassifier

knn_model = KNeighborsClassifier(n_neighbors=5)
knn_model.fit(Train_X_Tfidf, Train_Y)

# 获取各类别比例/概率
predictions_proba_kNN = knn_model.predict_proba(Test_X_Tfidf)
print(predictions_proba_kNN[0])
# 输出可能类似:[0.4, 0.6, 0.0](比如5个邻居里3个是medium,2个是easy)
额外提示
  • 这些数值可以帮你分析模型的分类不确定性:比如某个样本的三类概率是[0.33,0.34,0.33],说明模型对这个样本的分类非常模糊;
  • 如果你只想获取预测类别的置信度,可以用np.max(predictions_proba, axis=1)提取每个样本的最高概率值。

内容的提问来源于stack exchange,提问作者marcus-linmarkson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 14:22:46