机器学习:数据归一化(Scaler)
数据归一化(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
机器学习:数据归一化(Scaler)的更多相关文章
- 第四十九篇 入门机器学习——数据归一化(Feature Scaling)
No.1. 数据归一化的目的 数据归一化的目的,就是将数据的所有特征都映射到同一尺度上,这样可以避免由于量纲的不同使数据的某些特征形成主导作用. No.2. 数据归一化的方法 数据归一化的方法主要 ...
- 数据归一化Scaler-机器学习算法
//2019.08.03下午#机器学习算法的数据归一化(feature scaling)1.数据归一化的必要性:对于机器学习算法的基础训练数据,由于数据类型的不同,其单位及其量纲也是不一样的,而也正是 ...
- [机器学习]-[数据预处理]-中心化 缩放 KNN(二)
上次我们使用精度评估得到的成绩是 61%,成绩并不理想,再使 recall 和 f1 看下成绩如何? 首先我们先了解一下 召回率和 f1. 真实结果 预测结果 预测结果 正例 反例 正例 TP 真 ...
- 数据处理:2.异常值处理 & 数据归一化 & 数据连续属性离散化
1.异常值分析 异常值是指样本中的个别值,其数值明显偏离其余的观测值.异常值也称离群点,异常值的分析也称为离群点的分析. 异常值分析 → 3σ原则 / 箱型图分析异常值处理方法 → 删除 / 修正填补 ...
- matlab将矩阵数据归一化到[0,255]
matlab将矩阵数据归一化到[0,255] function OutImg = Normalize(InImg) ymax=255;ymin=0; xmax = max(max(InImg) ...
- 数据归一化Feature Scaling
数据归一化Feature Scaling 当我们有如上样本时,若采用常规算欧拉距离的方法sqrt((5-1)2+(200-100)2), 样本间的距离被‘发现时间’所主导.尽管5是1的5倍,200只是 ...
- MATLAB实例:聚类初始化方法与数据归一化方法
MATLAB实例:聚类初始化方法与数据归一化方法 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 1. 聚类初始化方法:init_methods.m f ...
- 机器学习 —— 数据预处理
对于学习机器学习算法来说,肯定会涉及到数据的处理,因此一开始,对数据的预处理进行学习 对于数据的预处理,大概有如下几步: 步骤1 -- 导入所需库 导入处理数据所需要的python库,有如下两个库是非 ...
- 数据归一化 scikit-learn中的Scaler
1 import numpy as np 2 from sklearn import datasets 3 4 # 获取数据 5 iris = datasets.load_iris() 6 X = i ...
随机推荐
- Grafana连接Prometheus监控Docker平台
Grafana是一款开源的分析平台. Grafana allows you to query, visualize, alert on and understand your metrics no m ...
- JMeter学习(七)聚合报告之 90% Line 正确理解
90% Line 参数正确的含义: 虽然,我的上面理解有一定的道理,显然它是错误的.那看看JMeter 官网是怎么说的? 90% Line - 90% of the samples took no m ...
- 标准库string与C风格字符串
返回字符串的长度 string标准库 #include<iostream> #include<cstring> using namespace std; int main() ...
- TortoiseSVN教程级别指南
安装说明 开发人员强烈建议使用IDE中的SVN插件更加智能与人性化. 首先安装SVN客户端,windows一般选择乌龟客户端https://tortoisesvn.net/downloads.html ...
- 正则表达式java,javaScript应用
dfa nfa 混合:捕获:断言: 正则引擎大体上可分为不同的两类:DFA和NFA,而NFA又基本上可以分为传统型NFA和POSIX NFA. 1.正则语法 捕获组: 没用()的字符都是一个一个 ...
- Qt QFileSystemModel QDirModel 示例代码, 使用方法
1. QFileSystemModel 查看,添加 和 删除目录 2. 实现代码 dialog.h #ifndef DIALOG_H #define DIALOG_H #include <QD ...
- mapreduce job提交流程源码级分析(二)(原创)
上一小节(http://www.cnblogs.com/lxf20061900/p/3643581.html)讲到Job. submit()方法中的: info = jobClient.submitJ ...
- SGU 106 The equation 扩展欧几里德
106. The equation time limit per test: 0.25 sec. memory limit per test: 4096 KB There is an equation ...
- 3DES双倍长加密
import java.security.SecureRandom; import javax.crypto.Cipher; import javax.crypto.SecretKey; import ...
- gbk编码汉字转换成对应的十进制十六进制的值
http://www.mytju.com/classcode/tools/urlencode_gb2312.asp