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

LogisticRegression特征数不匹配求助:训练集与测试集特征维度不一致

问题根源与解决方法

你的核心问题是只对训练集做了特征筛选和方差过滤,但测试集完全没同步执行这些操作,加上缩放器的使用错误,导致训练集和测试集的特征数量、特征规则完全不匹配。

错误点拆解

  1. 特征筛选只处理了训练集:你用loc[:, (X_train != 0).any(axis=0)]和loc[:, (X_train==0).mean() < .25]去掉了训练集的冗余特征,但测试集X_test还是原始特征,特征数自然比训练集多。
  2. MinMaxScaler使用错误:对X_train用fit_transform是对的,但X_test应该用transform,不能用fit_transform——后者会重新基于测试集拟合缩放规则,不仅和训练集规则不一致,还没先做特征筛选,完全是无效操作。
  3. VarianceThreshold只处理了训练集:同样,你只对训练集做了方差过滤,测试集没同步过滤,特征数再次不匹配。

修正后的代码

# 第一步:先对训练集做特征筛选,同时把筛选规则应用到测试集
# 筛选掉全0的列
keep_cols = (X_train != 0).any(axis=0)
X_train = X_train.loc[:, keep_cols]
X_test = X_test.loc[:, keep_cols]  # 同步应用训练集的筛选规则

# 筛选掉稀疏度超过25%的列
keep_cols = (X_train == 0).mean() < .25
X_train = X_train.loc[:, keep_cols]
X_test = X_test.loc[:, keep_cols]  # 同步应用

# 第二步:用训练集拟合MinMaxScaler,然后分别转换训练集和测试集
mm = MinMaxScaler()
X_train = mm.fit_transform(X_train)
X_test = mm.transform(X_test)  # 这里用transform,不用fit_transform

# 第三步:用训练集拟合VarianceThreshold,同步过滤测试集
vt = VarianceThreshold(threshold=0.01)
X_train = vt.fit_transform(X_train)
X_test = vt.transform(X_test)  # 同步应用过滤规则

# 后续训练和评估
lr = LogisticRegression(solver='lbfgs', max_iter=1000)
lr.fit(X_train, y_train) 

print(lr.score(X_train, y_train))
print(lr.score(X_test, y_test))

关键原则

所有特征工程的步骤(筛选、缩放、过滤等),必须先在训练集上拟合规则,然后将同样的规则应用到测试集,绝对不能在测试集上重新拟合——这会导致数据泄露,同时特征数/规则不匹配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 12:05:12