集成学习通过建立几个模型组合的来解决单一预测问题。它的工作原理是生成多个分类器/模型,各自独立地学习和作出预测。这些预测最后结合成单预测,因此优于任何一个单分类的做出预测。
百度百科的解释:
1.给定一个弱学习算法,和一个训练集;
2.单个弱学习算法准确率不高;
3.将该学习算法使用多次,得出预测函数序列,进行投票;
4.最后结果准确率将得到提高.
简单的理解就是同一种算法换用不同的训练集或者参数得到不同的预测函数,通过预测函数预测结果,最终或是取平均值得到结果或者取众数得到结果。其中典型的代表就是随机森林
百度百科中的解释:
AdaBoost算法中不同的训练集是通过调整每个样本对应的权重来实现的。开始时,每个样本对应的权重是相同的,即其中 n 为样本个数,在此样本分布下训练出一弱分类器。对于分类错误的样本,加大其对应的权重;而对于分类正确的样本,降低其权重,这样分错的样本就被突显出来,从而得到一个新的样本分布。在新的样本分布下,再次对样本进行训练,得到弱分类器。依次类推,经过 T 次循环,得到 T 个弱分类器,把这 T 个弱分类器按一定的权重叠加(boost)起来,得到最终想要的强分类器。 AdaBoost算法的具体步骤如下:
堆叠算法。将训练分为多个阶段,使用多个分类器,如KNN、SVM等,当一个阶段的分类完成后,将得到的结果再投入第二阶段进行训练,以此类推。如先拿KNN得到结果,再将结果扔到逻辑回归里训练再得到一个结果…堆叠算法确实能够提升准确率
交叉验证的目的是为了使评估模型更准确可信
将拿到的数据分为训练集和测试集,如将训练集和测试集分为五份,每次取其中一份作为测试集,其余为训练集,进行5次训练与测试,得到五个准确率,并取平均得到平均准确率。称之为五折交叉验证,如图。
通常情况下,有很多参数是需要手动指定的(如k-近邻算法中的K值),这种叫超参数。但是手动过程繁杂,所以需要对模型预设几种超参数组合。每组超参数都采用交叉验证来进行评估。最后选出最优参数组合建立模型。如果是用多组超参数,譬如参数1给出了3,5,7这三个值,参数2给出了1,2,8三个值,那么经过组合后一共有九种组合方式
调用到的函数:
#引入GridSearchCV网格搜索与交叉验证的包
from sklearn.model_selection import GridSearchCV
sklearn.model_selection.GridSearchCV(estimator, param_grid=None,cv=None)
estimator 表示函数的训练模型,如K近邻或者决策树等
param_grid 表示训练模型要调的参数,以字典形式传入
cv表示进行几折交叉验证
在机器学习中,随机森林是一个包含多个决策树的分类器,并且其输出的类别是由个别树输出的类别的众数而定。是bagging算法中的代表。例如,我们训练了五个决策树,其中四个决策树得到的结果是1,一个得到的结果是2,那么我们的最终结果就是1。
根据下列算法而建造每棵树:
用N来表示训练用例(样本)的个数,M表示特征数目。
输入特征数目m,用于确定决策树上一个节点的决策结果;其中m应远小于M。
从N个训练用例(样本)中以有放回抽样的方式,取样N次,形成一个训练集(即bootstrap取样),并用未抽到的用例(样本)作预测,评估其误差。
接上篇机器学习入门____4.基于sklearn的决策树算法使用
#从集成算法中导入随机森林所在包
from sklearn.ensemble import RandomForestClassifier
函数原型:
class sklearn.ensemble.RandomForestClassifier(n_estimators=10, criterion=’gini’,
max_depth=None, bootstrap=True, random_state=None)
n_estimators:森林中的树木个数
criterion:分割特征的测量方法,默认选择’gini’
max_depth:树的默认深度,默认不给定
bootstrap:是否是有放回的抽样,默认为是
random_state:随机数种子,默认为无。一旦给定表示每次随机出来的结果都相同(同一次随机下来)
代码实现:
# 设置并行数和cpu核数一致
rf = RandomForestClassifier(n_jobs=-1)
# 设置超参数网格搜索
param = {'n_estimators': [120, 200, 300, 500, 800, 1200], "max_depth": [5, 8, 15, 25, 30]}
# 传入随机森林模型,要进行网格搜索的参数,以及折数
gc = GridSearchCV(rf, param_grid=param, cv=2)
# 进行训练
gc.fit(x_train, y_train)
# 得出结果
print("准确率:", {gc.score(x_test, y_test)})
print("最佳参数模型:", gc.best_params_)