【skLearn 练习】随机森林回归填补缺失值

文章目录

随机森林回归填补缺失值

我们从现实中收集的数据,几乎不可能是完美的,往往都会有一些缺失值,很多人选择的是直接将含有缺失值的样本直接删除,这是一种方式,但是有时候填补缺失值会比直接丢弃样本效果更好,即使我们不知道缺失值的真实数据。

sklearn.impute.SimpleImputer 模块中可以轻松地将均值、中值、或者其它常用的数值来对空值进行填补。下面我们将对波士顿房价数据集进行 均值0随机森林回归 来进行缺失值填补,并验证各种情况下的拟合效果,找出最佳的缺失值填补方式。

♦导入需要的库

import numpy as np
import pandas as pd
from matplotlib import pyplot as plt
from sklearn.datasets import load_boston
from sklearn.impute import SimpleImputer
from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selection import cross_val_score

♦导入数据集


boston = load_boston()
x_full = boston.data
y_full = boston.target
n_samples = x_full.shape[0]
n_features = x_full.shape[1]

♦构建缺失值

  • *1.首先确定放入缺失值的比例: 50% ,也就是共有 3289 个数据缺失
rng = np.random.RandomState(0)
missing_rate = 0.5
n_missing_samples = int(np.floor(n_samples*n_features*missing_rate))
n_missing_samples
  • 2.缺失值是遍布在50613的数据表中 —- 随机位置生成3289个缺失值(行、列组成的网格格数)。类似于DataFrame,我们需要通过索引(行、列)来进行定位,生成缺失值。

missing_samples = rng.randint(0,n_samples,n_missing_samples)
missing_features= rng.randint(0,n_features,n_missing_samples)

  • *3.生成缺失值
x_missing = x_full.copy()
x_missing[missing_samples,missing_features] = np.nan
x_missing = pd.DataFrame(x_missing)
x_missing

【skLearn 练习】随机森林回归填补缺失值
返回顶部

♦缺失值填补

① 均值mean填补

  • *利用 sklearn.impute 中的 SimpleImputer类 进行填补, missing_values = np.nan 代表当前所需填补值(空值)的类型; strategy = 'mean' 表示填补空值所使用的策略,就是用均值mean来进行填补。

imp_mean = SimpleImputer(missing_values=np.nan,strategy='mean')
x_missing_mean = imp_mean.fit_transform(x_missing)
x_missing_mean = pd.DataFrame(x_missing_mean)
x_missing_mean

填补之后,效果如下图所示

【skLearn 练习】随机森林回归填补缺失值

返回顶部

② 使用0值填补

  • *strategy =’ constant ‘, fill_value = 0 表示使用常量进行填补,fill_value指明所使用的常数为0。
imp_0 = SimpleImputer(missing_values=np.nan,strategy='constant',fill_value=0)
x_missing_0 = imp_mean.fit_transform(x_missing)
x_missing_0 = pd.DataFrame(x_missing_0)
x_missing_0

【skLearn 练习】随机森林回归填补缺失值

返回顶部

③ 使用随机森林回归填补

任何回归都是从特征矩阵中学习,然后求解连续型标签y的过程,之所以能够实现这个过程,是因为回归算法认为特征矩阵和标签之前存在着某种联系。实际上, 标签和特征是可以相互转换的,比如说,在一个”用地区,环境,附近学校数量预测”房价”的问题中,我们既可以用”地区,”环境”,”附近学校数量”的数据来预测”房价”,也可以反过来用”环境”,”附近学校数量”和”房价”来预测”地区”(有点类似”y=kx+b”方程中的知三求一)。而回归填补缺失值,正是利用了这种思想。

对于一个有 n 个特征的数据来说,其中 特征T 有缺失值,我们就把 特征T 当作标签,其他的 n-1 个特征和原本的标签组成新的特征矩阵。那对于 T 来说,它 没有缺失的部分,就是我们的ytrain, 这部分数据既有标签也有特征,而它缺失的部分,只有特征没有标签,就是我们需要预测的部分

特征T不缺失的值对应的其他 n-1 个特征+本来的标签: xtrain
特征T不缺失的值: ytrain

特征缺失的值对应的其他 n-1 个特征+本来的标签: xtest
特征缺失的值:未知,我们需要预测的 ytest

  • 这种做法,对于某一个特征大量缺失,其他特征却很完整的情况,非常适用!
  • 那如果数据中除了特征T之外,其他特征也有缺失值怎么办?
  • *答案是遍历所有的特征,从缺失最少的开始进行填补(因为填补缺失最少的特征所需要的准确信息最少。填补一个特征时,先将其他特征的缺失值用0代替,每完成一次回归预测,就将预测值放到原本的特征矩阵中,再继续填补下一个特征。每一次填补完毕,有缺失值的特征会减少一个,所以每次循环后,需要用0填补的特征就越来越少。当进行到最后一个特征时(这个特征应该是所有特征中缺失值最多的),已经没有任何的其他特征需要用0来进行填补了,而我们已经使用回归为其他特征填补了大量有效信息,可以用来填补缺失最多的特征。

⑴ 缺失值数目排序索引

x_missing_reg = x_missing.copy()

sort_columns_index = np.argsort(x_missing_reg.isnull().sum()).values
sort_columns_index

【skLearn 练习】随机森林回归填补缺失值

⑵ 遍历索引填补空值

for i in sort_columns_index:

    df = x_missing_reg
    fillc = df.iloc[:,i]
    df = pd.concat([df.iloc[:,df.columns != i],pd.DataFrame(y_full)],axis=1)

    df_0 = SimpleImputer(missing_values=np.nan,strategy='constant',fill_value=0).fit_transform(df)

    ytrain = fillc[fillc.notnull()]
    ytest  = fillc[fillc.isnull()]
    xtrain = df_0[ytrain.index,:]
    xtest  = df_0[ytest.index,:]

    rfc = RandomForestRegressor(n_estimators=100).fit(xtrain,ytrain)
    y_predict = rfc.predict(xtest)

    x_missing_reg.loc[x_missing_reg.iloc[:,i].isnull(),i] = y_predict

【skLearn 练习】随机森林回归填补缺失值

返回顶部

④ 对填补结果进行评估

  • *我们接下来使用交叉验证(均方误差),分别对 原始数据集均值填补数据集0值填补数据集随机森林回归填补数据集 进行打分。

X = [x_full,x_missing_mean,x_missing_0,x_missing_reg]
mse = []

for x in X:
    estimator = RandomForestRegressor(n_estimators=100,random_state=0)
    scores = cross_val_score(estimator,x,y_full,scoring='neg_mean_squared_error',cv=5).mean()
    mse.append(scores * -1)
mse

[21.62860460743544, 43.20737719157445, 47.40551717161716, 17.55283253410987]

通过评估,可以发现,利用 均值0值 进行空值填补均方误差评分达到 40以上 ,而利用 随机森林回归填补 竟然比原始数据集的拟合效果还要好,均方误差评分 低至17.5 ,当然不排除具有过拟合情况的出现。

【skLearn 练习】随机森林回归填补缺失值
返回顶部

⑤ 评估结果可视化


plt.figure(figsize=(12,8))
colors = ['r','g','b','orange']
x_labels = ["x_full","x_missing_mean","x_missing_0","x_missing_reg"]

ax = plt.subplot(111)
for i in range(len(mse)):
    ax.barh(i,mse[i],color=colors[i],alpha=0.6,align='center')

ax.set_title("Imputation Technique with Boston Data",color='white')
ax.set_xlim(left=np.min(mse)*0.9,right=np.max(mse)*1.1)
ax.set_yticks(range(len(mse)))
ax.set_xlabel("MSE",color='white')
ax.set_yticklabels(x_labels)

plt.tick_params(axis='x',colors='white')
plt.tick_params(axis='y',colors='white')
plt.show()

【skLearn 练习】随机森林回归填补缺失值

返回顶部

Original: https://blog.csdn.net/qq_45797116/article/details/113779317
Author: 骑着蜗牛ひ追导弹’
Title: 【skLearn 练习】随机森林回归填补缺失值

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/635198/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球