使用Scikit-learn缩放数据时出现异常结果的问题排查
问题原因分析与解决方案
为什么缩放后平段出现波动?
你遇到的问题核心是StandardScaler的缩放维度选错了。
默认情况下,StandardScaler是对输入数组的**列(特征维度)**做标准化,公式为:
scaled_value = (原始值 - 该列均值) / 该列标准差
你把(80,4,288)展平成(80,1152)后,每一列对应的是「所有80天中,某一类指标的某一个时刻的数值」。比如第4类(电价)的111-201时刻,对应展开后的第864+110到864+200列,每一列都是80天里该时刻的电价数据。
哪怕某一天的111-201时刻电价完全相同(原始平段),但每一列(不同时刻)的全局均值和标准差是不一样的——毕竟其他天的这些时刻电价不可能都一致。用不同列的均值/标准差去缩放同一原始值,结果自然会出现波动。
怎么解决?
要根据你的聚类目标选择正确的缩放方式:
1. 聚类目标:基于「每天各指标的绝对数值模式」
比如想把电价整体偏高、温度走势相似的天聚在一起,应该按指标类别分别做列标准化,避免不同指标的量纲干扰:
import numpy as np from sklearn.preprocessing import StandardScaler # 假设data是(80,4,288)的原始数据集 scaled_list = [] for category_idx in range(4): # 取出当前类别的所有天数据:形状(80,288) category_data = data[:, category_idx, :] # 对该类的288个时刻特征(列)做标准化 scaler = StandardScaler() scaled_category = scaler.fit_transform(category_data) scaled_list.append(scaled_category) # 拼接回(80,1152)的二维数组 final_scaled_data = np.concatenate(scaled_list, axis=1)
这种方式下,某一天的平段仍可能出现波动,但这是合理的——标准化的目的是让不同时刻的特征处于同一量级,方便聚类算法计算样本间的相似性。
2. 聚类目标:基于「每天各指标的相对趋势」
比如想把某天电价“先平后涨”这类趋势相似的天聚在一起,应该按样本(天)做行标准化,保留天内的趋势特征:
scaler = StandardScaler() final_scaled_data = scaler.fit_transform(data.reshape(80, -1).T).T
这种方式下,某一天内的平段缩放后依然是平段,但会消除不同天之间的绝对数值差异。
内容的提问来源于stack exchange,提问作者PeterBe
相关产品推荐
相关产品推荐

