集成学习和随机森林

作者: 抹茶不加茶 | 来源:发表于2020-03-15 20:12 被阅读0次

    什么是集成学习?

    对于不同的算法,同一个问题给出的结果可能不尽相同,这时我们应该如何判断最为准确?答案是使用不同算法都进行运算,最后留一个投票环节,这时多数算法认为的结果我们便认为是最为准确的结果(当然了这样也会有错误,这个后面进行讨论)
    sklearn中有一个集成学习的接口,Voting Classifier
    例如我们可以使用三个不同的分类算法对make_moons数据进行预测,最后我们进行投票:y_predicet=np.array((y_predicet1+y_predicet2+y_predicet3)>=2,dtype=int64)
    使用sklearn中的集成学习:

    from sklearn.ensemble import VotingClassifier
    voting_clf=VotingClassifier(estimators=[
        ('log_clf',LogisticRegression()),
        ('svm_clf',SVC()),
        ('dt_lcf',DecisionTreeClassifier())
    ],voting='hard')#hard表示严格的少数服从多数的投票
    voting_clf.fit(x_train,y_train)
    voting_clf.score(x_test,y_test)
    

    对于上面的代码,我们使用的是hard voting,有时候这样并不一定准确,更加合理的投票应该具有一定的权值,比如五常(懂的都懂),这时就被称为soft voting
    举个例子;

    hard voting
    你可能觉得这不太准确,因为b类的概率其实并不高
    我们使用soft voting
    soft voting
    这里相当于权值都相等,最为普通的soft voting中的权值
    要能进行soft voting,则要求集合的每一个模型都能估计概率
    knn决策树自然可以,而svm也可以计算概率,需要将probility=true即可
    from sklearn.ensemble import VotingClassifier
    voting_clf=VotingClassifier(estimators=[
        ('log_clf',LogisticRegression()),
        ('svm_clf',SVC(probability=True)),
        ('dt_lcf',DecisionTreeClassifier())
    ],voting='soft')
    voting_clf.fit(x_train,y_train)
    voting_clf.score(x_test,y_test
    

    可以得到更高的准确率(一般来说都可能比hard的效果更好)

    Bagging and Pasting

    虽然我们有很多机器学习算法,但是仍然很少,对于投票,我们自然是认为更多更好,这时我们不再从算法上想办法,我们从数据上想办法
    我们可以创建更多的子模型,集成更多子模型的意见
    而每个子模型从数据中取样数据的一部分
    对于单个子模型,我们其实不需要准确率太高,只有能高于50%就可以有很好的效果


    原因

    所以我们可以看到,使用很多子模型能带来的效果很好

    • Bagging:放回取样(常用)
    • Pasting:不放回取样
    from sklearn.tree import DecisionTreeClassifier
    from sklearn.ensemble import BaggingClassifier
    bagging_clf=BaggingClassifier(DecisionTreeClassifier(),
                                  n_estimators=500,max_samples=100,bootstrap=True
    )#使用决策树,500个子模型,放回取样
    bagging_clf.fit(x_train,y_train)
    

    提升子模型也可以提升准确率

    • OOB(Out-Of-Bag)
      放回取样中部分样本是始终取不到的,平均大概为37%
      我们可以取这部分没取过的样本进行测试/验证
    from sklearn.model_selection import train_test_split
    x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.2,random_state=666)
    
    from sklearn.tree import DecisionTreeClassifier
    from sklearn.ensemble import BaggingClassifier
    bagging_clf=BaggingClassifier(DecisionTreeClassifier(),
                                  n_estimators=500,max_samples=100,bootstrap=True,oob_score=True)#使用决策树,500个子模型,放回取样
    bagging_clf.fit(x,y)
    bagging_clf.oob_score_
    

    随机森林

    对于上面的例子,我们集成了成百上千个决策树,我们通常将它称为,随机森林
    sklearn中特地封装了随机森林:

    from sklearn.ensemble import RandomForestClassifier
    rf_clf=RandomForestClassifier(n_estimators=500,random_state=2,oob_score=True,n_jobs=-1)
    rf_clf.fit(x,y)
    

    提供额外的随机性,抑制过拟合,但增大了bias

    Ada Boosting and Gradient Boosting

    Boosting:每个模型都尝试增强整体的效果
    (模型之间不再是相互独立了)


    Ada Boosting
    Gradient Boosting

    Stacking

    Stacking是另一种集成学习的方式


    Stacking

    这里用三个模型训练原有的数据集,然后用这三个模型的输出作为输入再训练一个新的模型,其输出作为最终的结果

    训练流程

    其中上层的模型是有训练集二进行训练的,训练集一用于训练第一层的三个模型

    Stacking也可以训练多层的模型,这里不予展开了。

    相关文章

      网友评论

        本文标题:集成学习和随机森林

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