“水点将苦与乐连结
交织风光灿烂与失意“
——致敬最爱的梅西
机器学习系列专栏
选自 Python-Machine-Learning-Book On GitHub
作者:Sebastian Raschka
翻译&整理 By Sam
这次学习一些基础性的东西,那就是最基本但也很重要的一步——数据预处理。本篇学习笔记主要记录了一些常见的数据预处理的方法和思路,还是以python来实现,所以我也对学习中的code进行了保存,大家如果需要的话可以到公众号后台输入关键字 “预处理” 来获得呗,话不多说,马上开始今天的学习。
按照传统,先把本文的主体结构前置,如下:
处理数据缺失
删除有缺失的样本或特征
填充缺失值
处理分类数据
映射有序特性
对类别特征进行编码
对无序特征进行“独热编码”
学习划分训练及验证集
统一特征取值范围
选择有意义(有效)的特征
L1正则化的稀疏解
序列特征选择算法
使用随机森林评估特征重要性
PS:代码已单独保存:可在公众号后台输入“预处理”进行获取ipynb文件
处理数据缺失
数据缺失,在现实生活中是十分常见的,原因也是非常复杂的,在我们进行建模的过程中,如果我们不对这些缺失值进行适当的处理,出来的模型恐怕也效果不太好,其重要性这里就不累赘多说,我们先来创建一个小栗子,助于大家理解数据缺失的问题:
1import pandas as pd
2from io import StringIO
3csv_data = '''A,B,C,D
41.0,2.0,3.0,4.0
55.0,6.0,,8.0
610.0,11.0,12.0,'''
7# If you are using Python 2.7, you need
8# to convert the string to unicode:
9# csv_data = unicode(csv_data)
10df = pd.read_csv(StringIO(csv_data))
11df
output:
1# 查看各列缺失情况
2df.isnull().sum()
output:
我们创建了一个csv格式的数据并且读入DataFrame对象,如果想统计有多少缺失,我们可以使用isnull方法来返回一个值为布尔类型的DataFrame,判断每个元素是否缺失,如果元素缺失,值为True。然后使用sum方法,我们就能得到DataFrame中每一列的缺失值个数。
这里提示一下,预处理时推荐使用pandas的DataFrame格式,而不要用NumPy数组。由DataFrame对象得到NumPy数组很方便,直接通过values属性即可,然后就可以用sklearn中的算法了。
1.1 删除有缺失的样本或特征
那么,如果我们想要删除这些缺失的数据,处理的方式是怎么样的呢?下面给出了几种场景,都是使用dropna方法来实现的。
1# 删除含有缺失值的样本(即行)
2print (df.dropna())
3print ('\n')
4# 删除含有缺失值的特征(即列)
5print (df.dropna(axis=1))
6print ('\n')
7# 删除所有列都是缺失的样本
8print (df.dropna(how='all'))
9print ('\n')
10# 删除没有4个非空特征的样本
11print (df.dropna(thresh=4))
12print ('\n')
13# 删除指定特征上有缺失的样本(这里‘c'为指定特征)
14print (df.dropna(subset=['C']))
output:
1.2 填充缺失值
有些特征的缺失其实是可以通过填充的方式来弥补的,所以这里也介绍一下sklearn中的Imputer类方法。
参数axis:axis=0计算每个特征取值的平均值用来填充,若axis=1则计算样本所有取值的平均值用来填充;
参数strategy:包括mean、median和most_frequent(most_frequent对于处理分类数据类型的缺失值很有用)。
1from sklearn.preprocessing import Imputer
2# 这里使用均值填充
3imr = Imputer(missing_values='NaN', strategy='mean', axis=0)
4imr = imr.fit(df)
5imputed_data = imr.transform(df.values)
6imputed_data