程序员机器学习与数据挖掘

集成学习和随机森林

2020-03-15  本文已影响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%就可以有很好的效果


原因

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

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)

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

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也可以训练多层的模型,这里不予展开了。

上一篇 下一篇

猜你喜欢

热点阅读