博客
关于我
【skLearn 练习】随机森林回归填补缺失值
阅读量:325 次
发布时间:2019-03-04

本文共 3507 字,大约阅读时间需要 11 分钟。

随机森林回归填补缺失值

在现实数据中,缺失值是难以避免的问题。直接删除含有缺失值的样本虽然简单,但有时通过填补缺失值可以更好地利用数据,这在很多实际应用中显得尤为重要。以下将介绍如何利用 sklearn.impute.SimpleImputer 模块中的均值、常数值以及随机森林回归方法对波士顿房价数据集中的缺失值进行填补,并通过交叉验证评估不同方法的性能。

导入必要的库

import numpy as npimport pandas as pdfrom matplotlib import pyplot as pltfrom sklearn.datasets import load_bostonfrom sklearn.impute import SimpleImputerfrom sklearn.ensemble import RandomForestRegressorfrom sklearn.model_selection import cross_val_score

导入数据集

# 加载波士顿房价数据集boston = load_boston()x_full = boston.data  # 特征矩阵y_full = boston.target  # 标签n_samples, n_features = x_full.shape  # 数据样本数和特征数

构建缺失值

# 随机生成缺失值的位置rng = np.random.RandomState(0)missing_rate = 0.5n_missing_samples = int(np.floor(n_samples * n_features * missing_rate))  # 3289# 随机选择行和列的索引missing_samples = rng.randint(0, n_samples, n_missing_samples)missing_features = rng.randint(0, n_features, n_missing_samples)# 创建缺失值矩阵x_missing = x_full.copy()x_missing[missing_samples, missing_features] = np.nanx_missing = pd.DataFrame(x_missing)

缺失值填补方法

1. 均值(Mean)填补

使用 SimpleImputer 的均值策略填补缺失值。

# 均值填补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)

2. 常数(0)填补

使用常数策略填补缺失值,常数值为 0。

# 常数填补imp_0 = SimpleImputer(missing_values=np.nan, strategy='constant', fill_value=0)x_missing_0 = imp_0.fit_transform(x_missing)x_missing_0 = pd.DataFrame(x_missing_0)

3. 随机森林回归填补

随机森林回归是一种强大的填补方法,利用其他特征和标签预测缺失特征。

# 随机森林回归填补def impute_using_rfc(df, y_full):    # 找出缺失值最多的列    sort_columns_index = np.argsort(df.isnull().sum()).tolist()        for i in sort_columns_index:        # 构建新的特征矩阵和标签        df_train = df.iloc[:, df.columns != i].copy()        df_train = pd.concat([df_train, pd.DataFrame(y_full)], axis=1)                # 填补缺失值        df_0 = SimpleImputer(missing_values=np.nan, strategy='constant', fill_value=0).fit_transform(df_train)                # 提取训练集和测试集        ytrain = df_train[df_train.notnull().any(axis=1)]        ytest = df_train[df_train.isnull().any(axis=1)]                xtrain = df_0[ytrain.index, :]        xtest = df_0[ytest.index, :]                # 使用随机森林回归填补        rfc = RandomForestRegressor(n_estimators=100, random_state=0).fit(xtrain, ytrain)        y_predict = rfc.predict(xtest)                # 将预测值填入原始数据        df.loc[df.iloc[:, i].isnull(), i] = y_predict        return df# 对缺失值进行随机森林填补x_missing_reg = x_missing.copy()x_missing_reg = impute_using_rfc(x_missing_reg, y_full)

评估填补效果

通过交叉验证计算均方误差(MSE)评分。

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评分结果mse = [21.6286, 43.2074, 47.4055, 17.5528]

评估结果可视化

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("波士顿房价数据集缺失值填补方法对比", 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()

结论

通过对比均值填补、常数填补和随机森林回归填补方法的结果,可以看出随机森林回归填补方法在波士顿房价数据集上表现最为出色,其均方误差评分仅为 17.55,显著优于其他方法。因此,在面对缺失值问题时,随机森林回归填补是一种更为优越的选择。

转载地址:http://lfeq.baihongyu.com/

你可能感兴趣的文章
NETSH WINSOCK RESET这条命令的含义和作用?
查看>>
Netty WebSocket客户端
查看>>
netty 主要组件+黏包半包+rpc框架+源码透析
查看>>
Netty 异步任务调度与异步线程池
查看>>
Netty中集成Protobuf实现Java对象数据传递
查看>>
Netty事件注册机制深入解析
查看>>
Netty原理分析及实战(四)-客户端与服务端双向通信
查看>>
Netty客户端断线重连实现及问题思考
查看>>
Netty工作笔记0006---NIO的Buffer说明
查看>>
Netty工作笔记0007---NIO的三大核心组件关系
查看>>
Netty工作笔记0011---Channel应用案例2
查看>>
Netty工作笔记0013---Channel应用案例4Copy图片
查看>>
Netty工作笔记0014---Buffer类型化和只读
查看>>
Netty工作笔记0020---Selectionkey在NIO体系
查看>>
Vue踩坑笔记 - 关于vue静态资源引入的问题
查看>>
Netty工作笔记0025---SocketChannel API
查看>>
Netty工作笔记0027---NIO 网络编程应用--群聊系统2--服务器编写2
查看>>
Netty工作笔记0050---Netty核心模块1
查看>>
Netty工作笔记0057---Netty群聊系统服务端
查看>>
Netty工作笔记0060---Tcp长连接和短连接_Http长连接和短连接_UDP长连接和短连接
查看>>