前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >机器学习笔记——特征标准化

机器学习笔记——特征标准化

作者头像
数据小磨坊
发布2018-10-23 10:02:03
6740
发布2018-10-23 10:02:03
举报
文章被收录于专栏:数据小魔方

数据标准化是在特征处理环节必不可少的重要步骤。

数据标准化是为了消除不同指标量纲的影响,方便指标之间的可比性,量纲差异会影响某些模型中距离计算的结果。

常见标准化方法主要有归一化、正态化。

数据归一化也即0-1标准化,又称最大值-最小值标准化,核心要义是将原始指标缩放到0~1之间的区间内。相当于对原变量做了一次线性变化。

其公式为 EX = (x- min)/(max - min)

另一种常用的标准化方法是z-score标准化,将原始指标标准化为均值为0,标准化为1的正态分布。

EX = (x - mean)/σ

R语言中的特征标准化:

代码语言:javascript
复制
library("caTools")
library("scales")
data(iris)

split = sample.split(iris$Species,SplitRatio = .8)
train_data = subset(iris,split == TRUE)
test_data  = subset(iris,split == FALSE)

train_data[,-5] = apply(train_data[,-5],2,rescale,to = c(0,1))
test_data[,-5] = apply(test_data[,-5],2,rescale,to = c(0,1))

以上scales包中的rescale函数可以自动完成指标中0-1标准化的任务,事实上,它可以将原始指标线性变化到任何一个数字区间内。

我们可以来验证结果是否是可信的。

代码语言:javascript
复制
range(train_data[,1])
range(apply(train_data[,-5],2,rescale,to = c(0,1))[,1])

[1] 4.3 7.7
[1] 0 1

当然你也可以自己写一个叫简单的0-1标准化函数

代码语言:javascript
复制
scale1 = function(x){
(x - min(x))/(max(x) - min(x))
}
range(apply(train_data[,-5],2,scale1)[,1])
[1] 0 1

z-score标准化

z-score标准化可以通过scale函数快速实现。

代码语言:javascript
复制
train_data[,-5] = scale(train_data[,-5])

mean(train_data[,1]);sd(train_data[,1])
[1] 5.869167
[1] 0.8259241

mean(scale(train_data[,-5])[,1]);sd(scale(train_data[,-5])[,1])
[1] 0
[1] 1

#自定义一个z-score标准化函数
z_norm = function(x){
  (x - mean(x))/sd(x)
}

mean(apply(train_data[,-5],2,z_norm)[,1]);sd(apply(train_data[,-5],2,z_norm)[,1])
[1] 0
[1] 1

Python中sk-learn库中有专门用于处理以上两种标准化的函数。

代码语言:javascript
复制
from sklearn import preprocessing
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_iris
import pandas as pdimport numpy as np

iris  = load_iris()
data = iris['data']
iris_data = pd.DataFrame(
         data = data,
         columns = ['sepal_length','sepal_width','petal_length','petal_width']
        )
iris_data["Species"] = iris[ 'target']
iris_data["Species"] = iris_data["Species"].map({0:"setosa",1:"versicolor",2:"virginica"})
x,y = iris_data.iloc[:,0:-1],iris_data.iloc[:,-1]
train_data,_data,train_target,test_target = train_test_split(x,y,test_size = 0.2,stratify = y)

Python中的0-1标准化

代码语言:javascript
复制
min_max_scaler = preprocessing.MinMaxScaler() #实例化0-1标准化方法
X_train_minmax = min_max_scaler.fit_transform(test_data.iloc[:,0:4].values)
X_test_minmax  = min_max_scaler.transform(test_data.iloc[:,0:4].values)

X_train_minmax[:,0].max() - X_train_minmax[:,0].min()1.0

Python中的z-score标准化

训练集第一列的均值和方差如下

代码语言:javascript
复制
train_data.iloc[:,0].mean();train_data.iloc[:,0].std()
5.86166666666666
40.8416853174847874
sc_X = preprocessing.StandardScaler()     #实例化z-score标准化方法
X_train = sc_X.fit_transform(train_data.iloc[:,0:4].values)
X_test  = sc_X.transform(test_data.iloc[:,0:4].values)

标准化后第一列的均值和方差
X_train[:,0].mean();X_train[:,0].std()
-2.2907601741432396e-151.0

以上仅介绍了最常用的两种标准化特征的方法及其实现,标准化的方法还有很多,对于什么的模型需要使用标准化以及适用什么方法的标准化,需要视具体场景和数据量级差异而定,小编也在摸索中。

标准化一方面可以防止原始特征中量纲差异影响距离运算(比如欧氏距离的运算)。 另一方面标准化也可以在一定程度上提升算法求解的效率。

https://www.coursera.org/learn/machine-learning

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-09-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据小魔方 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档