SDU项目实训记录1.4——数据预处理基础
一、标准化和归一化
该项目不需要对数据进行标准化和归一化处理
二、拆分数据集
1、数据集划分
机器学习数据集通常划分为三个部分:
- 训练集: 用于模型拟合的数据样本
- 测试集: 用来评估模最终模型的泛化能力
- 验证集: 是模型训练过程中单独留出的样本集,它可以用于调整模型的超参数和用于对模型的能力进行初步评估
2、流程与方法
(1)留出法
留出法(hold_out)直接将数据集划分为训练集和测试集(不含验证集)
(2)K折交叉验证法
- 先将数据集D划分为 K K K个大小相同的互斥子集,即 D = D 1 ∪ D 2 ∪ ⋯ ∪ D k D=D_{1} ∪ D_{2} ∪ \dots ∪ D_{k} D=D1∪D2∪⋯∪Dk
- 建立第1个划分结果:用第1个子集作为测试集,第2~ K K K个子集作为训练集
- 建立第2个划分结果:用第2个子集作为测试集,其余子集作为训练集
- 这样一共可以得到 K K K组划分,从而可以进行 K K K次模型的训练。每次训练使用该组划分中的训练集,并用测试集评估结果;最后把这 K K K个测试集评估结果的均值作为最终评估结果。
- 关于 K K K的取值,主要是要保证有足量的训练数据。当总体数据量比较小的时候, K K K值可以稍微设置大一些,这样训练集占整体比例就比较大。相反,数据量比较大的时候, K K K值可以设置的小一些。
下图是
K
=
10
K=10
K=10的交叉验证数据划分方法图示:
(3)留一法
- 在K折交叉验证法中,如果设置 K = 1 K=1 K=1,则始终只保留1个样本作为测试集。这种方法称为留一法
- 它的优点是可以保证训练集尽可能大。这对于有限数据来说比较有意义
(4)自助法
- 针对具有 N N N个样本数据集D,每次从D中有放回地采样,获取一个样本放入D’,直到 D’的样本数达到 N N N
- 由于是有放回的采样,所以D’中存在重复的样本,而且D中有部分样本不会出现在D’中
- 以D’为训练集,没有在D’出现的样本作为测试集
- 何种方法在数据集小、难以有效划分训练集/测试集时很有用,不过它会改变数据集的分布会,引入偏差
上述方法都只实现了划分训练集和测试集。如果希望再划分出验证集,可采用下列办法:
- 使用留出法,将数据集划分成初始训练集和测试集
- 使用K折交叉法,把初始训练集生成 K K K个划分结果,每个结果均包含训练集和验证集(此时验证集就是该划分的测试集)
3、技术与实现
(1)使用自定义方法划分训练集和测试集
- 将数据样本打乱以后,从头部开始取若干个样本作为训练集,剩余的样本作为测试集
- 使用np.random.shuffle、np.random.permutation等函数来打乱数据
(2)调用库函数划分训练集和测试集
- 使用sklearn.model_selection.train_test_split函数,直接指定测试集样本的数量占比
(3)调用库函数实现K折交叉验证法
- sklearn.model_selection.KFold:无放回采样
- sklearn.model_selection.RepeatedKFold:是有放回的采样(本演练不演示)
- sklearn.model_selection.LeaveOneOut:留一法实现(本演练不演示)
- sklearn.model_selection.StratifiedKFold:与KFold类似,但是将保持样本的均衡性。
- sklearn.model_selection.StratifiedShuffleSplit:与StratifiedKFold类似,但可以指定测试样本数据所占的比重
三、文本的数值化处理
该项目数据不存在文本类型数据
四、检测和处理缺失值与重复值
1、流程与方法
(1)缺失值的处理方法-删除法
- 将缺失值所在的行删除,或者删除缺失值对应变量字段(如果该变量含有缺失值比例过大)
- 可能产生的问题
- 丢失被删除的样本或字段中隐藏的重要信息
- 产生数据偏移,例如原本的正态分布变为非正态分布
- 适用范围:样本数据量大且缺失值不多
(2)缺失值的处理方法-单变量插补
- 仅仅在缺失字段内部进行某些统计计算,将计算结果作为缺失值。这种方式不考虑其它字段对本缺失字段的影响。
- 填补方法
- 平均值填补:计算该字段的平均值作为缺失值的默认值。适合正态分布的数值型变量
- 中位数填补:计算该字段的中位数作为缺失值的默认值,适合偏态分布的数值型变量
- 众数填补:统计该字段中出现次数最多的取值,作为缺失值的默认值,适合文本型变量
- 临近值填补:使用样本的前一个或后一个样本所对应字段值作为该样本的默认值
- 可能产生的问题:
- 扭曲目标变量的分布,可能错误判断了变量与变量之间的关系
(3)缺失值的处理方法-多变量插补
- 以缺失字段为结果(因变量),以其它字段为特征(自变量),建立机器学习模型,预测缺失字段的值
- 填补方法:
- K-近邻算法填补:对于需要填补缺失字段的样本,先利用欧氏距离找到其邻近的 K K K个样本(计算距离时不计入缺失字段),再将这 K K K个邻近的值进行加权平均进行填补
- 随机森林填补:以待填补的缺失字段为目标,基于其它字段训练随机森林模型,用模型预测缺失字段的值
- 迭代插补:
- 如果有多个字段存在缺失值,则先选择其中1个字段作为结果 y y y,其它字段作为特征 X X X
- 使用一个回归器来在不含缺失y值的样本上对 ( X , y ) (X, y) (X,y)进行拟合,然后使用这个回归器来预测缺失样本的y值
- 该字段预测完成后,换到下一个缺失字段作为结果 y y y,其它字段作为特征 X X X,继续进行回归
- 以迭代的方式对每个特征依次进行,重复若干轮,最后一轮的计算结果作为最终的填充结果
(4)缺失值的处理方法-多重插补(Multiple Imputation)
- 多重填补方法分为三个步骤:
- 插补:将不完整数据集缺失的观测行估算填充 M M M次,这将生成 M M M个完整的数据集。估算方法可以采用前述单变量插补或多变量插补,但更好的方法是采用马尔科夫链蒙特卡洛模拟(MCMC,Markov Chain Monte Carlo Simulation)
- 分析:针对 M M M个数据集分别使用统计方法(例如线性或广义线性模型)进行统计分析
- 合并:对来自各个插补数据集的统计分析结果,根据评分函数进行选择,产生最终的插补值
- R语言的mice包提供了经典的多重插补实现,Python提供了miceforest包进行处理。本演练不包括多重插补的内容
(5)重复值判断和处理的方法
- 判断两个样本是否重复,一般应先指定其中的若干个字段,如果对应字段的值都相同,则视为重复样本
- 对于重复样本,一般来说是仅保留1条。但具体是保留哪一条,则可能需要根据其它字段的取值,或者样本的顺序来确定
2、技术与实现
(1)判断和检测缺失值
- pandas.DateFrame.isnull()
(2)直接删除缺失值
- pandas:DateFrame.dropna
(3)缺失值填充
- 单变量插补:pandas.DataFrame.fillna、sklearn.impute.SimpleImputer
- 多变量插补:sklearn.impute.IterativeImputer、sklearn.impute.KNNImputer、sklearn.ensemble.RandomForestRegressor
(4)重复值检测与删除
- 检测指定字段是否具有重复值:pandas.DataFrame.duplicated
- 删除指定字段具有重复值的行(保留1行):pandas.drop_duplicates
五、离散化和分箱处理
1、流程与方法
(1) 离散化的一般步骤
- 确定需要多少个类别值
- 如何将原数据离散化处理映射到对应的类别值上
- 例如针对连续值,将原数据的连续值进行排序后,指定n个类别也就是n-1个分割点划分为n个区间,将处于同一个区间内的数据映射到相同的类别上
(2) 离散化处理方法
- 等宽法
- 根据属性的值域来划分,使每个区间的宽度相等
- 例如数组[4,18,19,22,14,8,9,13,10 ]划分为三组,区间分别是[4,10],(10,16],(16,22] 分组结果是[4,8,9,10],[13,14],[18,19,22]
- 等频法
- 等频分组也叫分位数分组,即分组后,每个分组的元素个数是一样的
- 例如数组[1, 7, 12, 12, 22, 30, 34, 38, 46],需要分成三组,分组后的结果:[1, 7, 12],[12, 22, 30], [34, 38, 46]
- 卡方分箱
- 卡方分箱是基于合并的数据离散方法,它依赖于卡方检验。
- 原理:对于精确的离散化,相对类频率在一个区间内应当完全一致。因此,如果两个相邻的区间具有非常类似的类分布,则这两个区间可以合并;否则,它们应当保持分开
- 本演练不涉及卡方分箱
- K-Means聚类算法
- 将n个样本点划分为 K K K个簇,使得相似的样本尽量被分到同一个聚簇
- 二值化处理
- 这是一种比较极端的处理方式,通过指定一个阈值,大于阈值的数据划分为一个区间,其余数据划分到另一个区间
2、技术与实现
(1)二值化处理
- sklearn.preprocessing.Binarizer
(2)分箱处理
- numpy.digitize
- sklearn.preprocessing.KBinsDiscretizer
- pandas.cut
(3)聚类
- sklearn.cluster.KMeans