阅读宋立恒《AI制胜:机器学习极简入门》第2章:机器学习中的数据预处理
Posted howard2005
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了阅读宋立恒《AI制胜:机器学习极简入门》第2章:机器学习中的数据预处理相关的知识,希望对你有一定的参考价值。
数据预处理是进行数据分析的第一步,如何获取干净的数据是分析效果的前提。如果你想要你的努力获得效果(模型获得更好的预测结果),就必须对数据做预处理。
一、数据预处理的重要性和原则
机器学习人工智能的爱好者,往往在获得数据后,就开始疯狂地想套用一个算法模型,迫不及待地把数据往里面“喂”。当你信心满满地开始运行后,你会看到下面显示一行一行的红色字体,大体意思是这里数字无效,这时候心态就崩溃了。数据科学家在他们的工作中有50%到80%的时间花费在收集和准备不规则数据的这种更为平凡的任务中,然后才能探索有用的价值。
在机器学习中数据是王道,较好的数据经过不同的模型训练后,其预测结果差距不是太大。在真实数据中,我们拿到的数据可能包含了大量的缺失值,可能包含大量的噪音,也可能因为人工录入错误(如医生的诊断记录)导致有异常点存在,对我们挖掘出有效信息造成了一定的困扰,所以我们需要通过一些方法,尽量提高数据的质量。在机器学习中,数据的质量关乎机器学习任务的成败、直接影响着预测的结果。
那么对于数据的预处理,有如下常用的处理原则和方法。
- (1)针对数据缺失的问题,我们虽然可以将存在缺失的行直接删除,但这不是一个好办法,还很容易引发问题。因此需要一个更好的解决方案。最常用的方法是,用其所在列的均值来填充缺失。
- (2)不属于同一量纲,即数据的规格不一样,不能够放在一起比较。
- (3)对于某些定量数据,其包含的有效信息为区间划分,例如学习成绩,假如只关心“及格”或“不及格”,那么需要将定量的考分,转换成“1”和“0”表示及格和不及格。二值化可以解决这一问题。
- (4)大部分机器学习算法要求输入的数据必须是数字,不能是字符串。需要将描述变量转化为数字型变量,因为大部分算法无法直接处理描述变量。
- (5)某些算法对数据归一化敏感,标准化可大大提高模型的精度。标准化即将样本缩放到指定的范围,标准化可消除样本间不同量级带来的影响(大数量级的特征占据主导地位;量级的差异将导致迭代收敛速度减慢;所有依赖于样本距离的算法对于数据的量级都非常敏感)。
- (6)在数据集中,样本往往会有很多特征,并不是所有特征都有用,只有一些关键的特征对预测结果起决定性作用。
二、数据预处理方法介绍
当我们拿到一批原始的数据,步骤如下:
- (1)首先要明确有多少特征,哪些是连续的特征,哪些是类别的特征?
- (2)检查有没有缺失值,对确实的特征选择恰当方式进行弥补,使数据完整。
- (3)对连续的数值型特征进行标准化,使得均值为0,方差为1。
- (4)对类别型的特征进行独热编码(One-Hot Encoding)。
- (5)将需要转换成类别型数据的连续型数据进行二值化。
- (6)为防止过拟合或者其他原因,选择是否要将数据进行正则化。
数据预处理的工具有许多,主要有两种:Pandas数据预处理和scikit-learn中的sklearn.preprocessing数据预处理。本章主要使用sklearn.preprocessing包进行数据预处理。
(一)数据预处理案例——标准化、归一化、二值化
在机器学习算法实践中,我们往往有着这些需求:将不同规格的数据转换到同一规格中用,或将不同分布的数据转换到某个特定分布中,这种需求统称为将数据“无量纲化”
。标准化则是将数据按照比例缩放,使之放到一个特定区间中。标准化后数据的均值=0,标准差=1,因而标准化的数据可正可负,只不过归一化是将数据映射到了[0, 1]这个区间中。
把数据缩放到给定的范围内,通常在0和1之间,或者使用每个特征的最大绝对值按比例缩放到单位大小。在大多数机器学习算法中,会选择StandardScaler
来进行特征缩放,因为MinMaxScaler
对异常值非常敏感。在PCA、聚类、逻辑回归、支持向量机、神经网络这些算法中,StandardScaler往往是最好的选择。MinMaxScaler在不涉及距离度量、梯度、协方差计算以及数据需要被压缩到特定区间的情况下使用广泛,比如数字图像处理中量化像素强度时,都会使用MinMaxScaler将数据压缩于[0, 1]区间之中。
程序代码如下:
import numpy as np
data = np.array([[3, -1.7, 3.5, -6],
[0, 4, -0.3, 2.5],
[1, 3.5, -1.8, -4.5]])
print('原始数据:')
print(data)
from sklearn.preprocessing import StandardScaler
data_standardscaler = StandardScaler().fit_transform(data)
print('原始数据使用StandardScaler进行数据标准化处理后:')
print(data_standardscaler)
from sklearn.preprocessing import MinMaxScaler
data_minmaxscaler = MinMaxScaler(feature_range=(0, 1)).fit_transform(data)
print('原始数据使用MinMaxScaler进行归一化处理(范围缩放到[0-1])后:')
print(data_minmaxscaler)
from sklearn.preprocessing import Binarizer
data_binarizer=Binarizer().fit_transform(data)
print('原始数据使用binarizer进行二值化处理后:')
print(data_binarizer)
运行上面这段代码,结果如下图所示:
StandardScaler标准化的原理是将特征数据的分布调整成标准正态分布,也叫高斯分布,也就是使得数据的均值为0,方差为1,这样就可以确保数据的“大小”都是一致的,这样更有利于模型的训练。而MinMaxScaler把所有的数据缩放到0和1之间。除了对数据进行缩放之外,我们还可以使用Binarizer对数据进行二值化处理,将不同的数据全部处理为0或1这两个数值。归一化其实就是标准化的一种方式,只不过归一化是将数据映射到[0, 1]这个区间中。
如果随机变量
X
X
X的概率密度为
f
(
x
)
=
1
2
π
σ
e
−
(
x
−
μ
)
2
2
σ
2
f(x)=\\displaystyle\\frac{1}{\\sqrt{2\\pi}\\sigma}e^{-\\frac{(x-\\mu)^2}{2\\sigma^2}}
f(x)=2πσ1e−2σ2(x−μ)2,
μ
,
σ
\\mu,\\sigma
μ,σ为常数,并且
σ
>
0
\\sigma>0
σ>0,则称
X
X
X服从正态分布,记为
X
∼
N
(
μ
,
σ
2
)
X \\sim N(\\mu, \\sigma^2)
X∼N(μ,σ2)
(二)数据预处理案例——缺失值补全、标签化
很多情况下,真实的数据集中会存在缺失值
,此时需要对缺失值进行处理。一种策略是将存在缺失值的整条记录直接删除。但是这样做可能会丢失一部分有价值的信息。更好的一种方法是推定缺失数据,例如根据已有数据推算缺失的数据。SKImputer
类能够提供一些处理缺失值的基本策略,例如使用缺失值所处的一行或者一列的均值、中位数或者出现频率最高的值作为缺失数据的取值。 我们得到的数据可能由于各种原因存在缺失。为了不降低机器学习模型的性能,我们可以通过一些方法处理这些数据,比如使用整列数据的平均值或中位数来替换丢失的数据。
Label Encoder
就是把label编码。比如label是一串地名,是无法直接输入到sklearn的分类模型里作为训练标签的,所以需要先把地名转成数字。这里Label Encoder就是帮你做这件事的。
范例程序代码如下:
import numpy as np
print("###########缺失值补全##############")
from sklearn.preprocessing import Imputer
imp = Imputer(missing_values='NaN', strategy='mean', axis=0)
# 训练模型,拟合出作为替换值的均值
imp.fit([[1, 2], [np.nan, 3], [7, 6]])
x = [[np.nan, 2], [6, np.nan], [7, 6]]
print(x) # 处理需要补全的数据
print(imp.transform(x))
print("##LabelEncoder_标准化标签,将标签值统一转换成range(标签值个数-1)范围内#")
from sklearn import preprocessing
data = ["Japan", "China", "Japan", "Korea", "China"]
print(data)
le = preprocessing.LabelEncoder()
le.fit(data)
print('标签个数: %s' % le.classes_)
print('标签值标准化: %s' % le.transform(data))
data2 = ["Japan", "China", "China", "Korea", "Korea"]
print(data2)
print('标签值标准化: %s' % le.transform(data2))
运行这个范例程序,结果报错,如下图所示:
解决方案:Imputer类已经被废弃掉了,建议使用SimpleImputer类。
运行程序,查看结果:
使用sklearn.impute
库中的SimpleImputer
类来完成这项任务。SimpleImputer
参数解释:
missing_values
:缺失值,可以为整数或np.nan,默认为np.nan。strategy
:替换策略,默认用均值“mean
”替换,还可以选择中位数“median
”或众数“most_frequent
”。
以上是关于阅读宋立恒《AI制胜:机器学习极简入门》第2章:机器学习中的数据预处理的主要内容,如果未能解决你的问题,请参考以下文章