python数据科学-数据预处理

总第88篇

数据预处理是我们在做机器学习之前必经的一个过程,在机器学习中常见的数据预处理包括缺失值处理,缩放数据以及对数据进行标准化处理这三个过程。

01|缺失值处理:

缺失值处理是我们在做数据分析/机器学习过程中经常会遇到的问题,我们需要一种处理不完整数据的策略/方法。对缺失值处理有两种方法,一种是直接对某一列中的缺失值进行处理,一种是根据类别标签,分类别对缺失值进行处理。

我们先看如何在没有类别标签的情形下修补数据。比较简单粗暴的方法就是直接忽略,也就是删除缺失值,这种策略适用于数据集中缺失值占比很小,去掉其以后对整体影响不大的情况。这里需要注意的是删除某一个缺失值时,需要把和该值一个维度/行的值也一起删除,但是其他值可能对数据整体的影响比较大,所以用这种方法的时候要慎重

一种可以避免这种情况的方法就是给缺失值赋予一个值,这个值一般就是该缺失值所在列的均值、中位数之类的。我们这里用sklearn库中的preprocessing模块中的Imputer()函数来处理缺失值。

#加载库
from sklearn.datasets import load_iris
from sklearn.preprocessing import Imputer
import numpy as np
import numpy.ma as ma

#加载数据集
data=load_iris()
x=data["data"]
y=data["target"]

#将原始数据复制一份
x_t=x.copy()

#在第2行制造一些缺失值
x_t[2,:]=np.repeat(0,x.shape[1])

#创建Imputer对象,采用平均值策略
imputer=Imputer(missing_values=0,strategy="mean")#先声明一个替换策略
x_imputed=imputer.fit_transform(x_t)#让x_t利用该策略

print(x_t)

制造缺失值以后的数据

填充缺失以后的数据

preprocessing.Imputer函数解释:

sklearn.preprocessing.Imputer(missing_values=’NaN’, strategy=’mean’, axis=0, verbose=0, copy=True)
#missing_values为待替换的缺失值,可以为NaN,也可以为具体数值
#strategy为替换策略,有mean、medium、most_frequent分别表示均值、中位数、众数三者来填充
#axis=0表示按列填充,1表示按行填充
#copy设置为False时表示不在原数据基础上修改

关于Imputer的用法

缺失值处理对应于pandas库中的方法为dropna()删除缺失值;fillna()填充缺失值。

dropna()默认删除任何含有缺失值的行;传入参数“how=”all””表示删除全是缺失值的行;传入参数“axis=1”可删除含有缺失值的列。

fillna()一般情况下会给定一个常数,会把数据集中的所有缺失值替换成该常数,比如fillna(0);也可以实现对不同列中的缺失值进行不同的替换,比如df.fillna({1:0.5,3:1})表示将第一列(从0开始计数)中的缺失值替换成0.5,第三列中的缺失值替换成1;传入参数“inplace=True”表示对源数据进行修改。这里面填充的具体的常数值也可以直接换为中位数,平均数之类的,比如df.fillna(data.mean())就表示用平均值填充。

我们有的时候可能需要根据类别(比如我们要根据性别这个分类来分别给身高这个缺失值进行填充)分别进行缺失值的处理,这个时候需要先把不同类别的数据找出来,这里用的是np.where()函数,该函数在前面有提到,用该函数找出不同类别以后,处理方法就和不分类别处理的方法一致,只不过是根据类别的不同,处理的次数不同。

02|缩放数据:

缩放数据集的目的是为了防止“大数吃小数”的现象发生,大数吃小数就类似于生活中同样一个环境下声音大的盖过声音小的,最后导致只能听见声音大的发声,导致了最后的结果只考虑了声音较大的那一部分,而忽略了声音较小的那一部分,但实际中声音小的也需要被听到,为了防止这种声音大的盖过声音小的现象的发声,我们采取了一定的限制,就是把所有的声音按照一定的规则限制在某一个区间内(在这个区间内,能够保证不管声音大小都会被听到),你声音再大也不能超过这个限制的最大值。我们把这个过程称为数据的缩放(当然了,刚刚举得那个例子是缩的方面)。

上面那个在生活中的例子,而在机器学习的学习过程中,也会有很多特征之间出现上面大数吃小数的问题,所以我们在进行学习之前,需要先对数据进行预处理以后再进行学习。

#加载库
import numpy as np

#生成待缩放的随机数
np.random.seed(10)
x=[np.random.randint(10,25)*1.0 for i in range(10)]

#定义缩放函数
def min_max(x):
    return([round((xx-min(x))/(1.0*(max(x)-min(x))),2) for xx in x])

#对给定的数据进行缩放
print(x)
print(min_max(x))
np.random.seed()#用于指定随机数生成时所用算法开始的整数值。
np.random.randint(low,high=None,size=None)#生成在半开半闭区间[low,high)上离散均匀分布的整数值,若high=None,则取值区间变为[0,low)。
round(x,a)#用来返回浮点数的四舍五入值,x表示待处理的值,a表示保留的位数。

np.round()实例

把数据缩放到(0,1)范围内除了上面提到的自定义一个函数以外,还可以通过preprocessing.MinMaxScaler()进行实现。

关于preprocessing.MinMaxScaler的一些注意事项,该函数对象需要是多维数组&float类型数,要不然会报错,虽然也能出来结果。

关于数据缩放:

通常情况下是把数据缩放到[0,1]区间内,公式是(x-min(x)/(max(x)-min(x)),我们上面用到的就是这种方式,当然了也可以将值缩放到任意区间内[nr_min,nr_max],公式是(x-min(x))/(max(x)-min(x))*(nr_max-nr_min)+nr_min

03|标准化数据:

所谓的标准化就是将给定向量转换成平均值为0,标准差为1的形式。公式如下:X=x-mean(value)/std(x)

#加载库
import numpy as np
from sklearn.preprocessing import scale

#生成随机数
np.random.seed(10)
x=[np.random.randint(10,25)*1.0 for i in range(10)]

#数据标准化
x_centered=scale(x,with_mean=True,with_std=False)
x_standard=scale(x,with_mean=True,with_std=True)

print("x:{}".format(x))
print("x_centered:{}".format(x_centered))
print("x_standard:{}".format(x_standard))

输出结果如下:

x:[19.0, 23.0, 14.0, 10.0, 11.0, 21.0, 22.0, 19.0, 23.0, 10.0]
x_centered:[ 1.8  5.8 -3.2 -7.2 -6.2  3.8  4.8  1.8  5.8 -7.2]
x_standard:[ 0.35059022  1.12967961 -0.62327151 -1.4023609  -1.20758855  0.74013492
  0.93490726  0.35059022  1.12967961 -1.4023609 ]

关于preprocessing.scale函数解释:

sklearn.preprocessing.scale(X, axis=0, with_mean=True,with_std=True,copy=True)

#参数解释:
#X:数组或者矩阵
#axis:int类型,初始值为0,axis用来计算均值 means 和标准方差 standard deviations. 如果是0,则单独的标准化每个特征(列),如果是1,则标准化每个观测样本(行)。
#with_mean: boolean类型,默认为True,表示将数据均值规范到0
#with_std: boolean类型,默认为True,表示将数据方差规范到1

缩放和标准化分别是归一化的两种不同方式。关于归一化具体在机器学习中的应用,我们在之后再说。

原文发布于微信公众号 - 张俊红(zhangjunhong0428)

原文发表时间:2017-12-02

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏ATYUN订阅号

【学术】一篇关于机器学习中的稀疏矩阵的介绍

AiTechYun 编辑:Yining 在矩阵中,如果数值为0的元素数目远远多于非0元素的数目,并且非0元素分布无规律时,则称该矩阵为稀疏矩阵;与之相反,若非0...

74140
来自专栏机器之心

教程 | 简述表征句子的3种无监督深度学习方法

选自Medium 作者:yonatan hadar 机器之心编译 参与:Nurhachu Null、路 本文介绍了三种用于表征句子的无监督深度学习方法:自编码器...

54650
来自专栏红色石头的机器学习之路

Coursera吴恩达《神经网络与深度学习》课程笔记(3)-- 神经网络基础之Python与向量化

上节课我们主要介绍了逻辑回归,以输出概率的形式来处理二分类问题。我们介绍了逻辑回归的Cost function表达式,并使用梯度下降算法来计算最小化Cost f...

36200
来自专栏人工智能LeadAI

GoogLeNet的心路历程(二)

本文介绍关于GoogLeNet的续作,习惯称为inception v2,如下: [v2] Batch Normalization: Accelerating D...

38060
来自专栏机器之心

基于注意力机制,机器之心带你理解与训练神经机器翻译系统

71880
来自专栏机器之心

学界 | 谷歌大脑提出对抗正则化方法,显著改善自编码器的泛化和表征学习能力

无监督学习的目标之一是不依靠显式的标注得到数据集的内在结构。自编码器是一种用于达成该目标的常见结构,它学习如何将数据点映射到隐编码中——利用它以最小的信息损失来...

10420
来自专栏SeanCheney的专栏

《Scikit-Learn与TensorFlow机器学习实用指南》 第15章 自编码器

自编码器是能够在无监督的情况下学习输入数据的有效表示(叫做编码)的人工神经网络(即,训练集是未标记)。这些编码通常具有比输入数据低得多的维度,使得自编码器对降维...

15030
来自专栏机器之心

教程 | 从字符级的语言建模开始,了解语言模型与序列建模的基本概念

选自imaddabbura 机器之心编译 你有没有想过 Gmail 自动回复是如何进行的?或者手机在你输入文本时如何对下一个词提出建议?生成文本序列的通常方式是...

42250
来自专栏AI科技评论

开发 | 如何把时间序列问题转化为监督学习问题?通俗易懂的 Python 教程

AI科技评论按:本文作者 Jason Brownlee 为澳大利亚知名机器学习专家,对时间序列预测尤有心得。原文发布于其博客。 Jason Brownlee ...

36050
来自专栏数据小魔方

Stata特别篇(下)——多变量图表汇总!

今天跟大家分享Stata特别篇的下篇——多变量图表汇总! 在多变量图表中,增加的变量仅仅限于定距变量,也可以是定类变量。 打开数据集: use "D:\Sta...

87150

扫码关注云+社区

领取腾讯云代金券