此时,可以把多个算法集中起来,让不同的算法对同一个问题都进行运算,得出结果,对于分类问题,少数服从多数;对于回归问题,取最终多个结果的平均值。----集成学习的思路
生活中的集成学习(我们经常用集成学习却不自知):
eg1: 买东西找人推荐,10个人中,7个人说值得买,3个人说垃圾,我们大概率的会去买(采取多数人的意见)
eg2: 病情确诊(专家会诊)
(1)调用sklearn 中make_moons数据(该数据集中总共包含两类数据),并将其分为训练数据集和测试数据集
(2)分别用logisticRegression 、SVC、DecisionTreeClassifier针对训练数据集进行训练,得到测试数据集的预测值,分别记为y_predict1,y_predict2, y_predict3(由于该数据集只有两类,故y_predict中只包含0,1)
(3)y_predict = (y_predict1+y_predict2+y_predict3) >=2, 即若y_predict1,y_predict2, y_predict3有两个为1,则y_predict为1(True);否则,y_predict为0(False)
(4)调用accuracy_score,根据y_test(测试数据集真值输出)分别看一下y_predict,y_predict1,y_predict2, y_predict3的准确率
注意:此时参数voting=‘hard’(在分类问题中表示少数服从多数;在回归问题中,表示求平均(未看源码考证过,有待确定))
具体代码,详见Integrated-learning-hardvotting.ipynb
在一些情况下,少数服从多数是不合理的,更合理的投票,应该有权值。
eg3:唱歌比赛:专业评委+群众投票,此时,专业评委的权值就会更大一些
eg4:
根据Soft Voting的实现原理,Soft Voting要求集合的每一个模型都能估计概率(记为:predict_proba)
(1)调用sklearn 中make_moons数据(该数据集中总共包含两类数据),并将其分为训练数据集和测试数据集
(2)调用sklearn.ensemble.VotingClassifier,
参数:
Voting=‘Soft’
estimators=('log_clf', LogisticRegression()),
('svm_clf', SVC(probability=True)),
('dt_clf', DecisionTreeClassifier(random_state=666))
注意:SVC中,probability=True;决策树的生成过程有一定的随机因素,在调试过程中,可传入一个随机种子,把随机因素控制掉。
大多时候,SoftVoting好于HardVoting
代码详见:Integrated-learning-SoftVotting.ipynb
Q:为什么引入基于子模型的集成学习
虽然有很多机器学习方法,但是从投票的角度看,仍然是不够多
故需要,创建更多的子模型,集成更多的子模型的意见。
注意:子模型不能一致,子模型之间要有差异性!
Q:子模型之间如何创建差异性?
每个子模型只看样本数据的一部分。
eg: 一共有500个样本数据,每个模型只看100个样本数据。由于每个模型训练的样本数据较少,准确率可能不能保证,但是此时每个子模型不需要太高的准确率
Q:为什么每个子模型不需要太高的准确率?
eg:如果每个子模型只有51%的准确率
当我们只有一个子模型时,整体准确率:51%
理论上,子模型越多,最后整体的准确率就会越高,这个只是在我们的子模型只有51%的准确率的情况下,如果我们子模型的准确率再高一点,当我们有很多个子模型时,整体的准确率肯定是很高的。
eg:如果每个子模型只有60%的准确率
Q:如何创建子模型?
(1) 针对样本数据的随机采样bootstrap
Pasting: 不放回取样
比较具有随机性,比如总共有500个样本,每个子模型取100个,不放回取样,只能有5个子模型,相当于把样本分成了5份,怎样分将会影响最终的结果。
Bagging: 放回取样,更常用
没有很强烈的依赖随机,因为重复很多次,理论上把随机带来的问题给取消了。
OOB(Out-of-Bag)放回取样导致一部分样本很有可能没有取到(平均大约有37%的样本未取到,数学可推理证明),故我们可以不用将样本分为训练数据集和测试数据集,直接使用这部分没有取到的样本做测试、验证(sklearn算法中的参数oob_score)。
(2)针对特征进行随机采样Random Subspaces
随机的子空间。所有的特征构成了一个特征空间,每次在取样时,相当于在一个特征子空间中进行取样
(3)既针对样本,又针对特征进行随机采样 Random Patches
综合baging和random Subpaces, 既在行(样本)上随机取样,又在列(样本特征)上随机取样。
(1)调用sklearn 中make_moons数据(该数据集中总共包含两类数据),
注意:此时不用将其分为训练数据集和测试数据集,我们一般使用放回取样(Bagging)
(2)针对样本数据的随机采样:使用sklearn.ensemble.BaggingClassifier,设置参数:
n_eatimaters = 500, max_samples = 100, bootstrap = True, oob_score = True, n_iobs等参数。
最后查看属性 .oob_score_ 得出测试数据集的预测效果
思考: 这里得出的score是准确率吗?对于有偏数据,想看一下f1_score 怎么实现?
(3)针对特征进行随机采样:仍然使用sklearn.ensemble.BaggingClassifier,设置参数:
n_eatimaters = 500, max_features = 1, bootstrap_features = True, oob_score = True, n_iobs等参数。
最后查看属性 .oob_score_ 得出测试数据集的预测效果
(4)既针对样本,又针对特征进行随机采样:仍然使用sklearn.ensemble.BaggingClassifier,设置参数:
n_eatimaters = 500, max_samples = 100, bootstrap = True, max_features = 1, bootstrap_features = True, oob_score = True, n_iobs等参数。
最后查看属性 .oob_score_ 得出测试数据集的预测效果
详见代码:Bagging(bootstrap)_bootstrap_features.ipynb
Bagging
Base Estimator: Decision Tree
决策树在节点划分上,在随机的特征子集上寻找最优划分特征
Bagging
Base Estimator: Decision Tree
附:集成学习也可以解决回归问题。每一种分类算法对应的都有回归算法。
集成多个模型
每个模型都在尝试增强(Boosting)整体的效果
上一次未训练到的点的权重在下一次训练时就会大一些,(即每个子模型点和点之间的权重不一样)
对于分类问题,最终,综合所有的子模型进行投票,形成整体的决策结果。
对于回归问题,也是综合所有子模型的结果,取平均或是其他运算,最终得到整体的结果。
Base estimator:DecisionTreeClassifier
详见程序:adaBoosting_GradiwntBoosting.ipynb
同理:Boosting也可以解决回归问题