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

