本文中主要是利用sklearn
中自带的波士顿房价数据,通过不同的缺失值填充方式,包含均值填充、0值填充、随机森林的填充,来比较各种填充方法的效果
缺失值
现实中收集到的数据大部分时候都不是完整,会存在缺失值。
- 有些时候会直接将含有缺失值的样本删除
drop
- 但是有的时候,利用
0值、中值、其他常用值或者随机森林
填充缺失值效果更好 sklearn
中使用sklearn.impute.SimpleImputer
类填充缺失值
填充缺失值
先让原始数据中产生缺失值,然后采用3
种不同的方式来填充缺失值
- 均值填充
- 0值填充
- 随机森林方式填充
波士顿房价数据
各种包和库
1 | import numpy as np |
查看数据
1 | dataset = load_boston() |
完整数据
1 | X_full, y_full = dataset.data, dataset.target |
向完整数据中填充缺失值
设置缺失的样本总数
1 | rng = np.random.RandomState(0) # 确定随机种子 |
随机数填充
- 数据集要随机遍布在各行各列中,而一个缺失的数据需要行列两个指标
- 创造一个数组,行索引在
0-506
,列索引在0-13
之间,利用索引来进行填充3289
个位置的数据 - 利用0、均值、随机森林分别进行填充
1 | # randint(下限,上限,n):在上限和下限之间随机取出n个整数 |
均值填充
1 | imp_mean = SimpleImputer(missing_values=np.nan, strategy="mean") # 指定缺失值是什么和用什么填充 |
检查得到的数据是否存在缺失值
1 | pd.DataFrame(X_missing_mean).isnull().sum() # X_missing_mean是一个ndaraay |
0值填充
1 | imp_0 = SimpleImputer(missing_values=np.nan, strategy="constant", fill_value=0) # 用0进行填充 |
随机森林填充
如何填充
假设一个具有n
个特征的数据,特征T存在缺失值**(大量缺失更适合)**,把T当做是标签,其他的n-1个特征和原来的数据看作是新的特征矩阵,具体数据解释为:
数据 | 说明 |
---|---|
Xtrain | 特征T不缺失的值对应的n-1个特征+原始标签 |
ytrain | 特征T不缺失的值 |
Xtest | 特征T缺失的值对应的n-1个特征+原始标签 |
ytest | 特征T缺失值(未知) |
如果其他特征也存在缺失值,遍历所有的特征,从缺失值最少的开始。
- 缺失值越少,所需要的准确信息也越少
- 填补一个特征,先将其他特征值的缺失值用
0
代替,这样每次循环一次,有缺失值的特征便会减少一个
图形解释
假设数据有n个特征,m行数据
由于是从最少的缺失值特征开始填充,那么需要找出存在缺失值的索引的顺序:
argsort
函数的使用
1 | X_missing_reg = X_missing.copy() |
填充过程
1 | for i in sortindex: |
4种数据建模
MSE
:均方误差$MSE=\frac{1}{N}\sumN_{i=1}(f_i-y_i)2$;回归树的衡量指标,越小越好。sklearn中使用的是负均方误差neg_mean_squared_error
。均方误差本身是种误差loss,通过负数表示- $R^2$:回归树
score
返回的真实值是R的平方,不是MSE
$R^2=1-\frac{u}{v}$
$u=\sumN_{i=1}(f_i-y_i)2$
$v=\sum^N_{i=1}(y_i-\hat y)^2$
1 | X = [X_full, X_missing_mean, X_missing_0, X_missing_reg] |
绘图
1 | x_labels = ["Full Data", |