集成学习和随机森林

1、集成学习

前几篇写了常见的几个机器学习算法,用这些算法训练出的模型各有优劣。而在实际的工程中,目标一定是贪心的,想要的更多地是万无一失。不难想到,把所有的模型集成在一起,做一个强大的、拥有更多优势的模型,以“饱和式救援”的思路来保证万无一失,这便是集成学习的原理。

当把模型集成到一个大的模型中时,最终的结果听谁的又成了一个问题,一般会有两种解决方案:硬投票-hard_voting和软投票-soft_voting。硬投票,就是少数服从多数。软投票,就是综合了各个算法预测标签的概率,基于概率平均的投票,所以软投票的前置条件是集成的每个算法都能估计概率。

硬投票-hard_voting
软投票-soft_voting

从投票的角度来看,集成的模型越多越好,但机器学习的算法训练出的模型还是远远不够的。那么既然算法的类别只有这几类,训练出各个算法的不同子模型就是增加模型个数的一种解决方案。训练出不同子模型,重点就是模型的差异性,如何创建差异性呢?

这种差异性是通过每个子模型只看样本数据的一部分实现的。对于取数据,取样方式分为放回取样Bagging和不放回取样Pasting,更常用的是Bagging方式,统计学中叫bootstrap。对于每个子模型来讲,因为看的样本数据减少了,那么准确率肯定会降低。但从整体的效果而言,子模型的准确并不需要太高的准确率,如果单个子模型的准确率是51%的话,500个子模型最终效果可以达到65.6%;如果单个子模型的准确率是60%的话,500个子模型最终效果就可以达到99.999%。

采用bobo老师创建简单测试用例

import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.model_selection import train_test_split

# 创建测试数据
X, y = datasets.make_moons(n_samples=500, noise=0.3, random_state=42)

plt.scatter(X[y==0,0], X[y==0,1])
plt.scatter(X[y==1,0], X[y==1,1])
plt.show() # 见plt.show1
plt.show1
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42) # 创建训练和测试数据

from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import VotingClassifier

# 使用 Hard Voting Classifier
voting_clf = VotingClassifier(estimators=[
    ('log_clf', LogisticRegression()), 
    ('svm_clf', SVC()),
    ('dt_clf', DecisionTreeClassifier(random_state=666))],voting='hard') 

voting_clf.fit(X_train, y_train)
voting_clf.score(X_test, y_test)
# 0.89600000000000002


# 使用 Soft Voting Classifier
voting_clf2 = VotingClassifier(estimators=[
    ('log_clf', LogisticRegression()), 
    ('svm_clf', SVC(probability=True)),#probability=True,概率
    ('dt_clf', DecisionTreeClassifier(random_state=666))],
                             voting='soft') 

voting_clf2.fit(X_train, y_train)
voting_clf2.score(X_test, y_test)
# 0.91200000000000003

2、随机森林

随机森林,就是一种集成学习。它的子模型是一棵一棵的决策树,决策树作为一种非参数学习算法,使用它创建子模型更能产生差异性。

采用bobo老师创建简单测试用例

from sklearn.ensemble import RandomForestClassifier

rf_clf = RandomForestClassifier(n_estimators=500, oob_score=True, random_state=666, n_jobs=-1)
rf_clf.fit(X, y)
rf_clf.oob_score_
# 0.89200000000000002

rf_clf2 = RandomForestClassifier(n_estimators=500, max_leaf_nodes=16, oob_score=True, random_state=666, n_jobs=-1)
rf_clf2.fit(X, y)
rf_clf2.oob_score_
# 0.90600000000000003
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容