阅读宋立恒《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π σ1e2σ2(xμ)2 μ , σ \\mu,\\sigma μσ为常数,并且 σ > 0 \\sigma>0 σ>0,则称 X X X服从正态分布,记为 X ∼ N ( μ , σ 2 ) X \\sim N(\\mu, \\sigma^2) XN(μ,σ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章:机器学习中的数据预处理的主要内容,如果未能解决你的问题,请参考以下文章

微软资深算法工程师为AI初学者量身打造的机器学习入门书上市啦!

[AI]SKLearn章1 快速入门

187张图入门机器学习(含MATLAB代码)

Python3入门机器学习经典算法与应用

机器学习实战 - ApacheCN

第 2 章 监督学习Python机器学习基础教程