文章目录
- 一、简介
- 2.随机森林的主要特点
- 二、代码应用
- 1.数据预处理
- 2.数据集填充
- 3.rm_test_fill 函数
- 三、总结
一、简介
随机森林(Random Forest)是一种集成学习方法,它通过构建多个决策树并将它们的预测结果进行汇总来做出最终的预测。结合了决策树的预测能力和集成学习的优势,以提高预测的准确性和鲁棒性。
2.随机森林的主要特点
- 集成学习:随机森林通过构建多个决策树(通常称为“树”或“基学习器”)并将它们的预测结果结合起来,从而提高整体模型的预测性能。这通常通过平均(对于回归问题)或多数投票(对于分类问题)来实现。
- 随机性:随机森林的“随机”体现在两个方面:
- 数据随机性:在构建每棵树时,通常使用自助采样法(bootstrap sampling)从原始数据集中随机抽取样本。这意味着每棵树都是基于原始数据集的一个随机子集构建的,这有助于减少模型之间的相关性。
- 特征随机性:在决定树的每个分裂点时,不是考虑所有的特征,而是随机选择一个特征子集,并从中选择最优的分裂特征。这进一步增加了模型的多样性。
- 决策树的多样性:由于随机性的引入,每棵树都是独一无二的,这使得随机森林中的决策树具有多样性。这种多样性是随机森林能够减少过拟合并提高预测性能的关键。
- 并行处理:随机森林中的每棵树都可以独立地构建和预测,这使得随机森林非常适合并行计算。在大数据集上,这可以显著减少训练时间。
- 易于使用和解释:尽管随机森林是一个复杂的集成模型,但它通常很容易在大多数机器学习库中使用,并且其性能可以通过调整少数几个参数来优化。此外,由于它基于决策树,因此可以通过查看单个树的决策路径来部分地解释随机森林的预测。
二、代码应用
随机森林因其良好的性能和易用性而被广泛应用于各种领域,下面让我们了解一下随机森林对数据填充的应用。这段代码的主要目的是使用随机森林回归器来填充训练集和测试集中的缺失值。它定义了两个函数:rm_train_fill 用于填充训练数据,而 rm_test_fill 用于填充测试数据。这两个函数采用了相似的方法来处理缺失值,但分别针对训练集和测试集。
1.数据预处理
from sklearn.ensemble import RandomForestRegressordef 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_predprint('完成训练数据集中的{}列数据的填充'.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_predprint('完成测试数据集中的{}列数据的填充'.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包等,用户只需要调整少数几个参数即可。
- 可解释性:尽管随机森林是一个复杂的集成模型,但由于其基于决策树,因此仍然具有一定的可解释性。用户可以通过查看单个树的决策路径来理解模型的预测过程。
缺点:
- 计算成本高:尽管随机森林可以并行化,但在构建大量树时,计算成本仍然可能很高,特别是对于大型数据集和深度树。
- 过拟合风险:虽然随机森林本身具有一定的抗过拟合能力,但如果树的数量过多或树过于复杂,仍然有可能发生过拟合。这通常需要通过交叉验证等方法来避免。
- 模型复杂性:尽管随机森林相对容易使用,但其内部机制(如多棵树之间的交互)可能相当复杂,难以完全理解。
- 对小数据集的敏感性:对于非常小的数据集,随机森林可能无法很好地工作,因为自助采样法可能导致某些重要样本的丢失。
- 参数敏感性:随机森林的性能对参数(如树的数量、树的深度、特征子集的大小等)较为敏感,需要仔细调整以获得最佳性能。
- 类别不平衡问题:在处理类别不平衡的数据集时,随机森林可能会偏向于多数类。这可以通过一些技术(如重采样、类别权重等)来缓解,但可能需要额外的努力。