项目实训写实记录No.3
作者:互联网
数据预处理
一.检测和处理缺失值与重复值
1.概念与机理
(1)完全变量与不完全变量
数据集中不含缺失值的变量(属性)称为完全变量,数据集中含有缺失值的变量称为不完全变量
(2)缺失值产生的原因
缺失值的产生的原因分为机械原因和人为原因。
- 前者是由于机器原因导致的数据收集或保存的失败造成的数据缺失。例如:数据存储的失败,存储器损坏,机械故障导致某段时间数据未能收集。
- 后者由于人的主观失误、历史局限或有意隐瞒造成的数据缺失。例如:在市场调查中被访人拒绝透露相关问题的答案,或者回答的问题是无效的,数据录入人员失误漏录了数据。
(3)缺失值产生的三种机制
以教育程度(自变量/特征)和收入水平(因变量/结果)关系的调查数据为例,考察收入水平字段的缺失情况:
- 完全随机缺失(Missing Completely At Random,MCAR):缺失的数据与自身和其它任何变量都没有关系
- 与自身无关:不管收入高的人还是收入低的人,都有同样的缺失率或缺失可能性;而不是:收入高的人有更多的理由或原因缺失数据,或者反之
- 与其它变量无关:不管教育程度高还是低,收入水平字段都有同等的缺失率。而不是:教育程度高的人有更大的可能性缺失收入水平数据,或者反之
- 对于完全随机缺失值,可以把含有缺失数据的样本直接删除,不会影响结果估计的准确性,只会影响精确性。例如,在不缺失情况下,估计的回归系数为0.6,那么删除缺失值后,系数估计值应该仍在0.6附近,只是由于样本数变少,标准误会增大,从而置信区间变宽
- 完全随机缺失是一种最理想的情况,然而实际中往往很难保证这一假定
- 随机缺失(Missing At Random,MAR):缺失变量与自身无关,但与其它变量有关
- 例如:如果收入字段的缺失与教育程度有关系(如教育程度高的人比教育程度低的人缺失的更多),但是与收入本身无关(高收入和低收入的人的缺失人数差不多),这种情况就是随机缺失
- 当数据有缺失的时候,可以检查自变量相对于缺失的因变量的分布情况。例如年龄、性别等自变量的取值,与收入字段的缺失值之间的统计关系
- 非随机缺失(missing not at random,MNAR):缺失与变量自身有关
- 例如:如果发现收入高的人更倾向于不填数据,而收入低的人一般都不缺失,说明收入的缺失是与自身变量有关的
- 这种情况比较棘手,相当于样本选择有偏(偏向于收入低的人),很可能对结果的可靠性造成不良影响
2.流程与方法
(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条。但具体是保留哪一条,则可能需要根据其它字段的取值,或者样本的顺序来确定
4.技术与实现
(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,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个簇,使得相似的样本尽量被分到同一个聚簇
- 二值化处理
- 这是一种比较极端的处理方式,通过指定一个阈值,大于阈值的数据划分为一个区间,其余数据划分到另一个区间
(1)二值化处理
- sklearn.preprocessing.Binarizer
(2)分箱处理
- numpy.digitize
- sklearn.preprocessing.KBinsDiscretizer
- pandas.cut
(3)聚类
- sklearn.cluster.KMeans
三.逻辑回归模型
(1)逻辑回归模型判别式
逻辑回归的模型判别式为:$ h_w(x)=g(w_0 x_0 + w_1 x_1 + \dots + w_d x_d)=g(\sum_{i=0}^{D} w_d x_d)=g(x*w) $
其中:
- x 0 , x 1 , … , x d x_0, x_1, \dots, x_d x0,x1,…,xd为特征, D D D为特征的总数
- w 0 , w 1 , … , w d w_0, w_1, \dots, w_d w0,w1,…,wd为权重参数
- h w ( x ) h_w(x) hw(x)代表判别式,用于根据传入的特征预测输出结果
- x 0 x_0 x0称为偏置项(intercept term/bias term),一般设置为1即可
-
g
g
g称为sigmoid激活函数,其定义为:$g(z)= \dfrac{1}{1+e^{-z}} $,该函数图像如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-y9CbHdjx-1625395663425)(./images/1.png)]- 可以看到,当 z = 0 z=0 z=0时, g ( z ) g(z) g(z)的值为0.5。一般情况下,低于0.5的 g ( z ) g(z) g(z)可以认为预测为false,高于0.5的预测为true
- g g g的结果可视为该样本属于某个分类的概率
- 激活函数相当于起了这样的作用:将一个连续的数值量,基于设定的阈值转变成离散的分类结果
- 逻辑回归是典型的二分类模型
(2)模型训练原理
- 根据给定的带有 N N N个样本的训练集,每个样本包括特征 x ( i ) x^{(i)} x(i)和分类标签 y ( i ) y^{(i)} y(i)。其中, ( i ) = 1 , 2 , … , D (i)=1,2,\dots,D (i)=1,2,…,D, x ( i ) x^{(i)} x(i)表示第 i i i个样本的特征, y ( i ) y^{(i)} y(i)表示第 i i i个样本的分类(典型情况下是2个分类,标签值为1和0)
- 将每个样本的特征分别代入 h w ( x ) h_w(x) hw(x),计算出预测其属于某一个分类的概率值: y p r e d ( i ) = h w ( x ( i ) ) y_{pred}^{(i)}=h_w(x^{(i)}) ypred(i)=hw(x(i))
- 计算单个样本的预测结果(概率)与实际分类结果的误差:
δ
(
i
)
=
−
y
(
i
)
l
o
g
(
h
w
(
x
(
i
)
)
)
−
(
1
−
y
(
i
)
)
l
o
g
(
1
−
h
w
(
x
(
i
)
)
)
\delta^{(i)}=-y^{(i)} log(h_w(x^{(i)})) -(1 - y^{(i)})log(1 - h_w(x^{(i)}))
δ(i)=−y(i)log(hw(x(i)))−(1−y(i))log(1−hw(x(i)))
- 该误差又称为二元交叉熵(Binary Crossentropy)
- 所有训练样本的交叉熵取平均值,作为损失函数(Loss Function):$ J(w)= \dfrac{1}{m} \sum_{i=1}m[-y{(i)} log(h_w(x^{(i)})) -(1 - y^{(i)})log(1 - h_w(x^{(i)}))] $
- 通过数值计算方法(例如梯度下降算法)来求解 w w w,使得损失值最小。而此时求出的 w w w即为最优的权重参数
- 一旦最优权重参数 w w w确定,既可以代入到 h w h_w hw中,对新的特征进行预测(其属于某个分类的概率)
(3)决策边界线
决策边界线上所有的点,其预测出来的
y
y
y值(
h
w
(
x
)
h_w(x)
hw(x))正好为0.5,即:
$ \dfrac{1}{1+e^{-z}}=0.5 => z = x * w = 0 $
当
D
=
2
D=2
D=2(即包含2个特征)时有:
w
0
+
w
1
x
1
+
w
2
x
2
=
0
w_0 + w_1 x_1 + w_2 x_2=0
w0+w1x1+w2x2=0 ,该边界线是一条直线
(4)评价模型的性能指标
- 二分类的样本预测结果和实际结果标记
查看下列预测和实际结果统计表:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pvEhSbgm-1625395663428)(./images/2.png)]
-
Actual Class表示数据集中实际的结果;Predicted Class则表示通过Hypothesis预测的结果
-
True:表示实际结果与预测结果一致(预测正确);False:表示实际结果和预测结果不一致(预测错误)
-
Positive:表示预测结果为1;Negative表示预测结果为0
-
上述各中情况将分别简写为:TP, FP, TN, FN。即,针对一条测试数据:
- TP:模型预测结果为P(Positive, 1),而且预测正确(该测试数据实际结果也为Positive/1)
- FP:模型预测结果为P(Positive, 1),但是预测错误(该测试数据实际结果应为Negtive/0)
- TN:模型预测结果为N(Negtive, 0),而且预测正确(该测试数据实际结果也为Negtive/0)
- FN:模型预测结果为N(Negtive, 0),但是预测错误(该测试数据实际结果应为Postive/1)\
-
指标计算
- 正确率:$ Accuracy=\frac{#TP+#TN}{#TP+#FP+#TN+#FN} $
- #TP表示所有样本中,TP样本的数量。其它类似
- 体现了:预测正确的样本数占总样本数的比重
- 精度:$ Precision= \frac{#TP}{#TP+#FP} $
- 体现了:对于所有预测为1的样本中,实际真正为1的样本所占的比例。它反映**“误报”**程度:精度越高,误报越小
- 查全率:$ Recall = \frac{#TP}{#TP+#FN} $
- 体现了:对于所有实际为1的样本中,预测也为1的样本所占的比例。它反映**“漏报”**程度:查全率越高,漏报越少
- $F1 Score = \dfrac{2 PR}{P+R} $
- 其中,P为Precision, R为Recall
- 在针对Validation Data进行对比时,应选择F1 Score最大的那个判别式来作为最优解
- 正确率:$ Accuracy=\frac{#TP+#TN}{#TP+#FP+#TN+#FN} $
-
在Precision和Recall中取平衡
假设某Logistic Regression算法,其判别式输出:$ 0 \le h_w(x) \le 1 。 设 计 某 个 阈 值 。设计某个阈值 。设计某个阈值K , 使 得 当 ,使得当 ,使得当h_w(x) \ge K 时 , 预 测 时,预测 时,预测y = 1 ; 当 ;当 ;当h_\theta(x) \lt K 时 , 预 测 时,预测 时,预测y=0$- 通常,我们设计K为0.5。也就是说,当可能性超过0.5时就做出Positive的预测结果
- 如果设置K=0.7,意味着预测更加保守,只有高可信度才会被预测为1。 因此误报可能性降低,Precision提升;漏报可能性增加,Recall降低。
- 如果设置K=0.3,意味着预测趋于大胆,低可信度也会被预测为1。因此误报可能性增加,Precision降低;漏报可能性减少,Recall上升。
- 大致可以得出结论:Precisioin和Recall是有矛盾的,它们很难同时都达到最高。因此需要取折中(F1 Score)
标签:预测,结果,样本,插补,No.3,实训,写实,缺失,变量 来源: https://blog.csdn.net/qq_44219737/article/details/118390756