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

使用sklearn时特征增减不影响模型准确率的技术问询

排查模型准确率固定不变的问题

嘿,我来帮你拆解这个让人头疼的问题——不管怎么调整特征,模型准确率都纹丝不动,大概率是这几个原因之一,咱们一步步来排查:

1. 先检查标签的类别分布

最常见的情况是你的标签correct本身就有极度不平衡的比例,比如其中一类的占比刚好在0.666左右,这时候模型哪怕啥都不学,直接预测占多数的类别,就能拿到这个准确率。你可以先跑这段代码看看:

print(y.value_counts(normalize=True))

如果输出里某一类的占比接近0.666,那问题就找到了——模型在偷懒“躺赢”,根本没用到特征。

2. 验证特征和标签是否真的相关

如果标签分布是均衡的,那得看看你的特征x、y是不是和标签完全无关(比如都是随机生成的噪声)。这种情况下,模型不管怎么拟合,都只能靠随机猜测,准确率自然固定。可以用相关性分析或者互信息来验证:

# 查看特征与标签的皮尔逊相关系数
print(data[["x", "y", "correct"]].corr())

# 用互信息衡量特征与标签的关联程度(更适合分类任务)
from sklearn.feature_selection import mutual_info_classif
print(mutual_info_classif(X, y.values.ravel()))

如果相关系数接近0、互信息值极低,那说明这些特征确实没用,得换特征或者重新处理数据。

3. 检查模型参数与数据预处理

LogisticRegression默认带L2正则,如果你的特征没做标准化,或者正则强度太高(C值太小),模型的权重会被压到几乎为0,最终变成常数预测。试试用管道把标准化和模型结合,同时调大C值降低正则强度:

from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import make_pipeline

# 构建包含标准化的模型管道
model = make_pipeline(StandardScaler(), LogisticRegression(C=100))
# 注意把y转成一维数组,避免DataFrame带来的问题
scores = cross_val_score(model, X, y.values.ravel(), cv=5)
print("交叉验证平均分:", scores.mean())

4. 确认交叉验证的合理性

最后检查下交叉验证的设置:是不是用了默认的KFold而没有分层?如果数据本身类别分布不均,普通KFold可能每次划分的fold都有相同的类别比例,导致结果固定。可以试试用分层抽样的交叉验证:

from sklearn.model_selection import StratifiedKFold

skf = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)
scores = cross_val_score(model, X, y.values.ravel(), cv=skf)
print("分层交叉验证平均分:", scores.mean())

另外提个小细节:你代码里y = data[["correct"]]得到的是DataFrame,而sklearn的模型更偏好一维数组作为标签,所以用y.values.ravel()或者y.iloc[:, 0]转成一维会更稳妥。

内容的提问来源于stack exchange,提问作者Nazim Kerimbekov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 04:18:37