【机器学习】进阶学习:详细解析Sklearn中的MinMaxScaler---原理、应用、源码与注意事项

【机器学习】进阶学习:详细解析Sklearn中的MinMaxScaler—原理、应用、源码与注意事项

这篇文章的质量分达到了97分,虽然满分是100分,但已经相当接近完美了。请您耐心阅读,我相信您一定能从中获得不少宝贵的收获和启发~

在这里插入图片描述

🌈 个人主页:高斯小哥
🔥 高质量专栏:Matplotlib之旅:零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程👈 希望得到您的订阅和支持~
💡 创作高质量博文(平均质量分92+),分享更多关于深度学习、PyTorch、Python领域的优质内容!(希望得到您的关注~)


🌵文章目录🌵

  • 🧠 一、MinMaxScaler简介
  • 🔧 二、MinMaxScaler原理与应用
  • 🔍 三、MinMaxScaler源码的简单复现与解析
  • 💡 四、注意事项
  • 🔄 六、MinMaxScaler与StandardScaler的比较
  • 📚 七、总结

🧠 一、MinMaxScaler简介

  MinMaxScaler是Scikit-learn库中的一个重要工具,主要用于数据的归一化处理。归一化是将数据按比例缩放,使之落入一个小的特定区间,如[0,1]或[-1,1]。MinMaxScaler通过计算特征列的最小值和最大值来实现归一化,它对于稳定模型的训练过程和提高模型的性能非常重要。

归一化的主要好处包括但不限于:

  1. 提高模型的收敛速度,因为特征都在相近的尺度上。
  2. 提高模型的精度,因为一些算法在特征尺度相近时表现更好。
  3. 使得不同单位的特征之间可以进行比较和加权。

🔧 二、MinMaxScaler原理与应用

MinMaxScaler的原理很简单,它使用下面的公式进行归一化:

X_std = (X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0))
X_scaled = X_std * (max - min) + min

其中,X 是原始数据,minmax 是你想要缩放到的范围,通常是[0, 1]。

在应用归一化后,有时候我们需要将数据从归一化的范围转换回原始的范围,这个过程称为反归一化。使用MinMaxScaler进行反归一化的过程相对简单,只需按照下面的公式进行:

X_original = X_scaled * (max_original - min_original) + min_original

这里,max_originalmin_original 是原始数据的最小值和最大值。

在Sklearn中,使用MinMaxScaler进行归一化和反归一化的示例如下:

from sklearn.preprocessing import MinMaxScaler
import numpy as np

# 示例数据
data = np.array([[1, 2], [3, 4], [5, 6]])

# 创建MinMaxScaler对象
scaler = MinMaxScaler(feature_range=(0, 1))

# 使用fit_transform方法拟合数据并进行转换
scaled_data = scaler.fit_transform(data)

print("Original data:\n", data)
print("Scaled data:\n", scaled_data)

# 使用inverse_transform方法将缩放后的数据转换回原始尺度
original_data = scaler.inverse_transform(scaled_data)

print("Data after inverse transformation:\n", original_data)

代码输出:

Original data:
 [[1 2]
 [3 4]
 [5 6]]
Scaled data:
 [[0.  0. ]
 [0.5 0.5]
 [1.  1. ]]
Data after inverse transformation:
 [[1. 2.]
 [3. 4.]
 [5. 6.]]

  在这个示例中,MinMaxScaler首先使用fit_transform方法拟合数据并计算每个特征(即每列分别计算)的最小值和最大值,然后将数据缩放到指定的范围(在这个例子中是[0, 1])。之后,使用inverse_transform方法可以将缩放后的数据还原到原始尺度。

  MinMaxScaler的应用非常广泛,特别是在需要对数据进行归一化处理以消除量纲影响的机器学习算法中。通过将数据缩放到相同的范围,MinMaxScaler可以帮助算法更好地学习和优化。然而,需要注意的是,MinMaxScaler对异常值非常敏感,因为异常值会影响最小值和最大值的计算,从而影响缩放效果。在处理包含异常值的数据时,可能需要考虑使用其他的归一化方法,如RobustScaler或StandardScaler。

🔍 三、MinMaxScaler源码的简单复现与解析

MinMaxScaler的源码包含了fit、fit_transform以及inverse_transform等关键方法:

  1. fit方法用于计算训练数据的最小值和最大值
  2. fit_transform方法则用于根据这些最小值和最大值来缩放数据
  3. inverse_transform方法则用于将缩放后的数据转换回原始尺度。

以下是MinMaxScaler源码的一个简化版本,包括这些主要方法:

import numpy as np


class MinMaxScaler:
    def __init__(self, feature_range=(0, 1)):
        self.feature_range = feature_range
        self.min_ = None
        self.data_min_ = None
        self.data_max_ = None

    def fit(self, X):
        """计算训练集的最小值和最大值"""
        self.data_min_ = np.min(X, axis=0)
        self.data_max_ = np.max(X, axis=0)
        self.min_ = np.min(self.data_min_)
        return self

    def fit_transform(self, X):
        """根据拟合的最小值和缩放比例转换数据"""
        if self.min_ is None:
            raise ValueError("This MinMaxScaler instance is not fitted yet. Call 'fit' with some data first.")
        X_std = (X - self.data_min_) / (self.data_max_ - self.data_min_)
        X_scaled = X_std * (self.feature_range[1] - self.feature_range[0]) + self.feature_range[0]
        return X_scaled

    def inverse_transform(self, X):
        """将缩放后的数据转换回原始尺度"""
        if self.min_ is None:
            raise ValueError("This MinMaxScaler instance is not fitted yet. Call 'fit' with some data first.")
        X_std = (X - self.feature_range[0]) / (self.feature_range[1] - self.feature_range[0])
        X_original = X_std * (self.data_max_ - self.data_min_) + self.data_min_
        return X_original


# 假设我们有一些原始数据
original_data = np.array([[1, 2], [3, 4], [5, 6]])

# 创建一个MinMaxScaler对象
scaler = MinMaxScaler()

# 使用fit_transform方法对数据进行归一化
scaler.fit(original_data)
normalized_data = scaler.fit_transform(original_data)
print("Normalized data:")
print(normalized_data)

# 使用inverse_transform方法进行反归一化
original_data_reconstructed = scaler.inverse_transform(normalized_data)
print("Reconstructed original data:")
print(original_data_reconstructed)

代码输出:

Normalized data:
[[0.  0. ]
 [0.5 0.5]
 [1.  1. ]]
Reconstructed original data:
[[1. 2.]
 [3. 4.]
 [5. 6.]]

  在上面的代码中,fit方法计算了训练数据集X中每个特征的最小值和最大值。fit_transform方法则利用这些参数将输入数据X转换为指定范围feature_range内的值。inverse_transform方法则执行相反的操作,将缩放后的数据转换回原始尺度。

  需要注意的是,这个简化版本假设输入数据X至少包含一个特征(尚未对空值进行异常处理),并且所有特征的最小值和最大值都不相同(避免出现除0情况)。在实际应用中,Scikit-learn的MinMaxScaler实现会包含更多的错误检查和边界情况处理。

  通过解析源码,我们可以更好地理解MinMaxScaler的工作原理,并在必要时自定义或扩展其功能。然而,在实际应用中,通常推荐使用Scikit-learn库中经过优化和测试的完整实现

💡 四、注意事项

在使用MinMaxScaler时,需要注意以下几点:

  1. 数据的分布:MinMaxScaler对数据的分布没有假设,但如果数据集中存在异常值,它们会对最小值和最大值的计算产生很大影响,进而影响到归一化的效果。

  2. 新数据的处理:当使用fit方法计算了训练数据的最小值和最大值后,如果有新的数据需要归一化,应使用相同的最小值和最大值。如果直接使用新数据再次调用fit方法,会导致归一化结果的不一致。

  3. 特征重要性:归一化可能会改变特征之间的相对重要性。因为MinMaxScaler仅仅是将数据缩放到指定的范围,而不考虑特征的分布或其他属性,所以它不会保留任何关于原始特征重要性的信息。在需要特征重要性的场景中,可能需要结合其他方法,如使用特征选择算法或考虑特征的统计属性。

  4. 数据泄露问题:在机器学习的实践中,尤其是在构建预测模型时,需要特别注意避免数据泄露。如果在训练过程中,测试集或验证集的数据被用于MinMaxScaler的fit方法,那么模型可能会因为“看到”了测试集的信息而表现出过高的性能,这会导致对模型泛化能力的错误估计。因此,应该始终确保只使用训练集数据来fit MinMaxScaler

  5. 数据类型和缺失值:MinMaxScaler默认处理数值型数据。如果数据集中包含非数值型特征或缺失值,需要预先进行处理。例如,可以将非数值型特征进行编码,或者用适当的方法填充或删除含有缺失值的样本。

  6. 保留原始数据:在进行归一化或其他预处理操作后,建议保留原始数据。这是因为某些情况下,可能需要重新访问或分析原始数据,或者将归一化后的数据与其他未归一化的数据合并。

  7. 与深度学习框架的集成:当使用深度学习框架(如TensorFlow或PyTorch)时,可能需要自定义归一化层或操作,以便在模型训练过程中直接应用归一化。虽然Scikit-learn的MinMaxScaler可以与这些框架一起使用,但了解如何在框架内部实现归一化也是很重要的。

总之,MinMaxScaler是一个简单而有效的工具,但在使用时需要注意上述事项,以确保归一化过程不会对模型性能产生负面影响,并能够充分利用归一化带来的好处。

🔄 六、MinMaxScaler与StandardScaler的比较

MinMaxScaler和StandardScaler都是Scikit-learn中常用的特征缩放方法,但它们的工作原理和适用场景有所不同:

  • MinMaxScaler通过线性变换将特征值缩放到给定的范围(通常是[0, 1]),它直接依赖于数据的最大值和最小值。这种方法对于有界特征或需要保持特征之间相对大小关系的场景特别有用。然而,由于MinMaxScaler对异常值敏感,因此如果数据集中包含极端值,可能会导致缩放后的数据不稳定或失去有意义的结构。

  • StandardScaler使用均值和标准差来缩放特征,使其具有零均值和单位方差。这种方法更适合于那些假设特征服从正态分布或近似正态分布的场景。StandardScaler对异常值的鲁棒性更好,因为它基于整个数据集的统计属性进行缩放,而不是仅仅依赖于最大值和最小值。

  在选择使用MinMaxScaler还是StandardScaler时,需要考虑数据的特性、模型的假设以及具体的应用场景。例如,在处理像素值或百分比等具有明确边界的数据时,MinMaxScaler可能更合适;而在处理连续型特征且假设它们服从正态分布时,StandardScaler可能更合适。

  此外,值得注意的是,除了MinMaxScaler和StandardScaler之外,还有其他一些特征缩放方法可供选择,如MaxAbsScaler、RobustScaler等。每种方法都有其特定的应用场景和优缺点,因此在实际应用中需要根据具体情况进行选择。

📚 七、总结

  本文详细解析了Scikit-learn中的MinMaxScaler的原理、应用、源码和注意事项。通过深入了解其工作原理和适用场景,我们可以更好地利用这一工具来优化机器学习模型的性能。同时,我们也讨论了MinMaxScaler与StandardScaler之间的比较,以便在实际应用中根据数据特性和模型需求做出合适的选择。

  在使用MinMaxScaler时,需要注意数据的分布、新数据的处理、特征重要性、数据泄露问题以及数据类型和缺失值等方面。此外,与深度学习框架的集成也是一个值得考虑的问题。

  总之,MinMaxScaler是一个强大而灵活的工具,通过合理使用它,我们可以提高机器学习模型的稳定性和性能。希望本文能够帮助你更好地理解和应用MinMaxScaler,并在实际项目中取得更好的效果。🚀

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/447469.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何配置固定TCP公网地址实现远程访问内网MongoDB数据库

文章目录 前言1. 安装数据库2. 内网穿透2.1 安装cpolar内网穿透2.2 创建隧道映射2.3 测试随机公网地址远程连接 3. 配置固定TCP端口地址3.1 保留一个固定的公网TCP端口地址3.2 配置固定公网TCP端口地址3.3 测试固定地址公网远程访问 前言 MongoDB是一个基于分布式文件存储的数…

用了这些计费方式,代理IP成本减半

“代理IP在现代互联网环境中扮演着重要的角色,它们用于隐藏真实的网络地址,提供更安全和匿名的网络浏览体验。代理IP的成本一直是个令人头疼的问题。” 过去供应商常常采用固定费用的模式,客户无论使用时间长短都需要支付相同的费用&#xff…

[Mac软件]Adobe Illustrator 2024 28.3 intel/M1/M2/M3矢量图制作软件

应用介绍 Adobe Illustrator 是行业标准的矢量图形应用程序,可以为印刷、网络、视频和移动设备创建logos、图标、绘图、排版和插图。数以百万计的设计师和艺术家使用Illustrator CC创作,从网页图标和产品包装到书籍插图和广告牌。 绘制任意大小的标志 拥…

恒丰纸业携手得帆云,构建权威级企业主数据管理平台

本期客户 牡丹江恒丰纸业股份有限公司(简称“恒丰纸业”)是国内首家通过科技部和中科院认定的造纸行业重点高新技术企业,于2001年上海证交所上市交易。 恒丰纸业拥有70年历史底蕴和特种薄页纸研发制造技术,现有生产线21条&#xf…

白酒:勾兑技艺的科学原理与实践技巧

在白酒的酿造过程中,勾兑技艺是至关重要的一环。通过勾兑,酒庄能够将不同类型、不同年份的基酒进行优化组合,以获得理想的口感和品质。许多酒庄在勾兑技艺方面积累了丰富的实践经验,并不断探索科学原理,以提高勾兑技艺…

前端性能优化 | CDN缓存

前言 CDN(Content Delivery Network)是一种分布式的网络架构,通过在全球各地部署节点服务器来快速传输和分发网络内容。CDN的主要目标是提供快速、可靠的内容传输,以提升用户体验。 本文主要从以下方面讲解CDN 什么是CDNCDN的作…

同一交换机下不同网段的终端通信

文章目录 一个有趣的实验 大家都知道不同网段的IP地址要想通信需要通过网关进行路由转发,而一般通过路由器来做默认网关。 一个有趣的实验 一台二层交换机下,连接两个不同网段的PC,实现彼此之间的通信。 一台S3700交换机,两台PC。…

LabelImg:一个简单易用的图像标注工具

目录 LabelImg是什么? 如何使用LabelImg进行图像标注? LabelImg的优势和应用场景 在哪里下载它 随着人工智能技术的不断发展,机器学习和深度学习在图像识别、目标检测等领域中得到了广泛的应用。而要训练一个有效的模型,通常需…

如何提高内存和cpu使用率呢?-Linux类资源

最近公司项目上线时,红蓝线巡检时,部分服务器因配置高但使用率低而需要降级。 为了避免降级,如何增加内存和CPU使用率? 这可以通过脚本来实现。 当前服务器操作系统版本:-7_5。 连接服务器后,登录账号。 …

JVM系列:垃圾回收器(GC)

JVM系列:垃圾回收器(GC) 😀 执行引擎将class文件加载至JVM内存中运行。在运行过程中,需要在内存中动态创建和销毁对象。在传统的C/C语言中,需要手动进行对象销毁以避免内存泄漏。而在Java中,引入…

Leetcode笔记——二叉树的迭代遍历

中序遍历: 定义一个 保存中间量的栈 和一个 结果数组 1. 模板写法 注释版: 背诵版: 前序遍历 1. 中 右 左 的顺序遍历 2. 模板写法,按中 左 右 的顺序遍历 后序遍历 1. 模板写法,按左 右 中 的顺序遍历 注释版&am…

STM32单片机基本原理与应用(十一)

语音识别实验 此实验采用STM32核心板 LD3320模块,通过初始化LD3320并写入待识别关键词,对麦克风说出相应关键词,实现实训平台上的流水灯相应变化的效果。 LD3320 是一颗基于非特定人语音识别 (SI-ASR:Speaker-Indepen…

【深度学习笔记】优化算法——Adam算法

Adam算法 🏷sec_adam 本章我们已经学习了许多有效优化的技术。 在本节讨论之前,我们先详细回顾一下这些技术: 在 :numref:sec_sgd中,我们学习了:随机梯度下降在解决优化问题时比梯度下降更有效。在 :numref:sec_min…

从element-plus 引入ILoadingInstance 出现类型错误

具体报错如下图所示: 1、引入ILoadingInstance 出现错误: 解决问题如下所示: 可能是因为element-plus 多次升级原因,将原来的内部代码多次改下了,原来是loading.type文件,现在变成loading.js,包…

卷积神经网络必备基础

卷积神经网络(Convolutional Neural Network, CNN) 传统的全连接神经网络并不适用于图像处理,这是因为:每个像素点都是一个输入特征,随着层数的增加,参数以指数级增长,而图片的像素点往往非常…

【STM32】HAL库 CubeMX 教程 --- 高级定时器 TIM1 定时

实验目标: 通过CUbeMXHAL,配置TIM1,1s中断一次,闪烁LED。 一、常用型号的TIM时钟频率 1. STM32F103系列: 所有 TIM 的时钟频率都是72MHz;F103C8不带基本定时器,F103RC及以上才带基本定时器。…

2024.3.10 win11系统设置环境变量的方法

2024.3.10 win11系统设置环境变量的方法 win11和其他版本略有区别,以安装maven为例进行操作。 一、鼠标右键点击下拉菜单中选择“个性化” 二、点击个性化中选项后在左侧菜单选择“系统” 三、在右侧系统项目中选择“系统信息” 四、在系统信息中选择“高级系统…

Android将自己写的maven库上传至jitpack(2024靠谱版)

浏览了一堆陈年旧贴,终于实验成功了 第一步 将自建空项目同步至github并保证能正常运行第二步新增一个library类型的modul第三步 在新建的library里面写一些测试用的代码第四步在library的gradle文件增加插件和发布脚本第五步新建一个配置文件第六步 把所有更改push…

面试题:分布式锁用了 Redis 的什么数据结构

在使用 Redis 实现分布式锁时,通常使用 Redis 的字符串(String)。Redis 的字符串是最基本的数据类型,一个键对应一个值,它能够存储任何形式的字符串,包括二进制数据。字符串类型的值最多可以是 512MB。 Re…

基于java+springboot+vue实现的火车票订票系统(文末源码+Lw)294

摘要 火车票订票系统可以对火车票订票系统信息进行集中管理,可以真正避免传统管理的缺陷。火车票订票系统是一款运用软件开发技术设计实现的应用系统,在信息处理上可以达到快速的目的,不管是针对数据添加,数据维护和统计&#xf…