《机器学习》—— 随机森林实现二分类问题

一、什么是随机森林

随机森林(Random Forest)是一种集成学习方法,属于监督学习算法,主要用于分类和回归任务。它通过在数据集的多个子集上构建多个决策树,并输出这些树预测结果的众数(对于分类问题)或平均值(对于回归问题)来工作。随机森林以其高准确率不易过拟合以及能够有效评估变量的重要性等特点而广受欢迎。

二、随机森林的主要特点

  • 集成学习:通过结合多个决策树的预测结果来做出最终决策,可以提高模型的泛化能力。
  • 随机性:在构建每棵树时,随机选择部分特征(特征子集)和样本(有放回抽样,称为bootstrap sampling),这有助于减少过拟合并增加模型的多样性。
  • 并行性:由于每棵树的构建是独立的,因此可以并行化计算,提高训练速度。
  • 易于使用和调参:Scikit-learn 提供了易于使用的接口和丰富的参数,使得随机森林模型易于构建和调优。

三、随机森林参数

  • Python中是使用sklearn库中的 sklearn.ensemble 中的 RandomForestClassifier 类来实现随机森林的方法

  • sklearn.ensemble.RandomForestClassifier 中有很多的参数的默认值如下:

    class sklearn.ensemble.RandomForestClassifier(
    	n_estimators=’warn’, criterion=’gini’, max_depth=None, 
    	min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0, 
    	max_features=’auto’, max_leaf_nodes=None, min_impurity_decrease=0.0, 
    	min_impurity_split=None, bootstrap=True, oob_score=False, n_jobs=None, 
    	random_state=None, verbose=0, warm_start=False, class_weight=None
    )
    
  • 一些重要参数的讲解:

    • n_estimators :

      • 随机森林中决策树的个数。
    • criterion :

      • 节点分割依据,默认为基尼系数。
      • 可选【entropy:信息增益】
    • max_depth

      • default=(None)设置决策树的最大深度,默认为None。
      • (1)数据少或者特征少的时候,可以不用管这个参数,按照默认的不限制生长即可
      • (2)如果数据比较多特征也比较多的情况下,可以限制这个参数,范围在10~100之间比较好】
    • min_samples_split :

      • 这个值限制了子树继续划分的条件,如果某节点的样本数少于设定值,则不会再继续分裂。
      • 默认是2 如果样本量不大,不需要管这个值。如果样本量数量级非常大,则建议增大这个值。
    • min_samples_leaf :

      • 这个值限制了叶子节点最少的样本数,如果某叶子节点数目小于样本数,则会和兄弟节点一起被剪枝。 默认是1,可以输入最少的样本数的整数,或者最少样本数占样本总数的百分比。如果样本量不大,不需要管这个值。如果样本量数量级非常大,则推荐增大这个值。
      • 叶是决策树的末端节点。 较小的叶子使模型更容易捕捉训练数据中的噪声。 一般来说,我更偏向于将最小叶子节点数目设置为大于50。在你自己的情况中,你应该尽量尝试多种叶子大小种类,以找到最优的那个。
      • 比如,设定为50,此时,上一个节点(100个样本)进行分裂,分裂为两个节点,其中一个节点的样本数小于50个,那么这两个节点都会被剪枝
    • min_weight_fraction_leaf :

      • 这个值限制了叶子节点所有样本权重和的最小值,如果小于这个值,则会和兄弟节点一起被剪枝。 默认是0,就是不考虑权重问题。一般来说,如果我们有较多样本有缺失值,或者分类树样本的分布类别偏差很大,就会引入样本权重,这时我们就要注意这个值了。【一般不需要注意】
    • max_features :

      • 随机森林允许单个决策树使用特征的最大数量。选择最适属性时划分的特征不能超过此值。
      • 当为整数时,即最大特征数;当为小数时,训练集特征数*小数;
        if “auto”, then max_features=sqrt(n_features).
        If “sqrt”, then max_features=sqrt(n_features).
        If “log2”, then max_features=log2(n_features).
        If None, then max_features=n_features.
      • 增加max_features一般能提高模型的性能,因为在每个节点上,我们有更多的选择可以考虑。 然而,这未必完全是对的,因为它降低了单个树的多样性,而这正是随机森林独特的优点。 但是,可以肯定,你通过增加max_features会降低算法的速度。 因此,你需要适当的平衡和选择最佳max_features。
    • max_leaf_nodes:

      • 通过限制最大叶子节点数,可以防止过拟合,默认是"None”,即不限制最大的叶子节点数。如果加了限制,算法会建立在最大叶子节点数内最优的决策树。如果特征不多,可以不考虑这个值,但是如果特征分成多的话,可以加以限制,具体的值可以通过交叉验证得到。
      • 比如,一颗决策树,如果不加限制的话,可以分裂100个叶子节点,如果设置此参数等于50,那么最多可以分裂50个叶子节点
    • min_impurity_split:

      • 这个值限制了决策树的增长,如果某节点的不纯度(基于基尼系数,均方差)小于这个阈值,则该节点不再生成子节点。即为叶子节点 。一般不推荐改动默认值1e-7。
    • bootstrap=True:

      • 是否有放回的采样,按默认,有放回采样
    • n_jobs=1

      • 并行job个数。这个在是bagging训练过程中有重要作用,可以并行从而提高性能。1=不并行;
      • n:n个并行;
      • -1:CPU有多少core,就启动多少job。

四、案例的代码实现

  • 这里有一份关于统计出现在文件中的关键字的概率,来判断此文件是否删除的数据集

    • 最后一列为标签列,标签为1的表示要删除,为0的表示不要删除
    • 每一行代表一条文件数据,一共4000+数据
    • 如下图所示:
      在这里插入图片描述
  • 步骤:

    • 1、读取数据
    • 2、划分训练集和测试集
    • 3、构建模型并训练
    • 4、将测试集传入模型进行测试
  • 1、读取数据

    import pandas as pd
    # 用pandas方法读取数据,数据存放在名为spambase.csv的文件中
    data = pd.read_csv("spambase.csv")
    
  • 2、划分训练集和测试集

    X = data.iloc[:, :-1]  # 读取除了最后一列的所有数据,作为训练和测试数据
    Y = data.iloc[:, -1]  # 读取最后一列,作为标签
    # 导入sklearn库中的train_test_split方法对数据进行切分
    from sklearn.model_selection import train_test_split
    # 划分20%的数据作为测试集数据,其余的作为训练集数据,并抛出一个随机种子,为了以后每次运行所划分的数据都与第一次相同
    x_train, x_test, y_train, y_test = \
        train_test_split(X, Y, test_size=0.2, random_state=100)
    # x_train:训练集
    # x_test:测试集
    # y_train:训练集标签
    # y_test:测试集标签
    
  • 3、构建模型并训练

    # 导入随机森林方法
    from sklearn.ensemble import RandomForestClassifier
    # 调用方法,并用一个变量接收
    # 因为此训练数据并不是很多,所以一些参数都以默认的值进行训练
    rf = RandomForestClassifier(
        n_estimators=100,
        max_features=0.8,
        random_state=0
    )
    # 传入训练集,和训练集标签
    rf.fit(x_train, y_train)
    
  • 4、将测试集传入模型进行测试

  • 调用以下两种方法对模型进行评估

    • predict 方法接受一个数组(或类似数组的结构,如列表的列表、Pandas DataFrame等),其中包含了要预测的目标变量的新数据点。然后,它使用训练好的模型对这些数据点进行预测,并返回一个包含预测结果的数组。

    • metrics.classification_report 是 scikit-learn(一个流行的 Python 机器学习库)中的一个函数,用于展示主要分类指标的文本报告。这个函数特别适用于评估分类模型的性能,尤其是在处理多类分类问题时。它提供了每个类别的精确度(precision)、召回率(recall)、F1 分数(F1-score)和支持度(support,即每个类别的真实样本数量)的详细报告。

      from sklearn import metrics
      # 传入测试集,并查看测试出的标签结果
      test_predicted = rf.predict(x_test)
      print(test_predicted)
      # 传入测试集标签(每个测试数据的真实标签)和测试出的标签结果
      print(metrics.classification_report(y_test, test_predicted))
      
    • 结果如下:
      在这里插入图片描述
      在这里插入图片描述

    • 从各个指标的分数来看,随机森林模型的分类性能还是很强的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值