《python3数据分析与机器学习实战》读书笔记

《python3 数据分析与机器学习实战》, 龙马高新教育编著, 北京大学出版社.

新知识

  • 可以统计每列或每行的最小数或最大值所在的列或行

数据清洗

缺失值处理

  • 数据过滤
  • 数据填充
  • 插值法:拉格朗日插值法、牛顿插值法、分段插值法、样条插值法、Hermite插值法
  • 回归法:把含有缺失值的变量当作因变量进行预测

异常值处理

异常数据也叫离群点,可通过画图一目了然
正常的判断方法如下:

  • 异常值可以看作是那些数据和平均值的偏差超过3倍标准差的值
  • 箱型图来判断,可以直观地表示数据的分布情况,如果数据超出箱型图地上界或下界都认为是异常值

教科书上的处理方法:

  • 不处理
  • 视为缺失值,用处理缺失值的那些办法
  • 直接删除该样本
  • 平均值修正:使用前后两个观测值的平均值代替,或者使用整个数据集的平均值代替

噪声的处理

一般方法有分箱、聚类和回归,近年来还有小波等技术也在发展

糟了,这个东西在比赛里我几乎没有考虑过,倒是在时序数据中特别常见

分箱

把某变量A按照一定的规则放入一些箱子(区间)内,考察每一个箱子中的数据,然后按照某种方法对各个箱子中的数据进行处理。

在分箱时,要考虑清楚如何分箱还有如何对每个箱子中的数据进行平滑处理。

  • 等深分箱法:将数据集按照样本行数分箱,每箱具有相同的样本个数,每箱的样本数就是箱子的深度。这种办法最简单。
  • 等宽分箱法:使数据集在整个属性值的区间上平均分布,即每个箱子的区间范围是一个常量,称为箱子的宽度。
  • 自定义区间,当有需要明确观察某些区间范围内的数据分布时。

分箱后的平滑处理办法:

  • 按平均值平滑:对同一箱子中的数据求平均值,用平均值替代该箱子中的所有数据。
  • 按边界值平滑:用距离较小的边界值替代箱中每一个数据。
  • 按中值平滑:取箱子的中值,用来替代箱子中的所有数据。

聚类

将物理的或抽象对象的集合分组为由类似的对象组成的多个类,然后找出并清除那些落在簇之外的点,这些孤立点被称为噪声数据。

回归

试图发现两个相关的变量之间的变化模式,通过使数据适合一个函数来平滑数据,即通过建立数学模型来预测下一个数值,所采用的方法一般包括线性回归和非线性回归。

数据变换

如果数据较大,可以取对数或开方将数据压缩变小;如果数据较小可以使用平方扩大数据。在时间序列分析中,经常会使用对数变换或差分运算处理非平稳序列。

归一化、标准化

连续函数离散化,常用的离散方法如下:

  • 等宽法:将数据划分为具有相同宽度的区间,然后将数据按照其值分配到不同的区间,一个区间一个值。
  • 等频法:和等宽法不同的是,每个区间的数据个数相等。
  • 聚类法:用聚类分析的方法确定新的值。

数据规约

是指在尽可能保持数据原貌的前提下,最大限度地精简数据量。

维归约:用过减少特征来压缩数据量,例如AIC准则可以通过选择最优模型来选择变量;lasso通过一定的约束条件选择变量;小波、PCA通过把原数据变换或投影到较小的空间来降低维数;分类树、随机森林通过对分类效果的影响大小筛选变量。

样本规约:从数据集中选出一个有代表性的样本的子集。参数方法中使用模型估计数据,就可以只存放模型参数代替存放实际数据,如回归模型和对数模型都考研用来进行参数化数据归约;而非参数方法可以使用直方图、聚类、抽样和数据立方体聚集的方法。

关联分析

一种无监督机器学习方法,主要用于发现大规模数据集中事物之间的依存性和关联性。挖掘数据中隐藏的有价值的关系,如频繁项集,关联规则,有利于对相关事物进行预测,也能帮助系统制定合理的决策。

交叉验证

train_test_split
设置随机种子数按照比例把df分成训练和测试集

cross_val_score
对df进行指定次数的交叉验证 有得分 默认使用KFoldStratifiedKFold

K折交叉验证

是将数据集分成K份的官方给定方案,K折就是将数据集通过K次分割,使得所有的数据既在训练集中出现过,也在测试集出现过,且每次分割不会有重叠。

1
2
3
from sklearn.model_selection import KFold
kf = KFold(n_splits = 2) #两次
for train, test in kf.split(X):

LeaveOneOut

KFold的一个个例,留一验证法。常用于数据集数目较少时。N个样本采用留一法,就是将样本打乱,均分为N份,轮流选择其中N-1份训练,剩余的一份做验证,计算误差平方和,最后把N次的预测误差平方和做平均作为选择最优模型结构的依据。

1
2
3
from sklearn.model_selection import LeaveOneOut
loo = LeaveOneOut()
for train, test in loo.split(X):

大体翻完了,感觉内容说深不深,说浅不浅的,一般。