数据填充-随机森林填充

一、简介

随机森林(Random Forest)是一种集成学习方法,它通过构建多个决策树并将它们的预测结果进行汇总来做出最终的预测。结合了决策树的预测能力和集成学习的优势,以提高预测的准确性和鲁棒性。

1.随机森林的主要特点

  • 集成学习:随机森林通过构建多个决策树(通常称为“树”或“基学习器”)并将它们的预测结果结合起来,从而提高整体模型的预测性能。这通常通过平均(对于回归问题)或多数投票(对于分类问题)来实现。
  • 随机性:随机森林的“随机”体现在两个方面:
    • 数据随机性:在构建每棵树时,通常使用自助采样法(bootstrap sampling)从原始数据集中随机抽取样本。这意味着每棵树都是基于原始数据集的一个随机子集构建的,这有助于减少模型之间的相关性。
    • 特征随机性:在决定树的每个分裂点时,不是考虑所有的特征,而是随机选择一个特征子集,并从中选择最优的分裂特征。这进一步增加了模型的多样性。
  • 决策树的多样性:由于随机性的引入,每棵树都是独一无二的,这使得随机森林中的决策树具有多样性。这种多样性是随机森林能够减少过拟合并提高预测性能的关键。
  • 并行处理:随机森林中的每棵树都可以独立地构建和预测,这使得随机森林非常适合并行计算。在大数据集上,这可以显著减少训练时间。
  • 易于使用和解释:尽管随机森林是一个复杂的集成模型,但它通常很容易在大多数机器学习库中使用,并且其性能可以通过调整少数几个参数来优化。此外,由于它基于决策树,因此可以通过查看单个树的决策路径来部分地解释随机森林的预测。

二、代码应用

随机森林因其良好的性能和易用性而被广泛应用于各种领域,下面让我们了解一下随机森林对数据填充的应用。这段代码的主要目的是使用随机森林回归器来填充训练集和测试集中的缺失值。它定义了两个函数:rm_train_fill 用于填充训练数据,而 rm_test_fill 用于填充测试数据。这两个函数采用了相似的方法来处理缺失值,但分别针对训练集和测试集。

1.数据预处理

from sklearn.ensemble import RandomForestRegressor


def rm_train_fill(train_data, train_label):
    train_data_all = pd.concat([train_data, train_label], axis=1)
    train_data_all = train_data_all.reset_index(drop=True)
    train_data_X = train_data_all.drop('矿物类型', axis=1)
    null_num = train_data_X.isnull().sum()  # 查看每个特征中存在空数据的个数
    null_num_sorted = null_num.sort_values(ascending=True)  # 将空数据的类别从小到大排列

合并数据和标签:首先,将训练数据 train_data 和训练标签 train_label 合并成一个DataFrame train_data_all。并重新划分数据的索引。
准备特征集:从合并后的数据中删除目标列,得到特征集 train_data_X。
查找并排序缺失值:计算每个特征的缺失值数量,并按数量从小到大排序,以确定填充顺序。

2.数据集填充

    filling_feature = []  # 用来存储需要传入的特征名称
    for i in null_num_sorted.index:
        filling_feature.append(i)
        if null_num_sorted[i] != 0:  # 当前特征是否有空缺内容,用来判断是否开始训练模型
            X = train_data_X[filling_feature].drop(i, axis=1)  # 构建训练集
            y = train_data_X[i]

            row_numbers_mg_null = train_data_X[train_data_X[i].isnull()].index.tolist()  # 获取空数据的行
            X_train = X.drop(row_numbers_mg_null)  # 非空的数据作为训练数据集
            y_train = y.drop(row_numbers_mg_null)  # 非空的标签作为训练标签
            X_test = X.iloc[row_numbers_mg_null]  # 空的数据作为测试数据集
            regr = RandomForestRegressor(n_estimators=100,random_state=42)  # 创建线性回归
            regr.fit(X_train, y_train)  # 训练模型
            y_pred = regr.predict(X_test)  # 使用模型进行预测
            train_data_X.loc[row_numbers_mg_null, i] = y_pred
            print('完成训练数据集中的{}列数据的填充'.format(i))
	return train_data_X, train_data_all.矿物类型

迭代填充缺失值:

  • 遍历排序后的特征列表,对每个包含缺失值的特征进行迭代。
  • 对于每个特征,使用其他非缺失值的特征作为训练集(X),当前特征的非缺失值作为训练标签(y)。
  • 识别当前特征中缺失值的行索引,并分别构建训练集和测试集(测试集只包含缺失值)。
  • 使用随机森林回归器训练模型,并预测测试集中的缺失值。
  • 将预测值填充回原始数据集中对应的位置。
  • 返回填充后的数据:返回填充后的特征集 train_data_X 和原始的目标列“矿物类型”。

3.rm_test_fill 函数

def rm_test_fill(train_data, train_label, test_data, test_label):
    train_data_all = pd.concat([train_data, train_label], axis=1)
    train_data_all = train_data_all.reset_index(drop=True)

    test_data_all = pd.concat([test_data, test_label], axis=1)
    test_data_all = test_data_all.reset_index(drop=True)

    train_data_X = train_data_all.drop('矿物类型', axis=1)
    test_data_X = test_data_all.drop('矿物类型', axis=1)
    null_num = test_data_X.isnull().sum()
    null_num_sorted = null_num.sort_values(ascending=True)

    filling_feature = []
    for i in null_num_sorted.index:
        filling_feature.append(i)
        if null_num_sorted[i] != 0:
            X_train = train_data_X[filling_feature].drop(i, axis=1)
            y_train = train_data_X[i]
            X_test = test_data_X[filling_feature].drop(i, axis=1)
            row_numbers_mg_null = test_data_X[test_data_X[i].isnull()].index.tolist()
            X_test = X_test.iloc[row_numbers_mg_null]

            regr = RandomForestRegressor(n_estimators=100,random_state=42)
            regr.fit(X_train, y_train)
            y_pred = regr.predict(X_test)
            test_data_X.loc[row_numbers_mg_null, i] = y_pred
            print('完成测试数据集中的{}列数据的填充'.format(i))
    return test_data_X, test_data_all.矿物类型

这个函数与 rm_train_fill 非常相似,但它是针对测试集进行操作的。主要区别在于:

  • 合并测试数据和标签:同样地,将测试数据 test_data 和测试标签 test_label 合并成一个DataFrame
    test_data_all。
  • 准备测试集特征:从合并后的测试数据中删除目标列,得到测试集特征 test_data_X。
  • 使用训练集数据训练模型:在填充测试集的缺失值时,使用训练集的特征和标签来训练随机森林回归器。这是因为测试集通常不包含标签或完整的真实值,因此无法直接使用测试集本身来训练模型。
  • 迭代填充测试集中的缺失值:过程与 rm_train_fill 类似,但使用训练集的特征和标签来训练模型,并预测测试集中缺失的值。
  • 返回填充后的测试集:返回填充后的测试集特征 test_data_X和原始的目标列。

三、总结

随机森林是一种强大且灵活的机器学习算法,具有许多优点,但也存在一些潜在的缺点。
优点:

  • 高准确性:通过构建多个决策树并集成它们的预测结果,随机森林通常能够提供比单一决策树更高的预测准确性。
  • 鲁棒性:随机森林对噪声和异常值具有较好的容忍度,不容易受到过拟合的影响。这主要是因为每棵树都是基于原始数据集的一个随机子集构建的,并且每个节点的分裂都是基于随机选择的特征子集。
  • 易于实现和使用:随机森林在大多数机器学习库中都有现成的实现,如scikit-learn、R的randomForest包等,用户只需要调整少数几个参数即可。
  • 可解释性:尽管随机森林是一个复杂的集成模型,但由于其基于决策树,因此仍然具有一定的可解释性。用户可以通过查看单个树的决策路径来理解模型的预测过程。

缺点:

  • 计算成本高:尽管随机森林可以并行化,但在构建大量树时,计算成本仍然可能很高,特别是对于大型数据集和深度树。
  • 过拟合风险:虽然随机森林本身具有一定的抗过拟合能力,但如果树的数量过多或树过于复杂,仍然有可能发生过拟合。这通常需要通过交叉验证等方法来避免。
  • 模型复杂性:尽管随机森林相对容易使用,但其内部机制(如多棵树之间的交互)可能相当复杂,难以完全理解。
  • 对小数据集的敏感性:对于非常小的数据集,随机森林可能无法很好地工作,因为自助采样法可能导致某些重要样本的丢失。
  • 参数敏感性:随机森林的性能对参数(如树的数量、树的深度、特征子集的大小等)较为敏感,需要仔细调整以获得最佳性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值