其他分享
首页 > 其他分享> > 2020-12-28

2020-12-28

作者:互联网

返回主页
悦光阴
请不要假装很努力,因为结果不会陪你演戏。
博客园
首页
管理
机器学习 第3篇:数据预处理(使用插补法处理缺失值)

插补法可以在一定程度上减少偏差,常用的插补法是热卡插补、拟合插补和多重插补。拟合插补,要求变量间存在强的相关性;多重插补(MCMC法),是在高缺失率下的首选插补方法,优点是考虑了缺失值的不确定性。

一,热卡插补

热卡填充(Hot deck imputation)也叫就近补齐,对于一个包含空值的对象,热卡填充法在完整数据中找到一个与它最相似的对象,然后用这个相似对象的值来进行填充。通常会找到超出一个的相似对象,在所有匹配对象中没有最好的,而是从中随机的挑选一个作为填充值。这个问题关键是不同的问题可能会选用不同的标准来对相似进行判定,以及如何制定这个判定标准。该方法概念上很简单,且利用了数据间的关系来进行空值估计,但缺点在于难以定义相似标准,主观因素较多。

二,拟合插补

拟合插补法则是利用有监督的机器学习方法,比如回归、最邻近、随机森林、支持向量机等模型,对缺失值作预测,其优势在于预测的准确性高,缺点是需要大量的计算,导致缺失值的处理速度大打折扣。虽然替换法思想简单、效率高效,但是其替换的值往往不具有很高的准确性,于是出现了插补方法。

1,回归插补

基于完整的数据集,建立回归方程。对于包含空值的对象,将已知属性值代入方程来估计未知属性值,以此估计值来进行填充。当变量不是线性相关时会导致有偏差的估计。缺失值是连续的,即定量的类型,才可以使用回归来预测。

2,最邻近填充

利用knn算法填充,其实是把目标列当做目标标量,利用非缺失的数据进行knn算法拟合,最后对目标列缺失进行预测。(对于连续特征一般是加权平均,对于离散特征一般是加权投票)

复制代码
from sklearn.neighbors import KNeighborsClassifier, KNeighborsRegressor

def knn_filled_func(x_train, y_train, test, k = 3, dispersed = True):
# params: x_train 为目标列不含缺失值的数据(不包括目标列)
# params: y_train 为不含缺失值的目标列
# params: test 为目标列为缺失值的数据(不包括目标列)
if dispersed:
knn= KNeighborsClassifier(n_neighbors = k, weights = “distance”)
else:
knn= KNeighborsRegressor(n_neighbors = k, weights = “distance”)

knn.fit(x_train, y_train)

复制代码
3,随机森林插补

随机森林算法填充的思想和knn填充是类似的,即利用已有数据拟合模型,对缺失变量进行预测。

复制代码
from sklearn.ensemble import RandomForestRegressor, RandomForestClassifier

def knn_filled_func(x_train, y_train, test, k = 3, dispersed = True):
# params: x_train 为目标列不含缺失值的数据(不包括目标列)
# params: y_train 为不含缺失值的目标列
# params: test 为目标列为缺失值的数据(不包括目标列)
if dispersed:
rf= RandomForestRegressor()
else:
rf= RandomForestClassifier()

rf.fit(x_train, y_train)
return test.index, rf.predict(test)

复制代码
三,多重插补

多重插补(Mutiple imputation,MI)的思想来源于贝叶斯估计,认为待插补的值是随机的,它的值来自于已观测到的值。具体实践上通常是估计出待插补的值,然后再加上不同的噪声,形成多组可选插补值。根据某种选择依据,选取最合适的插补值。

对于拟合插补和均值替换等处理缺失值的方法都是单一的插补方法,而多重插补弥补了单一插补的缺陷,它并没有试图去通过模拟值去估计每个缺失值,而是提出缺失数据值的一个随机样本(这些样本可以是不同的模型拟合结果的组合)。这种程序的实施恰当地反映了由于缺失值引起的不确定性,使得统计推断有效。

注:使用多重插补要求数据缺失值为随机性缺失,一般重复次数20-50次精准度很高,但是计算也很复杂,需要大量计算。

1,多重插补的实现

多重插补是一种基于重复模拟的用于处理缺失值的方法,它从一个包含缺失值的数据集中生成一组数据完整的数据集(即不包含缺失值的数据集,通常是3-10个)。每个完整数据集都是通过对原始数据中的缺失数据进行插补而生成的。在每个完整的数据集上引用标准的统计方法,最后,把这些单独的分析结果整合为一组结果。

多重插补法大致分为三步:

为每个空值产生一套可能的插补值,这些值反映了模型的不确定性;每个值都被用来插补数据集中的缺失值,产生若干个完整数据集合。
每个插补数据集合都用针对完整数据集的统计方法进行统计分析。
对来自各个插补数据集的结果进行整合,产生最终的统计推断,这一推断考虑到了由于数据插补而产生的不确定性。该方法将空缺值视为随机样本,这样计算出来的统计推断可能受到空缺值的不确定性的影响。
2,MICE简介

通过链式方程进行的多元插补(MICE,Multiple Imputation by Chained Equations),与单个插补(例如均值)相比,创建多个插补可解决缺失值的不确定性。MICE假定缺失的数据是随机(MAR)的,这意味着,一个值丢失概率上观测值仅取决于并且可以使用它们来预测。通过为每个变量指定插补模型,可以按变量插补数据。

例如:假设我们有X1,X2….Xk变量。如果X1缺少值,那么它将在其他变量X2到Xk上回归。然后,将X1中的缺失值替换为获得的预测值。同样,如果X2缺少值,则X1,X3至Xk变量将在预测模型中用作自变量。稍后,缺失值将被替换为预测值。

默认情况下,线性回归用于预测连续缺失值。Logistic回归用于分类缺失值。一旦完成此循环,就会生成多个数据集。这些数据集仅在估算的缺失值上有所不同。通常,将这些数据集分别构建模型并组合其结果被认为是一个好习惯。

本文使用R语言中的mice包来执行这些操作,首先我们来看mice包的操作思路:
首先,mice()函数从一个包含缺失数据的数据框开始,返回一个包含多个(默认为5个)完整数据集的对象。每个完整数据集都是通过对原始数据框中的缺失数据进行插补而生成的。由于插补有随机的成分,因此每个完整数据集都略有不同。
然后,with()函数可依次对每个完整的数据集应用统计模型(如线性模型或广义线性模型)。
最后,pool()函数把这些单独的分析结果整合为一组结果。
最终模型的标准差和p值都准确地反映出由于缺失值和多重插补而产生的不确定性。
缺失值的插补法通过Gibbs抽样完成,每个包含缺失值的变量都默认可通过数据集中的其他变量预测的来,于是这些预测方程便可用于预测数据的有效值。该方程不断迭代直到所有的缺失值都收敛为止。默认情况下,预测的均值用于替换连续性变量中的缺失数据。

3,基于R的mice包的分析过程

library(mice)
imp <- mice(data, m)
fit <- with(imp, analysis)
pooled <- pool(fit)
summary(pooled)
data:包含缺失值的矩阵或数据框;
imp:一个包含m个插补数据集的列表对象,同时还含有完成插补过程的信息。默认为5。
analysis:用来设定应用于m个插补数据集的统计分析方法。比如线性回归模型的lm()函数,举个例子lm(Dream ~ Span + Gest),表达式在函数的括号中,~左边是因变量,右边是自变量,用+符号分隔开。这个例子中Dream是因变量,Span和Gest是自变量;
fit:一个包含m个单独统计分析结果的列表对象;
pooled:一个包含m个统计分析平均结果的列表对象。

四,Python的MICE算法

在处理缺失值时,可以通过链式方程的多重插补估算缺失值:

链式方程的多重插补,也称为“完全条件规范”,其定义如下:

从技术上讲,任何能够推理的预测模型都可以用于MICE。 在本文中,我们使用miceforest Python库估算了数据集,该库使用随机森林。 出于以下几个原因,随机森林可与MICE算法配合使用:

不需要太多的超参数调整
轻松处理数据中的非线性关系
可以廉价地返回OOB性能
几乎可以并行化
可以返回功能重要性以进行诊断

代码如下:

复制代码
import miceforest as mf
from sklearn.datasets import load_iris
import pandas as pd

Load and format data

iris = pd.concat(load_iris(as_frame=True,return_X_y=True),axis=1)
iris.rename(columns = {‘target’:‘species’}, inplace = True)
iris[‘species’] = iris[‘species’].astype(‘category’)

Introduce missing values

iris_amp = mf.ampute_data(iris,perc=0.25,random_state=1991)

Create kernels.

kernel = mf.MultipleImputedKernel(
data=iris_amp,
save_all_iterations=True,
random_state=1991
)

Run the MICE algorithm for 3 iterations on each of the datasets

kernel.mice(3,verbose=True)

kernel.plot_correlations(wspace=0.4,hspace=0.5)

Our new dataset

new_data = iris_amp.iloc[range(50)]# Make a multiple imputed dataset with our new data
new_data_imputed = kernel.impute_new_data(new_data)# Return a completed dataset
new_completed_data = new_data_imputed.complete_data(0)

new_data_imputed.plot_imputed_distributions(wspace=0.35,hspace=0.4)

from sklearn.linear_model import LinearRegression

For each imputed dataset, train a linear regression

on ‘sepal length (cm)’

intercepts = []
target = ‘sepal length (cm)’
for d in range(kernel.dataset_count()):
comp_dat = kernel.complete_data(d)
comp_dat = pd.get_dummies(comp_dat)
X, y = comp_dat.drop(target,1), comp_dat[target]
model = LinearRegression()
model.fit(X,y)
intercepts.append(model.intercept_)# Load packages for plotting
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm

Make plot.

x_axis = np.arange(1.93, 2.01, 0.0001)
avg_intercept = round(np.mean(intercepts),2)
var_intercept = round(np.var(intercepts),4)
plt.plot(
x_axis,
norm.pdf(x_axis,avg_intercept,var_intercept)
)
plt.title(f"""
Assumed Distribution of Intercept Term
n=5, mean = {avg_intercept}, variance = {var_intercept}
“”"
)
复制代码

参考文档:

【Python数据分析基础】: 数据缺失值处理

数据分析——缺失值处理详解(理论篇)

处理缺失值之多重插补(Multiple Imputation)

Multiple Imputation with Random Forests in Python

miceforest 2.0.3

作者:悦光阴
出处:http://www.cnblogs.com/ljhdo/
本文版权归作者和博客园所有,欢迎转载,但未经作者同意,必须保留此段声明,且在文章页面醒目位置显示原文连接,否则保留追究法律责任的权利。
分类: 机器学习
标签: 机器学习
好文要顶 关注我 收藏该文
悦光阴
关注 - 12
粉丝 - 931
推荐博客
+加关注
1
« 上一篇: 机器学习 第2篇:数据预处理(缺失值)
posted @ 2020-12-28 10:27 悦光阴 阅读(52) 评论(0) 编辑 收藏
刷新评论刷新页面返回顶部
登录后才能发表评论,立即 登录 或 注册, 访问 网站首页
写给园友们的一封求助信
【推荐】News: 大型组态、工控、仿真、CADGIS 50万行VC++源码免费下载
【推荐】有你助力,更好为你——博客园用户消费观调查,附带小惊喜!
【推荐】博客园x丝芙兰-圣诞特别活动:圣诞选礼,美力送递
【推荐】了不起的开发者,挡不住的华为,园子里的品牌专区
【福利】AWS携手博客园为开发者送免费套餐+50元京东E卡
【推荐】未知数的距离,毫秒间的传递,声网与你实时互动
【推荐】新一代 NoSQL 数据库,Aerospike专区新鲜入驻

相关博文:
· 01.基础篇 - 值数据类型
· 值传递和引用传递,看这篇就够了!!
· C++的左值,右值,左值引用,右值引用
· vue传值(父子传值,非父子传值)
· 4-树篇
» 更多推荐…

最新 IT 新闻:
· 相互宝2020年账单出炉:大病互助全年分摊91元 最高发五种重疾公布
· 微信直播,直奔带货?
· 阿里、上汽等投资成立汽车科技公司 注册资本100亿元
· 阿里达摩院2021十大科技趋势:第三代半导体材料将大规模应用
· 银行的羊毛不能薅
» 更多新闻…
公告
昵称: 悦光阴
园龄: 6年8个月
荣誉: 推荐博客
粉丝: 931
关注: 12
+加关注
< 2020年12月 >
日 一 二 三 四 五 六
29 30 1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31 1 2
3 4 5 6 7 8 9
搜索

找找看
最新随笔
1.机器学习 第3篇:数据预处理(使用插补法处理缺失值)
2.机器学习 第2篇:数据预处理(缺失值)
3.ADF 第八篇:传递参数(Pipeline的Parameter和Variable,Activity的output)和应用表达式
4.ADF 第七篇:控制流概述
5.ADF 第六篇:Copy Data Activity详解
6.Azure Databricks 第一篇:初识Databricks,创建工作区、集群和Notebook
7.评估回归模型的指标:MSE、RMSE、MAE、R2、偏差和方差
8.ADF 第五篇:转换数据
9.pandas 学习 第14篇:索引和选择数据
10.机器学习 第1篇:探索数据
积分与排名
积分 - 885122
排名 - 216
随笔分类 (330)
Azure Databricks(1)
ETL(55)
Python - pandas(14)
Python - Tools(16)
Python - 基础(20)
SQL Server TSQL(51)
SQL Server 安全(25)
SQL Server 管理(82)
SQL Server 性能调优(25)
机器学习(18)
数仓建模(11)
数据分析(12)
Python
scikit-learn Machine Learning in Python
正则表达式
re - Regular expression operations
numpy ndarray
NumPy Reference
scikit-learn (sklearn) 官方文档中文版
NumPy 用户指南
pandas reference
Distance computations (scipy.spatial.distance)
SciPy references
matplotlib
SciPy 中文版
Introduction-statsmodels
最新评论

  1. Re:性能调优1:缓存
    性能调优资料分享1160405674,这个是羣哦
    –图灵学院在线
  2. Re:.pfx 证书和 .cer 证书
    @变形精怪 那你换台机器试试?…
    –悦光阴
  3. Re:.pfx 证书和 .cer 证书
    不对呀,微信支付开发时,我们拿到的微信支付商户证书,就有个私钥.cert
    –变形精怪
  4. Re:ElasticSearch入门 第一篇:Windows下安装ElasticSearch
    已解决 问题是官方的windows官方脚本有个bug 无法识别安装目录下面有空格 大家不要丢在program files这个有空格的目录下面就行 也可以去改最新版本7.10 /bin/elastics…
    –一介4188
  5. Re:大数据操作:删除和去重
    群:186841119 有非常多大数据高手一起交流!
    –气宇轩昂_2017
  6. Re:Partition2:对现有表分区
    @yuchengit Nice,是可以这样认为吧…
    –悦光阴
  7. Re:Partition2:对现有表分区
    分区表合并成一个分区之后,把分区索引删除重建,是可以从分区表转换为普通表的。
    –yuchengit
  8. Re:ElasticSearch入门 第五篇:使用C#查询文档
    @ykyk 可能是版本的问题,你查看以下官方手册…
    –悦光阴
  9. Re:SQL Server 异常代码处理
    @HelloLLLLL 是的,对于调式和故障排除特别有帮助…
    –悦光阴
  10. Re:沪漂5年,工作这点事儿
    @Asunasukida 与君共勉…
    –悦光阴
    Copyright © 2020 悦光阴
    Powered by .NET 5.0 on Kubernetes

标签:iris,12,data,28,插补,train,2020,数据,缺失
来源: https://blog.csdn.net/wubaoyu123/article/details/111856801