关于机器学习:机器学习-第3篇数据预处理使用插补法处理缺失值

136次阅读

共计 5005 个字符,预计需要花费 13 分钟才能阅读完成。

插补法能够在肯定水平上缩小偏差,罕用的插补法是热卡插补、拟合插补和多重插补。拟合插补,要求变量间存在强的相关性;多重插补(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”””

正文完
 0