什么是集成学习?
集成学习是使用一系列学习器进行学习,并使用某种规则把各个学习结果进行整合从而获得比单个学习器更好的学习效果的一种机器学习方法。一般情况下,集成学习中的多个学习器都是同质的"弱学习器"。
我们生活中也有很多集成学习的思想,比如买手机找别人推荐,几个人推荐几部手机,看他们综合意见。看电影,10个人7个说好,3个说不好,综合他们决定去看。。。
比如利用:逻辑回归,svn,决策树进行分类====》投票,少数服从多数,以达到更精准的预测。
代码简单实例实现:
#生成半月数据集,500个数据点,噪音0.3
X,y=datasets.make_moons(n_samples=500,noise=0.3,random_state=44)
plot.scatter(X[y==0,0],X[y==0,1])
plot.scatter(X[y==1,0],X[y==1,1])
#将数据分成训练集和测试集
from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test=train_test_split(X,y,random_state=22)
#逻辑回归模型分类
from sklearn.linear_model import LogisticRegression
log_reg = LogisticRegression()
log_reg.fit(X_train,y_train)
log_reg.score(X_test,y_test)
#SVM模型分类
from sklearn.svm import SVC
svc_cls = SVC()
svc_cls.fit(X_train,y_train)
svc_cls.score(X_test,y_test)
#决策树分类
from sklearn.tree import DecisionTreeClassifier
dt_cls = DecisionTreeClassifier()
dt_cls.fit(X_train,y_train)
dt_cls.score(X_test,y_test)
#y123是三个模型预测的结果
y_predict1 = log_reg.predict(X_test)
y_predict2 = svc_cls.predict(X_test)
y_predict3 = dt_cls.predict(X_test)
#将三个结果集成起来,如果两个 以上都是1的话最终集成决策为1,否则为0,
#np.array是将布尔转成int
y_predict4 = np.array((y_predict1+y_predict2+y_predict3) >=2,dtype='int')
#将集成预测结果 和真实结果对比
from sklearn.metrics import accuracy_score
accuracy_score(y_test,y_predict4)
其中三个模型单独分类得分:0.896,0.952,0.928
集成后分类得分:0.952
使用sklearn接口完成:Voting Cla's'sifier
#使用sklearn中的VotingClassifier进行集成
from sklearn.ensemble import VotingClassifier
voting_cls = VotingClassifier(estimators=[
('log_reg',LogisticRegression()),
('svm_cls',SVC()),
('dt_cls',DecisionTreeClassifier())
],voting = 'hard')#集成方式:hard即少数服从多数
voting_cls.fit(X_train,y_train)
voting_cls.score(X_test,y_test)
结果:0.952
soft voting :
很多情况下少数服从多数的情况下并不是最好的,更合理的投票应该是有权值的。比如钢琴比赛,专家的权值应该高一些。
对于模型1和4几乎可以确定是A类型了,且2,3对AB类型判断没有明显的差距,这个时候投票仍然得到结果为B。
不仅看多少票投给AB,还有看每一票有多大的概率确认样本应该分哪一类,这样投票计算的形式就叫做soft voting。
用代码进行简单使用:
#使用sklearn中的VotingClassifier进行集成
from sklearn.ensemble import VotingClassifier
voting_cls2 = VotingClassifier(estimators=[
('log_reg',LogisticRegression()),
('svm_cls',SVC(probability=True)),#传入参数使svc支持概率,即分成某个类的概率
('dt_cls',DecisionTreeClassifier(random_state =666))
],voting = 'soft')#集成方式:soft