StandardScaler特征数量不匹配报错:输入4维特征但预期1维
问题:StandardScaler.transform() 特征数不匹配触发ValueError
执行代码
index = [496,495,498,499] candles = scaler.transform(np.array([float(check[i][4]) for i in index]).reshape(1,-1)) model_feed = candles.reshape(1,4,1) scaler.inverse_transform(model.predict(model_feed)[0])[0] #at 7:08 PM prediction today 6th April
报错详情
ValueError Traceback (most recent call last) <ipython-input-77-669db369d0af> in <cell line: 3>() 1 index = [496,495,498,499] 2 ----> 3 candles = scaler.transform(np.array([float(check[i][4]) for i in index]).reshape(1,-1)) 4 5 model_feed = candles.reshape(1,4,1) 3 frames /usr/local/lib/python3.10/dist-packages/sklearn/base.py in _check_n_features(self, X, reset) 387 388 if n_features != self.n_features_in_: ---> 389 raise ValueError( 390 f"X具有{n_features}个特征,但{self.__class__.__name__}期望输入{self.n_features_in_}个特征。" 391 ) ValueError:X具有4个特征,但StandardScaler期望输入1个特征。
问题原因
StandardScaler训练时适配的是1个特征,但当前调用transform()时传入的数据被处理成了4个特征,特征维度不匹配导致报错。
具体来说,np.array([float(check[i][4]) for i in index]).reshape(1,-1)生成的是形状为(1,4)的数组,会被识别为1个样本、4个特征,和训练时的特征数矛盾。
解决方案
要保证transform()输入的特征数和训练时一致,可根据场景选择以下方案:
方案1:适配单特征Scaler(常用场景)
如果Scaler是针对单个特征训练的,需将每个数值作为独立样本传入,形状调整为(4,1)(4个样本,1个特征):
index = [496,495,498,499] # 调整reshape为(-1,1),生成4个单特征样本 candles = scaler.transform(np.array([float(check[i][4]) for i in index]).reshape(-1,1)) # 调整形状适配模型输入 model_feed = candles.reshape(1,4,1) # 逆变换时同样保证特征数匹配 prediction = model.predict(model_feed)[0] result = scaler.inverse_transform(prediction.reshape(-1,1))[0][0]
方案2:重新拟合多特征Scaler
如果模型确实需要4个特征作为输入,需用4特征的训练数据重新拟合Scaler:
# 用含4个特征的训练数据重新拟合Scaler scaler.fit(your_4_feature_training_data) # 再执行后续transform操作 candles = scaler.transform(np.array([float(check[i][4]) for i in index]).reshape(1,-1))
内容的提问来源于stack exchange,提问作者Sercan Furunci
相关产品推荐
相关产品推荐

