当前位置: 首页 > news >正文

【机器学习笔记Ⅰ】9 特征缩放

特征缩放(Feature Scaling)详解

特征缩放是机器学习数据预处理的关键步骤,旨在将不同特征的数值范围统一到相近的尺度,从而加速模型训练、提升性能并避免某些特征主导模型。


1. 为什么需要特征缩放?

(1) 问题背景

  • 量纲不一致:例如:
    • 特征1:年龄(范围 0-100)
    • 特征2:收入(范围 0-1,000,000)
  • 梯度下降的困境
    • 量纲大的特征(如收入)会导致梯度更新方向偏离最优路径,收敛缓慢。
    • 量纲小的特征(如年龄)的权重更新可能被忽略。

(2) 影响

  • 模型收敛慢:梯度下降需要更多迭代。
  • 某些算法失效
    • 距离类算法(如KNN、SVM)受特征尺度直接影响。
    • 正则化模型(如岭回归)对未缩放的系数惩罚不均。

2. 常用特征缩放方法

(1) 标准化(Standardization)

  • 公式
    [
    x’ = \frac{x - \mu}{\sigma}
    ]
    • ( \mu ):特征均值,( \sigma ):标准差。
  • 结果:数据均值为0,方差为1(服从标准正态分布)。
  • 适用场景:大多数算法(如线性回归、神经网络)。

Python实现

from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

(2) 归一化(Normalization)

  • 公式(Min-Max缩放):
    [
    x’ = \frac{x - \min(x)}{\max(x) - \min(x)}
    ]
  • 结果:数据被压缩到 [0, 1] 区间。
  • 适用场景:图像像素值、神经网络输入层。

Python实现

from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
X_scaled = scaler.fit_transform(X)

(3) 鲁棒缩放(Robust Scaling)

  • 公式
    [
    x’ = \frac{x - \text{median}(x)}{\text{IQR}(x)}
    ]
    • IQR(四分位距)= Q3 - Q1。
  • 特点:抗异常值干扰。
  • 适用场景:数据含离群点时。

3. 不同算法的需求

算法类型是否需要特征缩放原因
梯度下降类必须(如线性回归、神经网络)加速收敛,避免震荡。
距离类(KNN、SVM)必须距离计算依赖特征尺度。
树模型(决策树、随机森林)不需要基于特征排序,不受尺度影响。
正则化模型(Lasso/Ridge)必须公平惩罚各特征系数。

4. 代码示例对比

未缩放的梯度下降问题

import numpy as np# 未缩放的数据(年龄 vs 收入)
X = np.array([[30, 50000], [40, 60000], [25, 30000]])
y = np.array([1, 2, 0])# 梯度下降(收敛慢)
def gradient_descent(X, y, lr=0.000001, epochs=100):w = np.zeros(X.shape[1])for _ in range(epochs):y_pred = X.dot(w)grad = X.T.dot(y_pred - y) / len(y)w -= lr * gradreturn ww = gradient_descent(X, y)  # 需要极小的学习率和大量迭代

缩放后的优化效果

from sklearn.preprocessing import StandardScalerscaler = StandardScaler()
X_scaled = scaler.fit_transform(X)w_scaled = gradient_descent(X_scaled, y, lr=0.1)  # 学习率更大,收敛更快

5. 注意事项

  1. 划分数据后缩放:先拆分训练集/测试集,仅用训练集统计量(均值、方差)缩放测试集,避免数据泄漏。
    scaler.fit(X_train)  # 仅用训练集计算参数
    X_train_scaled = scaler.transform(X_train)
    X_test_scaled = scaler.transform(X_test)  # 测试集用相同的scaler
    
  2. 分类特征:独热编码后的二元特征通常无需缩放。
  3. 树模型例外:决策树类模型不依赖特征尺度,但缩放有时能提升计算效率。

6. 总结

  • 核心目标:消除特征间的量纲差异,使模型公平对待每个特征。
  • 方法选择
    • 默认用标准化(StandardScaler)。
    • 数据有界时用归一化(MinMaxScaler)。
    • 含离群点时用鲁棒缩放(RobustScaler)。
  • 关键口诀

    “梯度下降必缩放,距离模型量纲关;
    树模型前可忽略,防漏数据记心间。”


http://www.dtcms.com/a/268441.html

相关文章:

  • 零基础 “入坑” Java--- 八、类和对象(一)
  • 【HarmonyOS】鸿蒙6 CodeGenie AI辅助编程工具详解
  • Vue2 重写了数组的 7 个变更方法(原理)
  • PanoSAM:使用 Meta Segment Anything 模型对全景图像中的点云数据进行无监督分割
  • 模型训练、部署遇到的问题
  • 鼓式制动器的设计+(说明书和CAD【6张】 - 副本➕降重
  • jenkins安装
  • contain:paint和overflow:hidden的区别
  • C++高频知识点(二)
  • 9. 【Vue实战--孢子记账--Web 版开发】-- 账户账本管理(二)
  • 2025.7.6总结
  • android 获取手机配对的蓝牙耳机的电量
  • Flutter 项目开启 UI 层级虚线(UI Guides)
  • 【C++】string类(二)相关接口介绍及其使用
  • 植物大战僵尸杂交重制版1.0,经典焕新,重燃策略塔防之火
  • Altium Designer使用入门(非精通)教程 第三章(PCB绘制)
  • 前端开发深度剖析:核心痛点、隐藏陷阱与系统解决方案
  • 【MySQL进阶】MySQL架构
  • 【HarmonyOS】鸿蒙应用开发Text控件常见错误
  • AI+Web3:从自动化工具到自主经济体的范式革命
  • 爬虫-协议基础
  • 1865.找出和为指定值得下标对
  • Java笔记-下
  • MyBatis-Plus分页拦截器原理深度解析
  • new与malloc[c++面试系列]
  • GCC/G++编译器详解:从编译原理到动静态链接
  • 2025 JuniorCryptCTF re 部分wp
  • 【一起来学AI大模型】算法核心:数组/哈希表/树/排序/动态规划(LeetCode精练)
  • 【Docker基础】Docker数据卷管理:docker volume rm与prune命令对比
  • 计算机网络实验——配置ACL