数据归一化(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
  1. X_test:测试数据集;
  2. mean_train:训练数据集的均值;
  3. std_train:训练数据集的标准差;

 

五、使用scikit-learn中的Scaler类

 1)调用的步骤

  • scikit-learn中将训练数据集的均值和方差封装在了类Scalar中;

  1. fit:根据训练数据集获取均值和方差,scikit-learn中返回一个Scalar对象;
  2. 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)注意

  1. 步骤:数据分割——导入并实例化归一化模块——fit(得到均值和方差)——transform(得到归一化后的数据集);
  2. 实例化StandardScaler()时,不需要传入参数;
  3. 归一化并没有改变数据集,而是又生成一个新的矩阵,一般不要改变原数据;

 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)的更多相关文章

  1. 第四十九篇 入门机器学习——数据归一化(Feature Scaling)

    No.1. 数据归一化的目的 数据归一化的目的,就是将数据的所有特征都映射到同一尺度上,这样可以避免由于量纲的不同使数据的某些特征形成主导作用.   No.2. 数据归一化的方法 数据归一化的方法主要 ...

  2. 数据归一化Scaler-机器学习算法

    //2019.08.03下午#机器学习算法的数据归一化(feature scaling)1.数据归一化的必要性:对于机器学习算法的基础训练数据,由于数据类型的不同,其单位及其量纲也是不一样的,而也正是 ...

  3. [机器学习]-[数据预处理]-中心化 缩放 KNN(二)

    上次我们使用精度评估得到的成绩是 61%,成绩并不理想,再使 recall 和 f1 看下成绩如何? 首先我们先了解一下 召回率和 f1. 真实结果 预测结果 预测结果   正例 反例 正例 TP 真 ...

  4. 数据处理:2.异常值处理 & 数据归一化 & 数据连续属性离散化

    1.异常值分析 异常值是指样本中的个别值,其数值明显偏离其余的观测值.异常值也称离群点,异常值的分析也称为离群点的分析. 异常值分析 → 3σ原则 / 箱型图分析异常值处理方法 → 删除 / 修正填补 ...

  5. matlab将矩阵数据归一化到[0,255]

    matlab将矩阵数据归一化到[0,255]     function OutImg = Normalize(InImg) ymax=255;ymin=0; xmax = max(max(InImg) ...

  6. 数据归一化Feature Scaling

    数据归一化Feature Scaling 当我们有如上样本时,若采用常规算欧拉距离的方法sqrt((5-1)2+(200-100)2), 样本间的距离被‘发现时间’所主导.尽管5是1的5倍,200只是 ...

  7. MATLAB实例:聚类初始化方法与数据归一化方法

    MATLAB实例:聚类初始化方法与数据归一化方法 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 1. 聚类初始化方法:init_methods.m f ...

  8. 机器学习 —— 数据预处理

    对于学习机器学习算法来说,肯定会涉及到数据的处理,因此一开始,对数据的预处理进行学习 对于数据的预处理,大概有如下几步: 步骤1 -- 导入所需库 导入处理数据所需要的python库,有如下两个库是非 ...

  9. 数据归一化 scikit-learn中的Scaler

    1 import numpy as np 2 from sklearn import datasets 3 4 # 获取数据 5 iris = datasets.load_iris() 6 X = i ...

随机推荐

  1. java基础之bit、byte、char、String

    bit 位,二进制数据0或1 byte 字节,一个字节等于8位二进制数 char 字符, String 字符串,一串字符 常见转换 1 字母  = 1byte = 8 bit 1 汉字  = 2byt ...

  2. Go struct tag

    struct成员变量标签(Tag)说明 要比较详细的了解这个,要先了解一下golang的基础,在golang中,命名都是推荐都是用驼峰方式,并且在首字母大小写有特殊的语法含义:包外无法引用.但是由经常 ...

  3. SecureCRT按退格键出现^H问题

    1.  选择选项>>会话选项>>终端>>映射键

  4. window 安装 thrift

    1.下载thrift:http://thrift.apache.org/ 2.然后将该执行文件,保存到磁盘的文件夹下(你自己喜欢的,随便一个个目录下) 我的是(目录名少了个t,无妨): 3.把该执行文 ...

  5. [BZOJ4730][清华集训2016][UOJ266] Alice和Bob又在玩游戏

    题意:俩智障又在玩游戏.规则如下: 给定n个点,m条无向边(m<=n-1),保证无环,对于每一个联通块,编号最小的为它们的根(也就是形成了一片这样的森林),每次可以选择一个点,将其本身与其祖先全 ...

  6. json数据的拼接与解析

    json数据格式 [{ "firstName": "Brett", "lastName":"McLaughlin", & ...

  7. HYSBZ 1500 维修数列(伸展树模板)

    题意: 题解:典型伸展树的题,比较全面. 我理解的伸展树: 1 伸展操作:就是旋转,因为我们只需保证二叉树中序遍历的结果不变,所以我们可以旋转来保持树的平衡,且旋转有左旋与右旋.通过这种方式保证不会让 ...

  8. Codeforces 893E Counting Arrays:dp + 线性筛 + 分解质因数 + 组合数结论

    题目链接:http://codeforces.com/problemset/problem/893/E 题意: 共q组数据(q <= 10^5),每组数据给定x,y(x,y <= 10^6 ...

  9. Codeforces 888D Almost Identity Permutations:错排公式

    题目链接:http://codeforces.com/problemset/problem/888/D 题意: 给定n,k,问你有多少种1到n的排列,满足至少有n-k个a[i] == i. (4 &l ...

  10. 解决:在Eclipse中运行monkeyrunner脚本报错: IOError: (2, 'File not found - D:\\workspace\\monkeyrunner_test01 (\u62d2\u7edd\u8bbf\u95ee\u3002)')

    在eclipse中搭建运行monkeyrunner脚本的环境,请见lynnLi的博客monkeyrunner之eclipse中运行monkeyrunner脚本之环境搭建(四) 但在实践中,状况确实层出 ...