StandardScaler简介
StandardScaler标准化转换器可用于将数据转换为均值为0标准差为1的标准正态分布。StandardScaler 的作用将每个特征的所有值进行标准化处理使数据服从标准正态分布。计算公式X_scaled (X - mean) / std其中mean该特征的均值std该特征的标准差与 MinMaxScaler 的对比特性StandardScalerMinMaxScaler输出范围无固定范围通常在 -3 到 3 之间固定区间如 [0,1]分布形状保持原始分布形状但中心化为0线性压缩到指定区间对异常值敏感度较敏感受均值和标准差影响非常敏感受最大值影响适用场景大多数机器学习算法需要固定边界时如神经网络使用示例基础使用fromsklearn.preprocessingimportStandardScalerimportnumpyasnp# 创建标准化器scalerStandardScaler()# 原始数据datanp.array([[1,100],[2,200],[3,300]])# 标准化scaled_datascaler.fit_transform(data)print(scaled_data)# 输出# [[-1.22474487 -1.22474487]# [ 0. 0. ]# [ 1.22474487 1.22474487]]print(scaled_data.mean(axis0))# [0., 0.] 均值为0print(scaled_data.std(axis0))# [1., 1.] 标准差为1分步操作# 1. 拟合计算每列的均值和标准差scaler.fit(data)print(scaler.mean_)# [2., 200.] 每列均值print(scaler.scale_)# [0.81649658, 81.64965809] 每列标准差# 2. 转换应用标准化scaled_datascaler.transform(data)# 3. 逆转换恢复原始数据original_datascaler.inverse_transform(scaled_data)重要属性# 每列的均值print(scaler.mean_)# 每列的标准差print(scaler.scale_)# 每列的方差标准差的平方print(scaler.var_)# 训练样本数量print(scaler.n_samples_seen_)实际应用场景1. 大多数机器学习算法的标准预处理fromsklearn.svmimportSVCfromsklearn.linear_modelimportLogisticRegressionfromsklearn.neighborsimportKNeighborsClassifier# StandardScaler 是这些算法的常用选择scalerStandardScaler()X_scaledscaler.fit_transform(X)# SVM 对尺度非常敏感svmSVC()svm.fit(X_scaled,y)# 逻辑回归虽然可以通过正则化调整但标准化后收敛更快lrLogisticRegression()lr.fit(X_scaled,y)2. PCA 降维前的必备步骤fromsklearn.decompositionimportPCA# PCA 寻找最大方差方向必须标准化scalerStandardScaler()X_scaledscaler.fit_transform(X)pcaPCA(n_components2)X_pcapca.fit_transform(X_scaled)3. 使用管道简化流程fromsklearn.pipelineimportmake_pipelinefromsklearn.svmimportSVC# 创建包含标准化和SVM的管道modelmake_pipeline(StandardScaler(),SVC(kernelrbf))# 训练自动标准化model.fit(X_train,y_train)# 预测自动标准化测试集predictionsmodel.predict(X_test)什么时候用 StandardScaler✅ 推荐使用的场景大多数机器学习算法SVM、逻辑回归、KNN、K-Means、PCA数据近似正态分布时效果最好不知道用什么归一化方法时默认选 StandardScaler需要保持异常值信息时MinMaxScaler 会压缩异常值❌ 不推荐使用的场景数据有极端异常值# 如果有极端异常值用 RobustScaler 更好fromsklearn.preprocessingimportRobustScaler scalerRobustScaler()# 基于中位数和四分位数需要输出在固定范围内如图像像素值 0-255# 此时用 MinMaxScalerscalerMinMaxScaler(feature_range(0,1))稀疏数据大量0值# 稀疏数据标准化会破坏稀疏结构# 考虑使用 MaxAbsScaler 或不做处理完整工作流示例importpandasaspdfromsklearn.model_selectionimporttrain_test_splitfromsklearn.preprocessingimportStandardScalerfromsklearn.neighborsimportKNeighborsClassifierfromsklearn.metricsimportaccuracy_score# 1. 准备数据datapd.DataFrame({年龄:[25,30,35,40,45,50,55,60],收入:[30000,40000,50000,60000,70000,80000,90000,100000],购买:[0,0,1,1,1,1,0,0]# 标签})Xdata[[年龄,收入]]ydata[购买]# 2. 划分训练集和测试集X_train,X_test,y_train,y_testtrain_test_split(X,y,test_size0.3,random_state42)# 3. 标准化重要只用训练集拟合scalerStandardScaler()X_train_scaledscaler.fit_transform(X_train)X_test_scaledscaler.transform(X_test)# 用训练集的参数# 4. 训练模型knnKNeighborsClassifier(n_neighbors3)knn.fit(X_train_scaled,y_train)# 5. 预测和评估y_predknn.predict(X_test_scaled)print(f准确率:{accuracy_score(y_test,y_pred):.2f})# 6. 查看标准化参数print(f训练集均值:{scaler.mean_})print(f训练集标准差:{scaler.scale_})常见陷阱和注意事项必须用训练集拟合测试集只转换# ✅ 正确scaler.fit(X_train)X_train_scaledscaler.transform(X_train)X_test_scaledscaler.transform(X_test)# ❌ 错误数据泄露X_train_scaledscaler.fit_transform(X_train)X_test_scaledscaler.fit_transform(X_test)新数据超出范围是正常的# 标准化后新数据可能不在 [-3, 3] 范围内# 这是正常的因为标准正态分布理论上可以取任意值标准化不是万能的# 决策树、随机森林等基于树的模型不需要标准化fromsklearn.ensembleimportRandomForestClassifier rfRandomForestClassifier()# 可以直接用原始数据总结StandardScaler是机器学习中最常用的数据预处理方法将数据转换为均值为0标准差为1的标准正态分布适合大多数算法SVM、逻辑回归、KNN、PCA等不确定用什么时优先选 StandardScaler记得只用训练集拟合转换所有数据