(一)集成学习
是考虑多方面的决策结果,最终得到一个最好的结果,比如,分类问题中,集成学习就是用三种分类模型分别预测一个样本,比较这三种分类模型最终的预测结果,将其进行投票,得票多的那一类就作为分类结果。对于回归任务,同样将一个样本分别送入三个回归器中进行预测,最终,三个预测值得平均值作为最终结果。
以下用手写代码模拟投票过程。选用以下三个分类器,分类的结果用 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。