如何验证sklearn中StandardScaler的transform输出正确性?
sklearn StandardScaler 核心问题解答
一、转换的具体数学公式
StandardScaler 实现的是Z-score标准化,用sc.fit计算得到的sc.mean_(各特征的均值)和sc.scale_(各特征的总体标准差,即除以样本数N而非N-1),对每个样本的每个特征执行以下计算:
标准化值 = (原始特征值 - 对应特征的均值) / 对应特征的总体标准差
对应到代码逻辑,假设处理第i个特征,单个样本值为x,则计算式为 (x - sc.mean_[i]) / sc.scale_[i]。
二、验证转换输出的正确性
可以通过两种简单方式验证结果是否符合预期:
- 手动计算对比:
- 提取原始数据中某一列特征,手动计算其均值和总体标准差(注意要和sklearn一致,用
ddof=0计算标准差) - 对该列每个元素执行标准化公式计算
- 将手动计算结果和
sc.transform/sc.fit_transform的输出对应列对比,允许微小的浮点数精度误差
- 提取原始数据中某一列特征,手动计算其均值和总体标准差(注意要和sklearn一致,用
- 检查标准化后的数据统计特性:
标准化完成后,每个特征的均值应接近0,标准差应接近1。可以用numpy的mean和std函数对标准化后的数据按列计算,结果误差通常在1e-10量级以内。
实操代码示例
import numpy as np from sklearn.preprocessing import StandardScaler # 构造测试数据集 X = np.array([[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]) scaler = StandardScaler() scaled_X = scaler.fit_transform(X) # 手动验证第一列特征的标准化结果 col_0 = X[:, 0] manual_mean = col_0.mean() manual_std = col_0.std(ddof=0) # 总体标准差,和sklearn逻辑一致 manual_scaled = (col_0 - manual_mean) / manual_std # 对比结果 print("sklearn 输出的第一列标准化值:", scaled_X[:, 0]) print("手动计算的第一列标准化值:", manual_scaled) print("结果是否一致:", np.allclose(scaled_X[:, 0], manual_scaled)) # 检查标准化后的数据统计特征 print("\n标准化后各特征均值:", np.round(np.mean(scaled_X, axis=0), 10)) print("标准化后各特征标准差:", np.round(np.std(scaled_X, axis=0), 10))
内容的提问来源于stack exchange,提问作者jhchandler
相关产品推荐
相关产品推荐

