机器学习初学者——集成学习学习笔记

(一)集成学习

是考虑多方面的决策结果,最终得到一个最好的结果,比如,分类问题中,集成学习就是用三种分类模型分别预测一个样本,比较这三种分类模型最终的预测结果,将其进行投票,得票多的那一类就作为分类结果。对于回归任务,同样将一个样本分别送入三个回归器中进行预测,最终,三个预测值得平均值作为最终结果。
  以下用手写代码模拟投票过程。选用以下三个分类器,分类的结果用 1 和 0 表示,经过验证,最终经过三者的投票得到的分类结果准确度比任何一个都要高。

from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC
from sklearn.tree import DecisionTreeClassifier
log=LogisticRegression()
svc=SVC()
DT= DecisionTreeClassifier()
log.fit(x_train,y_trian)
svc.fit(x_train,y_train)
dt.fit(x_train.y_trian)
y_pre1=logg.predict(x_test)
y_pre2=svc.predict(x_test)
y_pre3=dt.predict(x_test)
y_pre=np.array((y_pre1+y_pre2+y_pre3)>=2,dtype='int')
from sklearn.metrics import accuracy_score
accuracy_score(y_test,y_pre)

sklearrn中代码实现

============================Hard Voting=============================
from sklearn.ensemble import VotingClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC
from sklearn.tree import DecisionTreeClassifier
vot=VotingClassifier([
	('log',LogistisRegression()),
	('svc',SVC()),
	('dt',DecisionTreeClassifier())
],voting='hard')
vot.fit(x_train,y_train)
vot.score(x_test,y_test)

(二)Soft Voting

Soft Voting与Hard Voting相同之处在于,两者都是通过每个算法的投票来决定最终的分类结果,而不同之处在于,后者在决策时,每一种分类算法的结果重要程度相同,但是显然有些情况下,不同的模型对一个样本额预测准确率不同,因此,权重不同。那么前者就考虑了每个模型的权重。其权重值为模型将一个样本分为某一类的概率。
  比如,KNN将某一个样本分为某一类的概率就是由其周围的k个样本点的两类样本的比例决定的。逻辑回归本身就是基于概率的分类模型,决策树与KNN类似。SVM计算概率的过程较为复杂,但sklearn中自身包含了概率的计算。

注意,默认情况下,SVC不支持计算概率,这种情况不适用于Soft Voting,因此在对SVC实例化时,传入的参数probability=True

from sklearn.ensemble import VotingClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC
from sklearn.tree import DecisionTreeClassifier
vot=VotingClassifier([
	('log',LogistisRegression()),
	('svc',SVC(probablity)),
	('dt',DecisionTreeClassifier())
],voting='soft')
vot.fit(x_train,y_train)
vot.score(x_test,y_test)

(三)子模型的创建

由于集成学习需要集成不同的模型,但用于分类的算法种类较少,不能满足成百上千的数量。因此,可以创建许多子模型,对这些子模型集成,以这些子模型的投票结果作为最终的决策。
  子模型需要满足:子模型不能一致,要有差异性
  保证子模型具有差异性的两个途径:(1),每个子模型选取样本数据的一部分,(2)对于有许多属性的样本,每个子模型只选取其中一部分属性。
  当子模型的数量足够,即使每一个子模型的准确率都较低,但只要满足其准确率高于50%,那么最终依据少数服从多数的原则,只要有足够多的子模型,所有模型的集成模型的准确率将有可能升至99%。比如,如果有3个子模型,每个子模型的准确率为51%,最终的准确率为51.5%,如果有500个子模型,们每个子模型的准确率为0.6,那么模型正确至少需要251个子模型投票正确,最终模型的准确率计算公式如式3-2
  在这里插入图片描述在这里插入图片描述
            式3-1                      式3-2

3.1抽样方式——bagging

为了创建更多的子模型,一般采用放回取样(Bagging)。不放回取样(Pasting)很少用。下面以决策树为例,采用放回取样的方式构建500棵决策树。

from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import BaggingClassifier
bag_clf=BaggingClassifier(DecisionTreeClassifier(),n_estimators=500,max_samples=100,bootstrap=True)
==这里n_estimators代表子模型的数量,max_samples代表有放回的采样的数量,bootstrap决定了是否放回,True代表放回。

多余一个数据集,如果有n个样本,那么,每个样本每次被取到的概率为1/n,不被取到的概率为(1-1/n),那么极端情况下,有放回地取n次,当n无限大的时候,下式表示了创建一棵树的时候,一个样本被取到的概率,经过模拟可知,该值为63%左右,这意味着,创建一棵树时,大约有2/3的样本被取到,那么剩余的1/3未被取到的样本就是OOB(out of bag)这些样本可用于检测这一棵树的准确率,最终整个集成模型的准确率是所有子模型的准确率的平均值。。OOB的存在可以省去将样本划分为训练测试数据集的步骤。
在这里插入图片描述
代码实现

from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import BaggingClassifier
bag_clf=BaggingClassifier(DecisionTreeClassifier(),n_estimators=500,max_samples=100,bootstrap=True,oob_socre=True)
bag_clf.fit(x,y)
bag_clf.oob_score_ #用于查看准确率

这里的oob_score=True表示,要单独记录没有被取到的样本。并将其用于验证。

3.2bagging的并行处理

由于每个子模型独立训练,互不干扰,,可以并行处理。用n_jobs参数来控制机器的几个核同时处理。
以下代码可用于查看所用的核(n_jobs)数量不同时,运行的时间。

%%time
bagging=BaggingClassifier(DecisionTreeClassifier(),
                         n_estimators=1000,max_samples=100,bootstrap=True,oob_score=True,n_jobs=2)
bagging.fit(x,y)
3.3通过控制随机抽取属性控制模型的差异化

针对特征随机取样(Random Subspaces),这种方法通常适用于样本的特征比较多的情况下,
即针对样本进行随机取样,又针对特征随机取样(Random Patches)。

代码实现:

from sklearn.ensemble import BaggingClassifier
bag=BaggingClassifier(DecisionTreeClassifier(),
					 n_estimators=500,max_samoples=100,
					 bootstrap=True,oob_score=True,
					 n_jobs=-1,
					 max_features=10,bootstrap_feature=True)

以上代码中,max_features表示针对特征随机采样,bootstrap_feature=True意味着特征放回取样。如果只针对特征随机,而样本不随机,可以将参数max_samples赋值所有样本数量,并且不放回取样,即bootstrap=False。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值