什么是集成学习?
对于不同的算法,同一个问题给出的结果可能不尽相同,这时我们应该如何判断最为准确?答案是使用不同算法都进行运算,最后留一个投票环节,这时多数算法认为的结果我们便认为是最为准确的结果(当然了这样也会有错误,这个后面进行讨论)
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
举个例子;
你可能觉得这不太准确,因为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也可以训练多层的模型,这里不予展开了。
网友评论