LogisticRegression特征数不匹配求助:训练集与测试集特征维度不一致
问题根源与解决方法
你的核心问题是只对训练集做了特征筛选和方差过滤,但测试集完全没同步执行这些操作,加上缩放器的使用错误,导致训练集和测试集的特征数量、特征规则完全不匹配。
错误点拆解
- 特征筛选只处理了训练集:你用
loc[:, (X_train != 0).any(axis=0)]和loc[:, (X_train==0).mean() < .25]去掉了训练集的冗余特征,但测试集X_test还是原始特征,特征数自然比训练集多。 - MinMaxScaler使用错误:对X_train用
fit_transform是对的,但X_test应该用transform,不能用fit_transform——后者会重新基于测试集拟合缩放规则,不仅和训练集规则不一致,还没先做特征筛选,完全是无效操作。 - 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
相关产品推荐
相关产品推荐

