不同分类器在LIAR数据集上准确率得分一致问题求助
问题原因分析与解决办法
你遇到的不同算法输出完全相同准确率的问题,核心大概率是所有模型都在预测二分类中的多数类别,64.15%刚好是该类别的样本占比。以下是具体排查方向和解决步骤:
一、核心原因排查
1. 类别分布失衡
LIAR数据集转二分类后,极可能存在严重的类别不平衡。先统计转换后两类的样本占比:
print(Y.value_counts(normalize=True))
如果false类的占比恰好约为64.15%,说明所有模型都陷入了「多数类预测」陷阱——无论输入特征如何,模型直接输出占比更高的类别,以此获取基准准确率。这就解释了为什么不同算法、不同数据集划分下结果完全一致。
2. 特征无区分度
若类别分布相对均衡,则需检查特征提取的有效性:
- TF-IDF:查看特征矩阵的稀疏度,是否大部分特征为0?或特征方差极低,无法区分真假新闻。
- DistilBERT/Llama 2:是否仅简单提取了
<[BOS_never_used_51bce0c785ca2f68081bfa7d91973934]>token的嵌入,未针对二分类任务做下游微调?这类预训练模型若不做任务适配,提取的特征可能缺乏特异性,导致模型无法学习有效区分模式。
3. 代码逻辑问题
检查代码细节:
- 确认
parameters_nb是否为空字典。若是,GridSearchCV不会进行任何调参,直接使用GaussianNB默认参数,而默认参数更容易偏向多数类预测。 - 查看保存的预测结果CSV,是否所有
Predicted_Label都是同一个值(比如全为false),这会直接坐实多数类预测的问题。
二、针对性解决办法
1. 处理类别不平衡
- 类别权重调整:训练模型时加入类别权重,让模型重视少数类:
# Logistic Regression model_lr = LogisticRegression(class_weight='balanced') # XGBoost pos_weight = len(Y[Y=='true']) / len(Y[Y=='false']) model_xgb = XGBClassifier(scale_pos_weight=pos_weight) - 重采样:对少数类进行过采样(如SMOTE算法),或对多数类进行欠采样,平衡两类样本数量。
- 换用评估指标:不要仅依赖准确率,改用F1-score、AUC-ROC等更适合不平衡数据集的指标。
2. 优化特征提取
- TF-IDF调优:调整参数增强特征区分度:
from sklearn.feature_extraction.text import TfidfVectorizer tfidf = TfidfVectorizer(ngram_range=(1,2), stop_words='english', min_df=5) - 预训练模型微调:不要仅提取静态嵌入,添加分类头做下游任务微调:
from transformers import DistilBertForSequenceClassification model = DistilBertForSequenceClassification.from_pretrained('distilbert-base-uncased', num_labels=2) # 后续执行训练、评估流程
3. 修正代码逻辑
- 给
parameters_nb设置合理的调参范围,比如GaussianNB的平滑参数:import numpy as np parameters_nb = {'var_smoothing': np.logspace(0,-9, num=100)} - 在
GridSearchCV中添加verbose=1,查看调参过程是否正常运行,确认模型在实际拟合不同参数。
内容的提问来源于stack exchange,提问作者lucasa.lisboa
相关产品推荐
相关产品推荐

