数据清洗-缺失值填充-随机森林填充
目录
- 一、安装所需的python包
- 二、采用随机森林算法进行缺失值填充
- 2.1可直接运行代码
- 2.2以某个缺失值数据进行实战
- 代码运行过程截屏:
- 填充后的数据截屏:
- 三、随机森林算法 (Random Forest) 介绍
- 3.1随机森林的定义
- 3.2随机森林的基本思想
- 3.3随机森林的工作原理
- 3.4随机森林的优缺点
- 3.4.1优点
- 3.4.2缺点
- 3.5随机森林的应用场景
- 3.6随机森林的参数
感觉大家对原理性的东西不太感兴趣,那我就直接举例提供代码,以及详细的注释,大家自己对照改代码应用于你自己建立的模型吧。
这些代码全部是我自己做数模竞赛时候自己用的代码。可以直接运行,记得修改文件路径。
一、安装所需的python包
pip install scikit-learn
pip install numpy
pip install pandas
二、采用随机森林算法进行缺失值填充
注意代码需要把自己的数据文件格式转换为CSV文件,并且把路径修改为自己文件所在的路径,不会转换的参考我此教程文件格式转换:EXCEL和CSV文件格式互相转换。
我知道大家对原理性的东西不感兴趣,我把他的原理介绍放在文末,需要写论文的同学自己拿去用,记得修改,否则查重率过不去。
2.1可直接运行代码
"""
随机森林补充缺失值,但是精度不太够,哎先就这样吧
我想着可以对初值进行优化,但是还没弄,就现这样吧
这个速度快,精度太拉了
随机森林:优点可以处理各种类型的特征(包括二元、分类和数值特征),并且不需要对数据进行标准化或规范化
"""
from sklearn.impute import SimpleImputer
from sklearn.ensemble import RandomForestRegressor
import numpy as np
import pandas as pd
data = pd.read_csv('缺失值填充.csv',encoding='gbk')
data_copy = data.copy()
data_copy.drop(data_copy.columns[0], axis=1, inplace=True)
sindex = np.argsort(data_copy.isnull().sum()).values
# 进行缺失值的填补,利用随机森林进行填补缺失值
for i in sindex:
if data_copy.iloc[:, i].isnull().sum() == 0:
continue
df = data_copy
fillc = df.iloc[:, i]
df = df.iloc[:, df.columns != df.columns[i]]
# 在下面的是使用了0来对特征矩阵中的缺失值的填补,
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()
rfc.fit(Xtrain, Ytrain)
Ypredict = rfc.predict(Xtest)
data_copy.loc[data_copy.iloc[:, i].isnull(), data_copy.columns[i]] = Ypredict
# print(data_copy.isnull().sum())
#保存文件
data_copy.to_csv('随机森林.csv', index=False)
print(data_copy)
注意:
data = pd.read_csv('缺失值填充.csv',encoding='gbk')
里面的缺失值填充.csv
是你自己的缺失值的csv文件路径,data_copy.to_csv('随机森林.csv', index=False)
中的随机森林.csv
是你填充后的文件名,你可以自己起名。
2.2以某个缺失值数据进行实战
注意:数据量较少,由自己构建,均有规律,
如下图:
构造缺失值,如下图:
运行代码查看填充后的数据怎么样,
运行代码如下图+填充后的截图:
代码运行过程截屏:
填充后的数据截屏:
说明:对于这种数据量小的,像随机森林算法填充的效果略差,使用前面的牛顿插值法即可。对于数据量大的,可以使用神经网络遗传算法来进行缺失值填充,下面我将会介绍对随机森林算法的参数进行优化的改进算法进行缺失值填充,但是你在进行数模比赛时候,需要说明为什么你要选用该算法填充,说明他的原理即可,不必纠结填充的数据是否正确,因为你本身也不知道数据的正确性。
接下来我将继续分享其他我参加数模时候常用的几种数据填充的代码,都是我自己调试跑通过的,大家直接复制粘贴使用。
三、随机森林算法 (Random Forest) 介绍
3.1随机森林的定义
随机森林 (Random Forest) 是一种基于决策树的集成学习方法,由 Leo Breiman 和 Adele Cutler 在 2001 年提出。它通过构建多个决策树来完成分类或回归任务,并利用这些决策树的集成结果来提高模型的准确性和稳定性。随机森林的基本思想是将多个相对较弱的学习器(即决策树)结合起来,从而形成一个强大的集成模型。
3.2随机森林的基本思想
随机森林属于 Bagging (Bootstrap Aggregating) 集成方法 的一种扩展。Bagging 方法通过从原始数据集中有放回地抽样来生成多个子数据集,并在每个子数据集上训练一个弱学习器(如决策树)。在预测时,随机森林会将所有树的预测结果进行投票(分类问题)或平均(回归问题),以得到最终的预测结果。
随机森林的基本特点在于“随机性”,主要体现在以下两个方面:
- 数据随机性:在构建每棵决策树时,从原始数据集中随机抽取样本(有放回),构成训练数据集。
- 特征随机性:在每棵树的节点分裂时,随机选择部分特征来确定最佳分裂点,而不是使用所有特征。
3.3随机森林的工作原理
- 随机抽样:从原始数据集中有放回地随机抽取多个子样本,构建多个训练数据集。
- 构建决策树:对每个训练数据集,构建一棵决策树。在每个节点分裂时,随机选择一部分特征,并根据这些特征选择最佳分裂点。
- 集成结果:对分类问题,随机森林对所有决策树的结果进行投票,选择出现次数最多的类别作为最终分类结果;对回归问题,则取所有决策树预测值的平均作为最终预测结果。
3.4随机森林的优缺点
3.4.1优点
- 准确性高:通过多个决策树的集成,随机森林通常比单一决策树有更高的预测准确性。
- 防止过拟合:由于采用了随机性机制,随机森林能有效防止决策树的过拟合问题。
- 鲁棒性强:对噪声和异常值不敏感,具有较好的鲁棒性。
- 处理高维数据:能够处理大量特征的数据集,并能评估特征的重要性。
- 易于并行化:各个树的构建可以独立并行进行,容易扩展到大数据场景。
3.4.2缺点
- 模型复杂度高:由于集成了多棵决策树,随机森林的模型复杂度较高,不易解释。
- 计算成本大:构建多棵决策树的计算开销大,特别是在数据量大或特征数量多的情况下。
- 对单调特征不敏感:如果某个特征对于所有树来说都是有用的,则无法通过随机森林的特征重要性识别出来。
3.5随机森林的应用场景
随机森林广泛应用于以下场景:
- 分类问题:如文本分类、图像分类、疾病诊断等。
- 回归问题:如房价预测、销量预测等。
- 特征选择:通过评估特征的重要性,帮助选择有意义的特征。
- 异常检测:通过识别异常样本与正常样本的差异,应用于金融欺诈检测、网络入侵检测等领域。
3.6随机森林的参数
随机森林模型有多个参数可以调整,主要包括:
n_estimators
(决策树的数量):构建的决策树数量,通常数量越多,模型效果越好,但计算开销也越大。max_features
(最大特征数):每次分裂时随机选择的特征数量,可以是特定数值或占比(如"sqrt"
表示总特征数的平方根)。max_depth
(最大深度):单棵决策树的最大深度,防止树过度生长(过拟合)。min_samples_split
(最小分裂样本数):节点分裂所需的最小样本数,越大则越能防止过拟合。min_samples_leaf
(叶节点最小样本数):叶节点上所需的最小样本数。bootstrap
(是否有放回抽样):是否对样本进行有放回抽样构建子数据集。