Support Vector Regression中StandardScaler维度错误求助
解决StandardScaler在支持向量回归(SVR)预处理中的维度错误
我来帮你拆解下你遇到的两个维度问题,以及对应的解决方案:
问题根源分析
- 第一个错误(1D数组):scikit-learn的所有预处理工具(包括StandardScaler)都要求输入是2D数组,形状为
[样本数量, 特征数量]。但你一开始用.values提取单列数据时,得到的是1D数组(形状为[样本数量]),这就触发了第一个报错。 - 第二个错误(3D数组):你后来改成用
.to_frame()把单列转成了2D的DataFrame,但多做了一步np.expand_dims(x, axis=-1),这直接把数组变成了3D(形状为[样本数量, 1, 1]),而StandardScaler只支持处理2D及以下的数组,所以又报错了。 - 额外问题:你的目标变量
y也是1D数组,同样需要转换成2D才能用StandardScaler处理(因为SVR的目标变量标准化也需要符合输入格式)。
修正后的代码方案
这里提供两种可行的写法,选一种你习惯的就行:
写法1:用reshape把1D数组转成2D
import pandas as pd import numpy as np import matplotlib.pyplot as plt from sklearn.preprocessing import StandardScaler # 读取数据集 dataset = pd.read_excel(r'C:\Users\Sammy\OneDrive - International Campus, Zhejiang University\Desktop\Data\BAYC Data.xlsx') print(dataset) print(dataset.columns) # 提取特征x:将1D数组reshape为2D(-1表示自动计算样本数,1代表1个特征) x = dataset.iloc[:, 0].values.reshape(-1, 1) # 提取目标变量y:同样转成2D数组 y = dataset.iloc[:, 2].values.reshape(-1, 1) # 初始化标准化器 st_x = StandardScaler() st_y = StandardScaler() # 执行标准化 X = st_x.fit_transform(x) Y = st_y.fit_transform(y)
写法2:用to_frame直接获取2D DataFrame
如果你更习惯用DataFrame格式,也可以这样写(不需要reshape,也不要加多余的expand_dims):
import pandas as pd import numpy as np import matplotlib.pyplot as plt from sklearn.preprocessing import StandardScaler # 读取数据集 dataset = pd.read_excel(r'C:\Users\Sammy\OneDrive - International Campus, Zhejiang University\Desktop\Data\BAYC Data.xlsx') print(dataset) print(dataset.columns) # 提取特征x:to_frame()直接返回2D的DataFrame x = dataset.iloc[:, 0].to_frame() # 提取目标变量y:同样用to_frame转成2D y = dataset.iloc[:, 2].to_frame() # 初始化标准化器 st_x = StandardScaler() st_y = StandardScaler() # 执行标准化 X = st_x.fit_transform(x) Y = st_y.fit_transform(y)
关键注意点
- 不要混合使用
to_frame()和np.expand_dims(),前者已经是2D结构,后者会额外增加维度导致错误。 - 无论是特征还是目标变量,只要用StandardScaler处理,都要保证输入是2D结构(即使只有1个特征/目标列)。
内容的提问来源于stack exchange,提问作者Samulo
相关产品推荐
相关产品推荐

