关于集成学习的总结(一) 投票法

最近在写那个完整的机器学习项目博客时候,我本来打算用一篇博客来写的。结果发现要写的越来越多。而且最关键的是,以前以为有些地方理解了,其实并没有理解。大概这就是写博客记笔记的好处吧。。。可惜我上高中初中那会,从来都没记过233333

这篇集成学习的总结呢,将结合sklearn 的运用说一说有关集成学习的一些东西,包括bagging、boosting、stacking和其他一些算法,我们会重点讨论随机森林、GBDT、Xgboost、LightGBM。也包括sklearn 当中怎么使用它们,sklearn中对这些参数怎么进行调参等。

每一篇打算要最后回答这样几个问题:

该集成学习方法的流程?
该集成学习方法如何选择特征 ?
该集成学习方法 如何构建特征 ?
该集成学习方法如何用于分类或回归?
该集成学习方法通过什么方式减少误差 ?
该集成学习方法的效果相比于传统的LR,SVM效果为什么好一些 ?
该集成学习方法 如何加速训练?
该集成学习方法的参数有哪些,如何调参 ?
该集成学习方法实战当中遇到的一些问题 ?
该集成学习方法的优缺点 ?
该集成学习算法与其他集成方法的不同?

投票分类

假设你已经训练了一些分类器,每一个都有 80% 的准确率。你可能有了一个逻辑斯蒂回归、或一个 SVM、或一个随机森林,或者一个 KNN,或许还有更多。现在我们可以在这些基学习器的基础上得到一个投票的分类器,把票数最多的类作为我们要预测的类别

为什么这样的基分类器有效呢?这其实和大数定律有关系。

让我们考虑下面一个问题:

假设你有一个有偏差的硬币,他有 51% 的几率为正面,49% 的几率为背面。如果你实验 1000 次,你会得到差不多 510 次正面,490 次背面,因此大多数都是正面。如果你用数学计算,你会发现在实验 1000 次后,正面概率为 51% 的人比例为 75%。你实验的次数越多,正面的比例越大(例如你试验了 10000 次,总体比例可能性就会达到 97%)。这是因为大数定律 :当你一直用硬币实验时,正面的比例会越来越接近 51%。你可以看到当实验次数上升时,正面的概率接近于 51%。最终所有 10 种实验都会收敛到 51%,它们都大于 50%。

假设你创建了一个包含 1000 个分类器的集成模型,其中每个分类器的正确率只有 51%(仅比瞎猜好一点点)。如果你用投票去预测类别,你可能得到 75% 的准确率!然而,这仅仅在所有的分类器都独立运行的很好、不会发生有相关性的错误的情况下才会这样,然而每一个分类器都在同一个数据集上训练,导致其很可能会发生这样的错误。他们可能会犯同一种错误,所以也会有很多票投给了错误类别导致集成的准确率下降。

这个的原理是什么呢?让我们翻出周志华老师的机器学习第172页:

由上面的不等式可以看出随着基分类器个数T的增大,集成的数目将成指数级下降,但是一定注意到这个相互独立的假设!!!

如果使每一个分类器都独立自主的分类,那么集成模型会工作的很好。去得到多样的分类器的方法之一就是用完全不同的算法,这会使它们会做出不同种类的预测,这会提高集成的正确率

投票器的使用

我们拿sklearn 中的make_moons 做一次实验,用sklearn 中的VotingClassifier 进行实验

from sklearn.ensemble import RandomForestClassifier
from sklearn.ensemble import VotingClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC
log_clf = LogisticRegression(random_state=42)
rnd_clf = RandomForestClassifier(random_state=42)
svm_clf = SVC(random_state=42)
vote_clf = VotingClassifier(estimators = [('lr',log_clf),('rf',rnd_clf),('svc',svm_clf)],voting='hard')
vote_clf.fit(X_train,y_train)
from sklearn.metrics import accuracy_score
for clf in (log_clf,rnd_clf,svm_clf,vote_clf):
    clf.fit(X_train,y_train)
    y_pred = clf.predict(X_test)
    print(clf.__class__.__name__,accuracy_score(y_pred,y_test))
#输出结果
LogisticRegression 0.864
RandomForestClassifier 0.872
SVC 0.888
VotingClassifier 0.896

 

可以看到实验结果有了轻微的提升。

现在我们可以试着回答开头的几个问题了

1.投票法的流程?

 投票法的流程是寻找几个基分类器,然后基于分类器的超过半数的结果作为最终的预测分类。


2.投票法如何选择特征 ?

投票法不寻找特征,寻找特征是各个基分类器要干的事情。


3.投票法 如何构建特征 ?

同第二问


4.投票法如何用于分类或回归?

如果是分类,投票法把超过半数以上的投票结果作为要预测的分类,投票法处理回归问题,是将各个基分类器的回归结果简单求平均


5.投票法通过什么方式减少误差 ?

通过上文给的证明可以看出,在基分类器的个数足够多且相互独立,即使他们之比什么都不干好一点点,也能指数级减少误差。


6.投票法的效果相比于传统的LR,SVM效果为什么好一些 ?

事实上如果基分类器都是这些传统模型且相互独立,投票法确实从上文中要比传统的方法的要好一些。但是呢,周志华老师给了一个非常精彩的例子在机器学习172页,当基分类器差不多时,投票法反而效果下降了


投票法 如何加速训练?
投票法的参数有哪些,如何调参 ?
投票法实战当中遇到的一些问题 ?
投票法的优缺点 ?
该集成学习算法与其他集成方法的不同

这几个问题 一起回答,加速训练即加速基分类器的训练就好,调参是基分类器的参数,投票法的优缺点主要看基分类的独立性,如果是决策树、SVM这几种完全不同的思路的基分类器,可能效果会好些。如果都是树模型说不定会取得比较差的结果。

猜你喜欢

转载自blog.csdn.net/PythonstartL/article/details/83010928