Scikit-learn做YouTube评论标题党分类时predict_proba输出重复问题求助
问题原因及修正方案
核心原因
你当前的特征处理流程和参数设置导致不同评论最终输入到逻辑回归模型的特征向量几乎完全一致,最终输出概率相同,具体诱因如下:
- 特征筛选流程顺序错误:你先做
SelectKBest取Top100特征,再做VarianceThreshold过滤方差低于0.002的特征,很可能经过第一步筛选后的100个特征大部分方差都低于阈值,最终剩余有效特征极少甚至为0,所有样本的特征向量几乎全为0,逻辑回归无法区分样本,只能输出相同概率。 - 参数固定度过高:你在
param_grid里几乎所有参数都只设了1个可选值,只有vectorize__max_features有5个可选值,GridSearchCV实际没有足够的参数组合空间选出最优流程,很容易选到特征质量极差的组合。 - 词袋模型特征区分度不足:仅用
CountVectorizer统计词频,没有考虑词权重,不同内容的评论如果没有命中你筛选的少量特征,就会得到相同的特征向量。
修正步骤
- 调整pipeline的特征处理顺序
先做低方差特征过滤,再做卡方特征选择,避免有效特征被提前误删:
estimators = [('vectorize', CountVectorizer()), ('var', VarianceThreshold()), ('reduce_dimension', SelectKBest(chi2)), ('classifier', LogisticRegression()) ]
- 扩展参数搜索空间,避免参数固定
给各步骤增加可选参数范围,让GridSearchCV能选出更合理的特征和模型配置:
param_grid = dict(vectorize__max_df=[0.85, 0.90, 0.95], vectorize__min_df=[2, 3, 5], vectorize__max_features=[1000, 1500, 2000], vectorize__stop_words=['english', None], var__threshold = [0.0, 0.001, 0.002], reduce_dimension__k=[100, 200, 300], classifier__random_state=[0], classifier__solver=['lbfgs', 'liblinear'], classifier__C=[0.1, 1, 10])
- 替换特征提取器提升区分度
把CountVectorizer换成TfidfVectorizer,用词频逆文档频率代替纯词频,更能区分评论的内容差异:
from sklearn.feature_extraction.text import TfidfVectorizer estimators = [('vectorize', TfidfVectorizer()), ('var', VarianceThreshold()), ('reduce_dimension', SelectKBest(chi2)), ('classifier', LogisticRegression()) ]
- 调试时增加特征有效性检查
训练完成后打印最终输入模型的特征数量,确认没有出现特征数为0或极少的情况:
# 拿到最优pipeline best_pipe = grid_search.best_estimator_ # 打印经过所有特征处理步骤后的特征维度 sample_vec = best_pipe[:-1].transform(training_data['Tidy_Comments'][:10]) print("最终特征维度:", sample_vec.shape[1])
内容的提问来源于stack exchange,提问作者Abhishek Jha
相关产品推荐
相关产品推荐

