繁簡切換您正在訪問的是FX168財經網,本網站所提供的內容及信息均遵守中華人民共和國香港特別行政區當地法律法規。

FX168财经网>人物频道>帖子

《机器学习》从零开始学(15) 集成方法之Baggin

作者/jedfsjfjsdf 2019-06-27 00:00 0 来源: FX168财经网人物频道

《机器学习》从零开始学(15) 集成方法之Bagging算法¶

参考教材:Python机器学习预测分析核心算法-[美]M·鲍尔-沙嬴&李鹏(译)-人民邮电出版社-2017

Machine Learning in Python:Essential Techniques for Predictive Analysis(Python机器学习:预测分析核心算法), Michael Bowles, Wiley, 2015.pdf 

注意:书中的代码很繁杂,我用更精炼的代码重写之。

所谓“从零开始”面向的对象其实仅指我本人。也就是我的学习笔记。

2) 自举集成:Bagging算法¶

Bagging算法是如何工作的¶

自举集成(bootstrap aggregation, 简写Bagging)核心: 首先,从训练集中通过有放回均匀随机抽样获得N组Bootstrap样本集。 然后,每组Bootstrap样本集按预先选定的某个基学习器构建模型,一共构建N个模型。 最后,通过投票取平均来整合这N个模型的预测值,进而获得整个集成模型的预测值。

有放回均匀随机抽样意味着:1) Bootstrap样本集可能有重复样本; 2) 这N组Bootstrap样本集的并集可能会遗漏掉原始数据。 然而,这正是我们所期望的,这为集成模型中各模型带来多样性。

下面的例子,选择二元决策树作为基学习器, 选择取平均来整合各模型的预测结果。

import pandas as pdimport numpy as npimport matplotlib.pyplot as pltfrom sklearn import treefrom sklearn.tree import DecisionTreeRegressor'''    产生玩具数据集'''m = 1001# 产生一组含标准正态随机扰动数据集x = 1.0*np.arange(m)/(m-1) - 0.5np.random.seed(1)y = x + np.random.normal(scale=0.1,size=m)'''    采样30%的数据作为测试集'''mSample = int(m * 0.30); idx = range(m); np.random.shuffle(idx)idxTest = idx[:mSample]; idxTest.sort()idxTrain = list(set(idx) - set(idxTest)); idxTrain.sort()xTrain = x[idxTrain].reshape((m-mSample,1)); yTrain = y[idxTrain]xTest = x[idxTest].reshape((mSample,1)); yTest = y[idxTest]'''    在训练集上生成一系列模型'''# 生成的最大模型数numTreesMax = 20# 决策树深度treeDepth = 1# 收集模型及其对应的预测modelList = []predList = []# 用于随机提升(bagging)的样本数 nBagSamples = int(len(xTrain) * 0.5)for iTrees in range(numTreesMax):# 有放回均匀取样idxBag = np.random.choice(m-mSample, nBagSamples)xTrainBag = xTrain[idxBag,:]yTrainBag = yTrain[idxBag]# 训练数据采样集进行二元决策树训练modelList.append(DecisionTreeRegressor(max_depth=treeDepth))modelList[-1].fit(xTrainBag, yTrainBag)# 预测并收集预测值latestPrediction = modelList[-1].predict(xTest)predList.append(list(latestPrediction))'''    给定头n个模型 n=1,...,numTreesMax    依次计算n个模型的平均预测值     依次计算n个模型的均方误差 '''allPredictions = 1.0 * np.cumsum(predList,axis=0) / np.arange(1,numTreesMax+1).reshape(numTreesMax,1)mse = ((yTest - allPredictions)**2).sum(axis=1) / len(yTest)'''    绘制或输出计算结果 '''# 绘制均方误差和模型数之间的关系nModels = [i + 1 for i in range(numTreesMax)]plt.plot(nModels,mse)plt.axis('tight')plt.xlabel(u'所用模型数目')plt.ylabel(u'均方误差')plt.ylim((0.0, max(mse)))plt.show()# 绘制原始数据及3组特定模型产生的预测值plotList = [0, 9, 19]for iPlot in plotList:plt.plot(xTest, allPredictions[iPlot])plt.plot(xTest, yTest, linestyle="")plt.axis('tight')plt.xlabel(u'测试输入x值')plt.ylabel(u'预测值')plt.show()print(u'最小均方误差')print(min(mse))
最小均方误差
0.024820246185

上述代码的二元决策树设置的默认深度是1, 那么1个模型(决策树)生成一个“单一台阶”预测。 10个模型和20个模型则在“单一台阶”附近生成更精细的“台阶”预测。

增加模型数,可以减少模型间的方差,但对深度为1的决策树的偏差是平均不掉的。

而要改善决策树的偏差,需要深度更深的决策树。 通过修改代码中变量treeDepth,可以重新绘制查看深度更深的决策树对预测曲线光滑度的影响。

如何解决多变量问题¶

前面的玩具数据集市单变量问题,下面将以红酒口感数据集来解决多变量问题。

由于我们是调用sklearn.tree.DecisionTreeRegressor进行决策树训练的,所以从代码角度和前面的代码没啥区别。

我们重点关注,下面代码的运行结果(包括调整参数变量treeDepth后的结果)。

1) 基于深度为1的决策树的集成方法,相对单1层决策树而言,均方误差几乎没有啥改变。

2)对多变量问题而言,决策树若要达到一定的性能要求,需要一定的决策树深度。

# 获取红酒数据集target_url = "https://archive.ics.uci.edu/ml/machine-learning-databases/wine-quality/winequality-red.csv"df = pd.read_csv(target_url, header=0, sep=";")df.columns = ['非挥发性酸','挥发性酸','柠檬酸', '残留糖分', '氯化物', '游离二氧化*','总二氧化*', '密度', 
              'PH值', '亚硝酸盐', '酒精含量', '品质']xData = df.values[:,:-1]; yData = df.values[:,-1] m, n = xData.shape'''    采样30%的数据作为测试集'''mSample = int(m * 0.30);np.random.seed(1)idx = range(m);  np.random.shuffle(idx)idxTest = idx[:mSample]; idxTest.sort()idxTrain = list(set(idx) - set(idxTest)); idxTrain.sort()xTrain = xData[idxTrain,:]; yTrain = yData[idxTrain]xTest = xData[idxTest,:]; yTest = yData[idxTest]'''    在训练集上生成一系列模型'''# 生成的最大模型数numTreesMax = 20# 决策树深度treeDepth = 1# 收集模型及其对应的预测modelList = []predList = []# 用于随机提升(bagging)的样本数 nBagSamples = int(len(xTrain) * 0.5)for iTrees in range(numTreesMax):# 有放回均匀取样idxBag = np.random.choice(m-mSample, nBagSamples)xTrainBag = xTrain[idxBag,:]yTrainBag = yTrain[idxBag]# 训练数据采样集进行二元决策树训练modelList.append(DecisionTreeRegressor(max_depth=treeDepth))modelList[-1].fit(xTrainBag, yTrainBag)# 预测并收集预测值latestPrediction = modelList[-1].predict(xTest)predList.append(list(latestPrediction))'''    给定头n个模型 n=1,...,numTreesMax    依次计算n个模型的平均预测值     依次计算n个模型的均方误差 '''allPredictions = 1.0 * np.cumsum(predList,axis=0) / np.arange(1,numTreesMax+1).reshape(numTreesMax,1)mse = ((yTest - allPredictions)**2).sum(axis=1) / len(yTest)'''    绘制或输出计算结果 '''# 绘制均方误差和模型数之间的关系nModels = [i + 1 for i in range(numTreesMax)]plt.plot(nModels,mse)plt.axis('tight')plt.xlabel(u'所用模型数目')plt.ylabel(u'均方误差')plt.ylim((0.0, max(mse)))plt.show()print(u'最小均方误差')print(min(mse))
最小均方误差
0.483658658747
分享到:
举报财经168客户端下载

全部回复

0/140

投稿 您想发表你的观点和看法?

更多人气分析师

  • 张亦巧

    人气2192文章4145粉丝45

    暂无个人简介信息

  • 王启蒙现货黄金

    人气296文章3215粉丝8

    本人做分析师以来,并专注于贵金属投资市场,尤其是在现货黄金...

  • 指导老师

    人气1864文章4423粉丝52

    暂无个人简介信息

  • 李冉晴

    人气2320文章3821粉丝34

    李冉晴,专业现贷实盘分析师。

  • 梁孟梵

    人气2176文章3177粉丝39

    qq:2294906466 了解群指导添加微信mfmacd

  • 张迎妤

    人气1896文章3305粉丝34

    个人专注于行情技术分析,消息面解读剖析,给予您第一时间方向...

  • 金泰铬J

    人气2328文章3925粉丝51

    投资问答解咨询金泰铬V/信tgtg67即可获取每日的实时资讯、行情...

  • 金算盘

    人气2696文章7761粉丝125

    高级分析师,混过名校,厮杀于股市和期货、证券市场多年,专注...

  • 金帝财神

    人气4760文章8329粉丝119

    本文由资深分析师金帝财神微信:934295330,指导黄金,白银,...

FX168财经

FX168财经学院

FX168财经

FX168北美