机器学习-数据归一化方法(Normalization Method)

数据归一化是机器学习中重要的预处理步骤,它可以加速梯度下降并提高精度。常见的归一化方法包括min-max标准化和0均值标准化。min-max将数据映射到0-1之间,而0均值标准化则使数据服从均值0、标准差1的正态分布。在涉及距离度量或PCA分析时,0均值标准化更为适用。

我的个人微信公众号:Microstrong

微信公众号ID:MicrostrongAI

公众号介绍:Microstrong(小强)同学主要研究机器学习、深度学习、计算机视觉、智能对话系统相关内容,分享在学习过程中的读书笔记!期待您的关注,欢迎一起学习交流进步!

知乎专栏:https://zhuanlan.zhihu.com/Microstrong

个人博客:https://blog.youkuaiyun.com/program_developer

一、出现背景:

从左至右来看,第一个模型是一个线性模型,拟合度很低,也称作欠拟合(Underfitting),不能很好地适应我们的训练集;第三个模型是一个高次方的模型,属于过度拟合,虽然能很好的适应我们的训练数据集,但是在新输入变量进行预测的时候,可能效果会很差。第二个模型可能是刚刚适合我们数据的模型。

那么问题来了,如果我们发现这样过度拟合的情况,如何处理呢?

有两种方式:

1. 丢弃一些不能帮助我们正确预测的特征。采用的方法如下:

  •  手工选择保留哪些特征。
  • 使用一些模型选择算法来帮忙降维。(例如PCA等)

2. 归一化处理

  •  保留所有的特征,但是减少参数的大小(或者是说:减少参数的重要性)

二、定义:

不同的评价指标往往具有不同的量纲(例如:对于评价房价来说量纲指:面积、房价数、楼层等;对于预测某个人患病率来说量纲指:身高、体重等。)和量纲单位(例如:面积单位:平方米、平方厘米等;身高:米、厘米等),这样的情况会影响到数据分析的结果,为了消除指标之间量纲的影响,需要进行数据标准化处理,以解决数据指标之间的可比性。原始数据经过数据标准化处理后,各指标处于同一数量级,适合进行综合对比评价。

三、优点:

(1)归一化后加快了梯度下降求最优解的速度。

(2)归一化有可能提高精度(归一化是让不同维度之间的特征在数值上有一定的比较性)。

解释(1)加快梯度下降求最优解的速度:

例子:假定为了预测房子价格,自变量为面积,房间数两个,因变量为房价。

那么可以得到的公式为:

首先我们给出两张图代表数据是否均一化的最优解寻解过程。

未归一化:

归一化之后:

我们在寻找最优解的过程中也就是在使得损失函数值最小的theta1、theta2。上述两幅图代表的是损失函数的等高线。我们很容易看出,当数据没有归一化的时候,面积数的范围可以从0-1000,房间数的范围一般为0-10,可以看出面积数的取值范围远大于房间数。

归一化和没有归一化的影响:

这样造成的影响就是在形成损失函数的时候:

数据没有归一化的表达式可以为:

造成图像的等高线为类似的椭圆形状,最优解的寻优过程如下图所示:

而数据归一化后,损失函数的表达式可以表示为:

其中变量的前面系数都在【0-1】范围之间,则图像的等高线为类似的圆形形状,最优解的寻优过程如下图所示:

从上面可以看出,数据归一化后,最优解的寻优过程明显会变得平缓,更容易正确的收敛到最优解。

解释:(2)归一化有可能提高精度(归一化是让不同维度之间的特征在数值上有一定的比较性)。

一些分类器需要计算样本之间的距离(如欧式距离),例如KNN。如果一个特征值域范围非常大,那么距离计算就主要取决于这个特征,从而与实际情况不符。(比如,这时实际情况是值域范围小的特征更重要)。

四、两种常用的归一化方法:

(1)min-max标准化

(2)Z-score标准化方法

(1)min-max标准化(Min-Max Normalization)(线性函数归一化)

  • 定义:也称为离差标准化,是对原始数据的线性变换,使得结果映射到0-1之间。
  • 本质:把数变为【0,1】之间的小数。
  • 转换函数:(X-Min)/(Max-Min)
  • 如果想要将数据映射到-1,1,则将公式换成:(X-Mean)/(Max-Min)

其中:max为样本数据的最大值,min为样本数据的最小值,Mean表示数据的均值。

缺陷:当有新数据加入时,可导致max和min的变化,需要重新定义

(2)0均值标准化(Z-score standardization)

  • 定义:这种方法给与原始数据的均值(mean)和标准差(standard deviation)进行数据的标准化。经过处理的数据符合标准正态分布,即均值为0,标准差为1.
  • 本质:把有量纲表达式变成无量纲表达式。
  • 转换函数:(X-Mean)/(Standard deviation)

其中,Mean为所有样本数据的均值。Standard deviation为所有样本数据的标准差。

五、两种归一化方法的使用场景:

(1)在分类、聚类算法中,需要使用距离来度量相似性的时候、或者使用PCA技术进行降维的时候,第二种方法(Z-score standardization)表现更好。

因为:第一种方法(线性变换后),其协方差产生了倍数值的缩放,因此这种方式无法消除量纲对方差、协方差的影响,对PCA分析影响巨大;同时,由于量纲的存在,使用不同的量纲、距离的计算结果会不同。

(2)在不涉及距离度量、协方差计算、数据不符合正太分布的时候,可以使用第一种方法或其他归一化方法。比如图像处理中,将RGB图像转换为灰度图像后将其值限定在(0 ,255)的范围。

因为:第二种归一化方式中,新的数据由于对方差进行了归一化,这时候每个维度的量纲其实已经等价了,每个维度都服从均值为0、方差1的正态分布,在计算距离的时候,每个维度都是去量纲化的,避免了不同量纲的选取对距离计算产生的巨大影响。

 

为什么在距离度量计算相似性、PCA中使用第二种方法(Z-score standardization)会更好呢?我们进行了以下的推导分析:

归一化方法对方差、协方差的影响:假设我们数据为2个维度(X、Y),首先看均值为0对方差、协方差的影响:

我们使用Z-score标准化进行计算,我们先不做方差归一化,只做0均值化为:

新数据的协方差为:

由于

因此:

而原始数据协方差为:

因此:

做方差归一化后:

                 

方差归一化后的协方差为:

使用Min-Max标准化方法进行计算,为了方便分析,我们只对X维进行线性函数变换

计算协方差:

六、总结:

(1)使用Max-Min标准化后,其协方差产生了倍数值得缩放,因此这种方式无法消除量纲对方差、协方差的影响,对PCA分析影响巨大;同时由于量纲的存在,使用不同的量纲,距离的计算结果会不同。

(2)在Z-score标准化(0均值标准化)中,新的数据由于对方差进行了归一化,这时候每个维度的量纲其实已经等价了,每个维度都服从均值为0,、方差为1的正态分布,在计算距离的时候,每个维度都是去量纲化的,避免了不同量纲的选取对距离计算产生的巨大影响。

总的来说,在算法后续计算中,涉及距离度量(聚类分析)或者协方差分析(PCA、LDA等)的,同时数据分布可以近似为状态分布,应当使用0均值化的归一方法。其它应用中,根据具体情况选用合适的归一化方法。

七、Reference:

【1】http://blog.youkuaiyun.com/yehui_qy/article/details/53787386

【2】http://blog.youkuaiyun.com/zbc1090549839/article/details/44103801

【3】知乎:处理数据时不进行归一化会有什么影响?归一化的作用是什么?什么时候需要归一化?有哪些归一化的方法? - 忆臻的回答 - 知乎  https://www.zhihu.com/question/20455227/answer/197897298

【4】http://blog.youkuaiyun.com/mysteryhaohao/article/details/51261300

    

 

 

<think>首先,用户查询是:“我想查找使用R语言实现数据预处理中最大最小值归一化的代码”。所以,我需要提供R语言的代码来实现最大最小值归一化(Min-Max Normalization)。 根据系统指令: - 所有行内数学表达式必须使用$...$格式。 - 独立公式使用$$...$$格式并单独成段。 - 使用中文回答。 - 生成相关问题。 - 在回答中引用的段落末尾添加引用标识。 - 回答结构清晰,帮助用户逐步解决问题。 用户提供了多个引用: - 引用[1]、[2]、[3]、[4]、[5] 都讨论了数据归一化,包括最大最小值归一化- 特别是,引用[2]和[5]展示了Python中使用scikit-learn的代码。 - 但用户现在询问R语言的实现。 我需要参考这些引用来构建回答。关键点是: - 最大最小值归一化公式是:$ \frac{x - \min(x)}{\max(x) - \min(x)} $,将数据映射到[0,1]区间。 - 在Python中,引用[2]使用MinMaxScaler。 - 在R中,有类似的函数或方法。 我回忆起在R中,可以使用基础R函数或包如caret或scales来实现归一化。 常见方法- 使用scale函数,但scale用于z-score标准化,不是归一化- 对于归一化,可以手动计算: (x - min(x)) / (max(x) - min(x)) - 或者使用包如caret的preProcess函数。 具体到R: - scales包有rescale函数:scales::rescale(x, to = c(0, 1)) - 或者使用base R: (x - min(x)) / (max(x) - min(x)) 用户要求代码,所以我应该提供一个完整的示例代码片段。 结构回答: 1. **介绍最大最小值归一化**:简要解释什么是归一化,参考引用。 2. **提供R代码**:展示如何使用R实现。 3. **解释代码**:简要说明代码逻辑。 4. **注意事项**:提到异常值处理等,参考引用[4]。 5. **生成相关问题**:在最后添加相关问题。 添加引用标识: - 在解释归一化时,引用引用[3]或[4]。 生成相关问题: - 例如: 1. 如何在R中处理数据归一化时的异常值? 2. R语言中有哪些其他数据预处理方法? 3. 最大最小值归一化与其他归一化方法的比较? 完整回答: - 按步骤来:先介绍,然后代码,然后解释。 - 使用代码块格式,类似于系统指令中的示例。 在markdown中,使用```r ... ```来显示R代码。 最终回答用中文。 </think>### 数据预处理:最大最小值归一化及其R语言实现 在数据处理和机器学习中,数据归一化(Feature Scaling)是一种关键的预处理步骤,用于消除特征间的量纲差异,提高模型收敛速度和性能[^3]。最大最小值归一化(Min-Max Normalization)是最常用的归一化方法之一,通过将数据映射到指定范围(如[0,1]),公式为: $$ \text{归一化值} = \frac{x - \min(x)}{\max(x) - \min(x)} $$ 其中,$x$ 是原始数据点,$\min(x)$ 和 $\max(x)$ 是该特征的最小值和最大值[^4]。例如,将肿瘤大小(单位:厘米)从[1, 10]映射到[0,1],可避免量纲差异导致的计算偏差[^4]。但需注意,该方法对异常值敏感:如果某特征所有值相同(分母为0),需特殊处理(如全零值保留0,非零值设为1)[^4]。 接下来,我将使用R语言实现最大最小值归一化。R语言提供了多种方式来实现这一功能,包括基础R函数和专用包(如`caret`)。以下是一个完整的代码示例,包含数据准备、归一化计算和结果验证。 #### R语言实现代码 ```r # 加载必要的包(如caret用于更高级的功能,但基础示例使用base R) # install.packages("caret") # 如果未安装,请先运行此命令 library(caret) # 步骤1: 创建示例数据集 # 假设我们有一个数据框,包含两列特征(例如肿瘤大小和发现时间) data <- data.frame( 肿瘤大小 = c(1.0, 2.0, 3.0, 5.0, 10.0), # 单位: 厘米 发现时间 = c(10, 20, 30, 50, 100) # 单位: 天 ) print("原始数据:") print(data) # 步骤2: 实现最大最小值归一化 # 方法1: 使用基础R函数手动计算(适合简单场景) min_max_normalize <- function(x) { min_val <- min(x, na.rm = TRUE) # na.rm处理缺失值 max_val <- max(x, na.rm = TRUE) if (min_val == max_val) { # 处理全相同值的情况:全零则保留0,非零则设为1 if (all(x == 0)) { return(rep(0, length(x))) } else { return(rep(1, length(x))) } } else { return((x - min_val) / (max_val - min_val)) } } # 应用归一化到每个特征列 normalized_data_base <- as.data.frame(lapply(data, min_max_normalize)) colnames(normalized_data_base) <- paste0(colnames(data), "_归一化") print("\n基础R归一化结果(映射到[0,1]):") print(normalized_data_base) # 方法2: 使用caret包的preProcess函数(更高效,推荐生产环境) # 设置归一化参数:method = "range"指定范围映射 preprocessor <- preProcess(data, method = "range") normalized_data_caret <- predict(preprocessor, newdata = data) colnames(normalized_data_caret) <- paste0(colnames(data), "_归一化") print("\ncaret包归一化结果(映射到[0,1]):") print(normalized_data_caret) # 步骤3: 验证归一化效果(检查数据是否在[0,1]范围内) summary(normalized_data_caret) ``` #### 代码说明 - **基础R方法**:手动定义归一化函数,使用`lapply`应用到每个特征列。这适合小型数据集或学习用途。 - **caret包方法**:`preProcess`函数更高效,自动处理特征范围,并可扩展到大数据集。参数`method = "range"`指定了最大最小值归一化- **注意事项**: - 归一化前需确保数据无缺失值(代码中`na.rm = TRUE`可处理缺失)。 - 如果特征值全相同(如$\min(x) = \max(x)$),代码进行了特殊处理(引用[4]提到的逻辑)[^4]。 - 归一化范围默认映射到[0,1],如需其他范围(如[-1,1]),在`min_max_normalize`函数中修改分母或缩放系数即可。 - **输出示例**:原始数据中肿瘤大小[1,10]归一化为[0,1],如5厘米归一化为约0.44。这去除了量纲影响,使特征可比(引用[4]举例的肿瘤大小与时间问题)[^4]。 #### 最佳实践建议 - 在真实项目中,优先使用`caret`或`scales`包(如`scales::rescale`函数),以提高效率和可维护性。 - 归一化后,记得保存归一化参数(如min和max值),以便在新数据上应用相同的转换(类似scikit-learn的`fit_transform`逻辑,引用[2])[^2]。 - 对于包含异常值的数据,考虑结合其他方法如Robust Scaling(z分数归一化),以减少异常值影响(引用[4])[^4]。
评论 7
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值