美文网首页
机器学习:04. 随机森林之RandomForestClassi

机器学习:04. 随机森林之RandomForestClassi

作者: 医学小白学生信 | 来源:发表于2021-03-08 21:57 被阅读0次

    1. 集成算法

    1.1 集成算法是通过在数据上构建多个模型,集成所有模型的建模结果,包括随机森林,梯度提升树(GBDT),Xgboost等。
    1.2 多个模型集成成为的模型叫做集成评估器(ensemble estimator),组成集成评估器的每个模型都叫做基评估器(base estimator)。通常来说,有三类集成算法:装袋法(Bagging),提升法(Boosting)和stacking。
    1.3 装袋法的核心思想是构建多个相互独立的评估器,装袋法的代表模型就是随机森林
    1.4 提升法的核心思想是结合弱评估器的力量一次次对难以评估的样本
    进行预测
    ,从而构成一个强评估器。提升法的代表模型有Adaboost和梯度提升树

    sklearn中的集成算法模块ensemble

    2. RandomForestClassifier 随机森林分类

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

    2.1 重要参数(n_estimators,random_state,boostrap和oob_score)

    1. n_estimators

    这是森林中树木的数量,即基评估器的数量。n_estimators越大,模型的效果往往越好。
    一个随机森林和单个决策树效益的对比
    1. 导入包

    #1.导入包
    #代表画图的时候,需要这个环境
    %matplotlib inline 
    from sklearn.tree import DecisionTreeClassifier #决策树
    from sklearn.ensemble import RandomForestClassifier #集成学习中的随机森林
    

    2. 导入数据集

    #2 导入数据集
    wine = load_wine()
    wine.data
    wine.target
    

    3. sklearn建模的基本流程
    1.实例化
    2.训练集带入实例化后的模型进行训练,使用的接口是fit
    3.使用其它接口将测试集导入我们训练好的模型,去获取我们希望获取的结果(score,y_test)

    from sklearn.model_selection import train_test_split
    Xtrain,Xtest,Ytrain,Ytest = train_test_split(wine.data,wine.target,test_size=0.3)
    
    #复习:sklearn建模的基本流程
    clf = DecisionTreeClassifier(random_state=0)
    rfc = RandomForestClassifier(random_state=0)
    
    clf = clf.fit(Xtrain,Ytrain)
    rfc = rfc.fit(Xtrain,Ytrain)
    
    score_c = clf.score(Xtest,Ytest) #是精确度
    score_r = rfc.score(Xtest,Ytest)
    
    print('Single Tree:{}'.format(score_c)
         ,'Random Forest:{}'.format(score_r)) #format是将分数转换放在{}中
    

    4. 画出随机森林和决策树在一组交叉验证下的效果对比

    #4. 画出随机森林和决策树在一组交叉验证下的效果对比
    #交叉验证:是数据集划分为n分,依次取每一份做测试集,每n-1份做训练集,多次训练模型以观测模型稳定性的方法
    
    from sklearn.model_selection import cross_val_score
    import matplotlib.pyplot as plt
    
    rfc = RandomForestClassifier(n_estimators=25)
    rfc_s = cross_val_score(rfc,wine.data,wine.target,cv=10)
    clf = DecisionTreeClassifier()
    clf_s = cross_val_score(clf,wine.data,wine.target,cv=10)
    
    plt.plot(range(1,11),rfc_s,label = "RandomForest")
    plt.plot(range(1,11),clf_s,label = "Decision Tree")
    plt.legend()
    plt.show()
    
    可以看到随机森林的准确率高于决策树
    #上述交叉验证更为简单的实现方式
    # for循环两种交叉验证,先计算RandomForest,再计算DecisionTree
    label = "RandomForest"
    for model in [RandomForestClassifier(n_estimators=25),DecisionTreeClassifier()]:
        score = cross_val_score(model,wine.data,wine.target,cv=10)
        print("{}:".format(label)),print(score.mean()) #这边打印的是计算10次得到的acuraccy的平均值
        plt.plot(range(1,11),score,label = label)
        plt.legend()
        label = "DecisionTree"
    

    5. 画出随机森林和决策树在十组交叉验证下的效果对比

    # 5. 画出随机森林和决策树在十组交叉验证下的效果对比
    rfc_l = []
    clf_l = []
    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()
    
    单个决策树的准确率越高,随机森林的准确率也会越高
    6. n_estimators的学习曲线
    #6. n_estimators的学习曲线
    superpa = []
    for i in range(200):
        rfc = RandomForestClassifier(n_estimators=i+1,n_jobs=-1) #这里就是进行了200次的随机森林计算,每次的n_estimator设置不一样
        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=[20,5])
    plt.plot(range(1,201),superpa)
    plt.show()
    # list.index(object) >>>返回对象object在列表list中的索引 68是i值,但是n_estimators=i+1,所以最大准确率对应的n_estimators是69.
    
    n_estimator在达到一定值后,准确率就会在一定范围波动,并不会一直上升而趋向于1。

    2. random_state

    在决策树中,一个random_state只控制生成一棵树,而随机森林中的random_state控制的是生成森林的模式。当random_state固定时,随机森林中生成是一组固定的树,但每棵树依然是不一致的。

    rfc = RandomForestClassifier(n_estimators=25,random_state=2)
    rfc = rfc.fit(Xtrain,Ytrain)
    # #随机森林的重要属性之一:estimators,查看森林中树的状况
    rfc.estimators_[0].random_state #就是查看第0棵树的randomstate是多少
    #1872583848
    
    #通过循环将随机森林中所有决策树的random_state导出
    for i in range(len(rfc.estimators_)):
        print(rfc.estimators_[i].random_state)
    

    3. bootstrap & oob_score

    袋装法正是通过有放回的随机抽样技术来形成不同的训练数据,bootstrap就是用来控制抽样技术的参数。bootstrap参数默认True,代表采用这种有放回的随机抽样技术。
    这种抽样方法会有约37%的训练数据被浪费掉,没有参与建模,这些数据被称为袋外数据(out of bag data,简写为oob)。在使用随机森林时,我们可以不划分测试集和训练集,只需要用袋外数据来测试我们的模型即可。oob_score_来查看我们的在袋外数据上测试的结果。

    #无需划分训练集和测试集,用袋外数据来测试模型
    rfc = RandomForestClassifier(n_estimators=25,oob_score=True) #oob_score默认是FALSE,bootstrap默认是TRUE.
    rfc = rfc.fit(wine.data,wine.target) #用所有的数据来训练
    #重要属性oob_score_
    rfc.oob_score_  #查看袋外数据在模型上的测试结果
    #0.9606741573033708
    

    2.2 重要属性和接口

    重要属性:.estimators_ .oob_score_ 和.feature_importances_

    接口:apply, fit, predict, score和predict_proba

    rfc = RandomForestClassifier(n_estimators=25)
    rfc = rfc.fit(Xtrain, Ytrain) #fit接口是训练集用的
    rfc.score(Xtest,Ytest)
    rfc.feature_importances_ #得出所有特征的重要性数值
    rfc.apply(Xtest) #返回测试集每个样本在所在树的叶子节点的索引
    rfc.predict(Xtest) #返回对测试集的预测标签
    rfc.predict_proba(Xtest) #每一个样本分配到每一个标签的概率
    

    参数是用来实例化确定模型有哪些限制条件的,属性是模型训练集的一些信息;fit接口是用于训练集的,剩下的接口基本都是用于测试集的。

    相关文章

      网友评论

          本文标题:机器学习:04. 随机森林之RandomForestClassi

          本文链接:https://www.haomeiwen.com/subject/cugpqltx.html