机器学习:数据归一化(Scaler)
2024-10-20 13:54:37
数据归一化(Feature Scaling)
一、为什么要进行数据归一化
- 原则:样本的所有特征,在特征空间中,对样本的距离产生的影响是同级的;
- 问题:特征数字化后,由于取值大小不同,造成特征空间中样本点的距离会被个别特征值所主导,而受其它特征的影响比较小;
- 例:特征1 = [1, 3, 2, 6, 5, 7, 9],特征2 = [1000, 3000, 5000, 2000, 4000, 8000, 3000],计算两个样本在特征空间的距离时,主要被特征2所决定;
- 定义:将所有的数据(具体操作时,对每一组特征数据进行分别处理)映射到同一个尺度中;
- 归一化的过程,是算法的一部分;
二、数据归一化的方法
1)最值归一化(normalization)
1、思路:把所有数据映射到0~1之间;
2、公式:
# x为数据集中每一种特征的值;
# 将数据集中的每一种特征都做映射;
3、特点:多适用于分布有明显边界的情况;如考试成绩、人的身高、颜色的分布等,都有范围;而不是些没有范围约定,或者范围非常大的数据;
# 明显边界:同一特征的数据大小相差不大;不会出现大部分数据在0~200之间,有个别数据在100000左右;
4、缺点:受outlier影响较大;
2)Z-score(standardization)
1、思路:把所有数据归一到均值为方差为1的分布中;
2、公式:Xscale = (X - Xmean ) / σ
# Xmean:特征的均值(均值就是平均值);
# σ:每组特征值的标准差;
# X:每一个特征值;
# Xscale:归一化后的特征值;
3、特点1:使用于数据分布没有明显的边界;(有可能存在极端的数据值)
# 归一化后,数据集中的每一种特征的均值为0,方差为1;
4、优点(相对于最值归一化):即使原数据集中有极端值,归一化有的数据集,依然满足均值为0方差为1,不会形成一个有偏的数据;
三、训练数据集的归一化
1)最值归一化:
import numpy as np # 对一维向量做归一化
x = np.random.randint(0, 100, size = 100)
x = np.array(x, dtype=float)
x = (x - np.min(x)) / (np.max(x) - np.min(x)) # 对二维矩阵做归一化
X = np.random.randint(0, 100, (50, 2))
X = np.array(X, dtype=float)
# 分别对每一列进行最值归一化,方式与向量做最值归一化一样
2)均值方差归一化:
import numpy as np X2 = np.random.randint(0, 100, (50, 2))
X2 = np.array(X2, dtype=float)
X2[:,0] = (X2[:,0] - np.mean(X2[:,0])) / np.std(X2[:,0])
X2[:,1] = (X2[:,1] - np.mean(X2[:,1])) / np.std(X2[:,1])
# np.mean(array):求向量的平均值;
# np.std(array):求向量的标准差;
四、测试数据集的归一化
1)问题
- 训练数据集归一化,用于训练模型,测试数据集如何归一化?
2)方案
- 不能直接对测试数据集按公式进行归一化,而是要使用训练数据集的均值和方差对测试数据集归一化;
3)原因
- 原因1:真实的环境中,数据会源源不断输出进模型,无法求取均值和方差的;
- 原因2:训练数据集是模拟真实环境中的数据,不能直接使用自身的均值和方差;
- 原因3:真实环境中,无法对单个数据进行归一化;
# 对数据的归一化也是算法的一部分;
4)方式
- (X_test - mean_train) / std_train
- X_test:测试数据集;
- mean_train:训练数据集的均值;
- std_train:训练数据集的标准差;
五、使用scikit-learn中的Scaler类
1)调用的步骤
- scikit-learn中将训练数据集的均值和方差封装在了类Scalar中;
- fit:根据训练数据集获取均值和方差,scikit-learn中返回一个Scalar对象;
- transform:对训练数据集、测试数据集进行归一化;
2)代码实现
import numpy as np
from sklearn import datasets iris = datasets.load_iris()
X = iris.data
y = iris.target # 1)归一化前,将原始数据分割
from ALG.train_test_split import train_test_split X_train, X_test, y_train, y_test = train_test_split(X, y, seed = 666) # 2)导入均值方差归一化模块:StandardScaler
from sklearn.preprocessing import StandardScaler # 实例化,不需要传入参数
standardScaler = StandardScaler() # 3)fit过程:返回StandardScaler对象,对象内包含训练数据集的均值和方差
# fit过程,传入训练数据集;
standardScaler.fit(X_train)
# 输出:StandardScaler(copy=True, with_mean=True, with_std=True) # fit后可通过standardScaler查看均值和标准差
# standardScaler.mean_:查看均值
# standardScaler.scale_:查看标准差 # 4)transform:对训练数据集和测试数据集进行归一化,分别传入对应的数据集
# 归一化并没有改变训练数据集,而是又生成一个新的矩阵,除非将新生成的数据集赋给原数据集,一般不改变原数据
X_train_standard = standardScaler.transform(X_train)
X_test_standard = standardScaler.transform(X_test) # 接下来就是使用归一化后的数据集训练并测试模型
3)注意
- 步骤:数据分割——导入并实例化归一化模块——fit(得到均值和方差)——transform(得到归一化后的数据集);
- 实例化StandardScaler()时,不需要传入参数;
- 归一化并没有改变数据集,而是又生成一个新的矩阵,一般不要改变原数据;
4)实现scikit-learn的StandardScaler类中的内部逻辑
import numpy as np class StandardScaler: def __init__(self):
self.mean_ = None
self.scale_ = None def fit(self, X):
"""根据训练数据集获取均值和标准差"""
assert X.ndim == 2,"the dimension of X must be 2"
self.mean_ = np.array([np.mean(X[:,i]) for i in range(0,X.shape[1])])
self.scale_ = np.array([np.std(X[:,i]) for i in range(0,X.shape[1])]) return self def transform(self, X):
"""将X根据这个StandardScaler进行均值方差归一化处理"""
assert X_train.ndim == 2, "the dimension of X_train must be 2"
assert self.mean_ is not None and self.scale_ is not None,\
"must fit before transform"
assert X.shape[1] == len(self.mean_),\
"the feature number of X must be equal to mean_ and std_" reasX = np.empty(shape=X.shape, dtype=float)
for col in range(X.shape[1]):
resX[:,col] = (X[:,col] - self.mean_[col]) / self.scale_[col] return resX
最新文章
- 【leetcode】Number of 1 Bits
- selenium+python笔记9
- nginx自启动脚本
- MVC 4 结合jquery.uploadify 上传实例
- [问题解决] ";Nautilus could not create the required folder ";/home/kenneth/.config/nautilus";
- SSM 使用方法
- MHA高可用架构与Atlas读写分离
- ATOM系列之-atom报错";Cannot load the system dictionary for zh-CN";
- Jenkins结合.net平台之ftp客户端
- perl语言中的.pm文件和.pl文件区别
- CF892/problem/C
- Mongodb 基础 查询表达式
- globals() 和 locals() 函数
- redis 处理命令的过程
- WWF3.5SP1 参考源码索引
- TCP/IP Illustrated Vol1 Second Edition即英文版第二版,TCP部分个人勘误
- nginx配置文件中location说明
- 【WIN10】Bind、Binding與Converter的使用
- 如何使用angularjs操作cookie
- onerror=";javascript:this.src='images/defaultUpload.png';";【容易导致死循环报错】
热门文章
- Kubernetes Storage
- MapReduce-join连接
- linux图形界面基本知识(X、X11、Xfree86、Xorg、GNOME、KDE之间的关系)
- hdu 5877 Weak Pair dfs序+树状数组+离散化
- Debugging Tools for Windows__from WDK7
- (转)Openstack Cascading和Nova Cell
- MySql基础学习-库表操作
- Python快速学习-函数
- 1、html(),text(),value()的区别;2、remove() 3、加载完执行函数
- 只有*.mdf 如何附加数据库到MSSQL