• 【实践】随机森林算法与决策树的效果对比(含Python代码)


    RandomForestClassifier

    参数列表:

    sklearn.ensemble.RandomForestClassifier (n_estimators=10, 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)
    
    • 1

    随机森林是非常具有代表性的Bagging集成算法,它的所有基评估器都是决策树,分类树组成的森林就叫做随机森林分类器,回归树所集成的森林就叫做随机森林回归器。我们主要讲解RandomForestClassifier,随机森林分类器。

    控制基评估器的参数
    criterion:不纯度的衡量指标,有基尼系数和信息熵两种选择

    max_depth:树的最大深度,超过最大深度的树枝都会被剪掉

    min_samples_leaf:一个节点在分枝后的每个子节点都必须包含至少min_samples_leaf个训练样本,否则分枝就不会发生

    min_samples_split:一个节点必须要包含至少min_samples_split个训练样本,这个节点才允许被分枝,否则分枝就不会发生

    max_features:max_features限制分枝时考虑的特征个数,超过限制个数的特征都会被舍弃,默认值为总特征个数开平方取整

    min_impurity_decrease:限制信息增益的大小,信息增益小于设定数值的分枝不会发生

    这些参数在随机森林中的含义,和决策树的内容一模一样,单个决策树的准确率越高,随机森林的准确率也会越高,因为装袋法是依赖于平均值或者少数服从多数原则来决定集成的结果的。

    实例:随机森林与单颗决策树效果比较

    导入我们需要的包:

    from sklearn.tree import DecisionTreeClassifier
    from sklearn.ensemble import RandomForestClassifier
    from sklearn.datasets import load_wine
    from sklearn.model_selection import train_test_split
    from sklearn.model_selection import cross_val_score
    import matplotlib.pyplot as plt
    from dtreeviz.trees import dtreeviz
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    两种方法训练数据集:

    wine=load_wine()
    data=wine.data
    target=wine.target
    X_train,X_test,y_train,y_test=train_test_split(data,target,test_size=0.3,random_state=1)
    clf = DecisionTreeClassifier(random_state=1)   #决策树实例化
    rfc = RandomForestClassifier(random_state=1)   #随机森林实例化
    #训练数据集
    clf = clf.fit(X_train,y_train)
    rfc = rfc.fit(X_train,y_train)
    score_c = clf.score(X_test,y_test)
    score_r=rfc.score(X_test,y_test)
    print("single tree:{}".format(score_c))
    print("randon forest:{}".format(score_r))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    我们看出决策树和随机森林的分数:

    single tree:0.9444444444444444
    randon forest:0.9814814814814815
    
    • 1
    • 2

    画出一百次交叉验证下随机森林与单颗决策树效果对比图:

    clf_l = []
    rfc_l = []
    # 交叉验证:是数据集划分为n分,依次取每一份做测试集,每n-1份做训练集,多次训练模型以观测模型稳定性的方法
    for i in range(10):
        # 随机森林交叉验证
        rfc = RandomForestClassifier(n_estimators=25)
        rfc_s = cross_val_score(rfc, wine.data, wine.target, cv=10).mean()
        rfc_l.append(rfc_s)
        # 决策树交叉验证
        clf = DecisionTreeClassifier()
        clf_s = cross_val_score(clf, wine.data, wine.target, cv=10).mean()
        clf_l.append(clf_s)
    
    plt.plot(range(1, 11), rfc_l, label="Random Forest")
    plt.plot(range(1, 11), clf_l, label="Decision Tree")
    plt.legend()
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    我们的结果如下:

    可以看出:随机森林的训练效果一直要比单颗决策树训练效果要好。

    单个决策树的波动轨迹和随机森林一致,再次验证了我们之前提到的,单个决策树的准确率越高,随机森林的准确率也会越高。

    我们看一下单棵决策树的可视化效果:


    随机森林的可视化我们最后再考虑。

    画出不同n_estimators的学习曲线:

    rfc = RandomForestClassifier(n_estimators=25,random_state=1)
    superpa = []
    for i in range(200):
        rfc = RandomForestClassifier(n_estimators=i+1,n_jobs=-1,random_state=1)
        rfc_s = cross_val_score(rfc,wine.data,wine.target,cv=10).mean()
        superpa.append(rfc_s)
    print(max(superpa),superpa.index(max(superpa)))
    plt.figure(figsize=[12,8])
    plt.plot(range(1,201),superpa)
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    结果为:

    在n_estimators = 25是出现最大score,之后就在这个值上下起伏。

    我们看一下另一个参数:max_features

    idx = []
    for j in range(15):
        rfc_1 = RandomForestClassifier(n_estimators=25,max_features=j+1,random_state=1)
        rfc_1_s = cross_val_score(rfc,wine.data,wine.target,cv=10).mean()
        idx.append(rfc_1_s)
    plt.figure(figsize=(12,8))
    plt.plot(range(1,16),idx)
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8


    说明没有什么特别的影响。

    接下来我们可视化随机森林:

    estimator_1=RandomForestClassifier(n_estimators=25,random_state=1)
    estimator_1.fit(X_train,y_train)
    m=0
    for per_estimator in estimator_1.estimators_:
        dot_data = tree.export_graphviz(per_estimator, out_file=None,
                                        class_names=['0', '1','2'],
                                        filled=True, rounded=True,
                                        special_characters=True)
        graph = pydotplus.graph_from_dot_data(dot_data)
        m = m + 1
        graph.write_pdf(str(m) + "DTtree.pdf")
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    最终的结果是我们得到了25棵决策树:


    我们展示几棵树:



    重要属性和接口
    随机森林中有三个非常重要的属性:.estimators_,.oob_score_以及.feature_importances_。

    .estimators_是用来查看随机森林中所有树的列表的。oob_score_指的是袋外得分。随机森林为了确保林中的每棵树都不尽相同,所以采用了对训练集进行有放回抽样的方式来不断组成信的训练集,在这个过程中,会有一些数据从来没有被随机挑选到,他们就被叫做“袋外数据”。这些袋外数据,没有被模型用来进行训练,sklearn可以帮助我们用他们来测试模型,测试的结果就由这个属性oob_score_来导出,本质还是模型的精确度。而.feature_importances_和决策树中的.feature_importances_用法和含义都一致,是返回特征的重要性。

    随机森林的接口与决策树完全一致,因此依然有四个常用接口:apply, fit, predict和score。除此之外,还需要注意随机森林的predict_proba接口,这个接口返回每个测试样本对应的被分到每一类标签的概率,标签有几个分类就返回几个概率。如果是二分类问题,则predict_proba返回的数值大于0.5的,被分为1,小于0.5的,被分为0。

    注意: 要保证单颗决策树的验证正确率大于50%,随机森林的预测效果才能比单颗树要好

  • 相关阅读:
    百度文心智能体平台(想象即现实):轻松上手,开启智能新时代!创建属于自己的智能体应用。
    Jmeter的接口自动化测试
    Hadoop(3.3.1): Capacity Scheduler:通过设置资源队列来满足不同业务之间的资源隔离、队列的弹性以及队列权限
    DeepMind爆发史:决定AI高峰的“游戏玩家”|深度学习崛起十年
    CSS 学习
    【UV打印机】PrintExp打印软件教程(五)-高级
    【毕业设计】 基于STM32的人体红外测温枪温度采集系统
    Python:每日一题之四平方和
    第63讲:MySQL存储过程变量传参的核心概念与案例
    Spring项目结合Maven【实现读取不同的资源环境】
  • 原文地址:https://blog.csdn.net/wzk4869/article/details/126259293