就是开了空间秒赞网空间。知道会封号。但很多朋友都在里面。又无法克隆过来。所以怎样才能解封我的账号

来源:互联网 更新时间: 17:48:26 责任编辑:鲁晓倩字体:
Classification And Regression Tree(CART)是一种很重要的机器学习算法,既可以用于创建分类树(Classification Tree),也可以用于创建回归树(Regression Tree),本文介绍了CART用于离散标签分类决策和连续特征回归时的原理。决策树创建过程分析了信息混乱度度量Gini指数、连续和离散特征的特殊处理、连续和离散特征共存时函数的特殊处理和后剪枝;用于回归时则介绍了回归树和模型树的原理、适用场景和创建过程。个人认为,回归树和模型树可以被看做“群落分类”算法,群落内标签值连续分布,群落间有分界。
(一)认识CART算法
Classification And Regression Tree(CART)是决策树的一种,并且是非常重要的决策树,属于Top Ten Machine Learning Algorithm。顾名思义,CART算法既可以用于创建分类树(Classification Tree),也可以用于创建回归树(Regression Tree)、模型树(Model Tree),两者在建树的过程稍有差异。前文“”详细介绍了分类决策树原理以及ID3、C4.5算法,本文在该文的基础上详述CART算法在决策树分类以及树回归中的应用。
创建分类树递归过程中,CART每次都选择当前数据集中具有最小Gini信息增益的特征作为结点划分决策树。ID3算法和C4.5算法虽然在对训练样本集的学习中可以尽可能多地挖掘信息,但其生成的决策树分支、规模较大,CART算法的二分法可以简化决策树的规模,提高生成决策树的效率。对于连续特征,CART也是采取和C4.5同样的方法处理。为了避免过拟合(Overfitting),CART决策树需要剪枝。预测过程当然也就十分简单,根据产生的决策树模型,延伸匹配特征值到最后的叶子节点即得到预测的类别。
创建回归树时,观察值取值是连续的、没有分类标签,只有根据观察数据得出的值来创建一个预测的规则。在这种情况下,Classification Tree的最优划分规则就无能为力,CART则使用最小剩余方差(Squared Residuals Minimization)来决定Regression Tree的最优划分,该划分准则是期望划分之后的子树误差方差最小。创建模型树,每个叶子节点则是一个机器学习模型,如线性回归模型。
CART算法的重要基础包含以下三个方面:
(1)二分(Binary Split):在每次判断过程中,都是对观察变量进行二分。
CART算法采用一种二分递归分割的技术,算法总是将当前样本集分割为两个子样本集,使得生成的决策树的每个非叶结点都只有两个分枝。因此CART算法生成的决策树是结构简洁的二叉树。因此CART算法适用于样本特征的取值为是或非的场景,对于连续特征的处理则与C4.5算法相似。
(2)单变量分割(Split Based on One Variable):每次最优划分都是针对单个变量。
(3)剪枝策略:CART算法的关键点,也是整个Tree-Based算法的关键步骤。
剪枝过程特别重要,所以在最优决策树生成过程中占有重要地位。有研究表明,剪枝过程的重要性要比树生成过程更为重要,对于不同的划分标准生成的最大树(Maximum Tree),在剪枝之后都能够保留最重要的属性划分,差别不大。反而是剪枝方法对于最优树的生成更为关键。
(二)CART分类决策树
1,CART的信息论基础和算法过程
相关文章:
上一篇文章:下一篇文章:
最新添加资讯
24小时热门资讯
Copyright ©
All Rights Reserved. 学路网 版权所有
京ICP备号-1 京公网安备02号作者:龙心尘 &&寒小阳
1. 剧情一:挑螃蟹的秘密
李雷与韩梅梅的关系发展得不错,趁国庆休假一起来天津玩。今天,李雷十分神秘地请韩梅梅去一家餐馆吃螃蟹。韩梅梅大失所望,这个餐馆很不起眼,感觉就像路边的老食堂。菜单都用粉笔写在黑板上,一点都不高档。一看价格,满黄螃蟹120块钱一只!这也太贵了。
李雷看到了韩梅梅的神情,笑着解释道:“这家店老板有一个绝活——会看螃蟹。他能保证120块的螃蟹就是满黄。如果拆开来不是,这个螃蟹就不要钱,再换一个。靠着老板的绝活,这家店已经是几十年的老店了,在当地非常有名气。郭德纲、赵丽蓉这些天津社会名流都来这家店吃过螃蟹。”
韩梅梅将信将疑。拆开螃蟹,饱满的蟹黄喷薄欲出。韩梅梅边吃边惊叹:“从没有吃个这么好吃的螃蟹!”
李雷接着说:“老板的绝活密不外传,几十年来都自己上货。虽说是一个大老板,一年到头满身海鲜味。而且他也不开分店。”
韩梅梅说:“那是,这么高明的绝活只有他自己知道才能挣钱啊。”这时,韩梅梅拂面而笑,突然想考一考自己的相亲对象,说:“李大码农,你不是做机器学习的吗?如果要你去用机器学习挑满黄的螃蟹,你怎么做?”
2. 初步划定特征的范围,获取特征
李雷早就想过这个问题了。长期的职业素养让他对任何事情都想用机器学习的方法去鼓捣。李雷的基本思路是这样的,我们尽可能观察螃蟹更多的特征,从中找出与“螃蟹满黄”最相关的特征来,帮助我们去判断。当然特征有非常多,我们可以先头脑风暴一下:
一些直观的特征:包括蟹壳的颜色和光泽度、钳子的大小、肚脐的形状、螃蟹腿的粗细和长度、眼睛的大小和颜色光泽、螃蟹的品种、重量、体积、腰围等等……
一些需要在互动过程中观察到的特征:螃蟹钳子的力量,对外界刺激的反应,用筷子触碰螃蟹眼睛后的反应,螃蟹行动的速度……
还有一些外部环境的特征: 收获螃蟹的季节,培养螃蟹的水域……
韩梅梅插话到:“这么多特征我头都大了,你还有完没完?”
其实,如果真要穷举出所有的特征可能永远也举不完。但是我们目的很明确——判断螃蟹是否是满黄。所以我们只关心跟这个问题(“标签”)相关的特征,它们只占所有特征中很小一部分。怕就怕一些糊涂的需求方连目的都不明确就要求一通乱搞,即便出来了一堆结果,也不知道有什么用。
头脑风暴完之后,很重要的一点就是找到对这个问题有长期经验的人,虚心向他们学习。人脑其实是一个很好的特征筛选器,这些经验可以给我们非常多的指导和启发,极大地减少我们试错的工作量。比如我们可以直接去找海鲜市场问螃蟹贩子,去田间地头找螃蟹养殖户,去海鲜饭店去问有经验的采购员和厨师……他们的最一线的经验是特征工程中的宝贵财富。
但这里需要考虑将经验转换成可量化的指标,才能便于机器学习。比如人们可能会说螃蟹很“活跃”、很“精神”,或者很“慵懒”。这些特征需要转换成一些可量化指标去衡量,具体怎么转换也有很大学问。
接下来要考虑的问题是对这些特征的可用性进行简单的评估。比如:
特征获取、描述难度
数据的规模
特征的准确率
特征的覆盖率
我们通过明确目标,头脑风暴,咨询专家,特征量化,可用性评估等流程,就基本划定了特征范围。
3. 剧情二:“特征预处理”的门道
李雷说完,便拿出自己的平板,给韩梅梅看自己某个项目中搜集的初始特征。这些特征被放在一张巨大的表里。
韩梅梅看着这些密密麻麻的数字,心想:看李雷说得头头是道,但还是没告诉我怎么挑,不能让他轻易绕过去。
于是她说:“我看你这些特征数据有大有小,有些就是几万上下浮动,有些仅仅是小数点后好几位的微小变化,有些就是在0或1这两种可能中变化,有些连值都没有。你这些数据能用吗?”
李雷说:“不能,要转换成标准件。”
韩梅梅:“标准件?”
4. “特征标准件”
如果把机器学习过程当做一个加工厂的话,那输入的数据(特征、标签)就是原材料,输出的模型和判断结果就是产品。并不是胡乱扔进去任何原材料都能加工出合格产品的。原材料需要一个“预处理”过程才能方便地被算法处理。这些预处理后的数据,李雷起了个不够规范的名字,叫做“特征标准件”。
以二分类问题为例,不同的算法对“特征标准件”的要求是不同的。比如逻辑回归和神经网络,比较喜欢归一化之后在[-1,1]区间内浮动的特征。而贝叶斯方法,喜欢因子化之后的{0,1}分布的二元特征,每个特征只有“是”和“不是”两种可能的状态。
5. 连续特征与非连续特征
特征可以分为两类:“连续特征”和“非连续特征”。
“身高”、“体重”、“成绩”、“腰围”、“长度”、“宽度”、“体积”、“速度”等等,都是连续特征。连续特征能够比较方便地进行归一化。归一化的统一公式如下:
x * =x-μS
μ 为所有样本数据的均值,x-μ 的步骤叫做去均值化
当S=x max -x min 时,经过处理的数据在区间[-1,1]之间。
当S=σ(所有样本的标准差) 时,经过处理的数据符合标准正态分布,即均值为0,标准差为1
另一方面:“是否高富帅”、“是否白富美”、“螃蟹的品种”、“螃蟹所在的水域”、“收获螃蟹的季节”等等,都是非连续特征。非连续特征能够比较方便地进行因子化,或者它本身就是二元特征。方法如下:
特征“收获螃蟹的季节”:{春,夏,秋,冬} 因子化后的结果为:
特征“是否春”:{是,否}
特征“是否夏”:{是,否}
特征“是否秋”:{是,否}
特征“是否冬”:{是,否}
6. 两类特征的相互转化
连续特征可以当非连续特征来用,非连续特征可以当连续特征来用。
连续特征可以离散化非连续特征。比如“年龄”作为一个连续特征,假设它的取值范围是[0,100]。我们可以中间切一刀,比如选择60(岁)。大于等于60岁的就叫做“老年”,小于60岁的就是“非老年”,这样就转化成了一个二元特征了。怎么选择离散的分离边界也很有学问。
如果我们中间切两刀甚至更多刀,比如18(岁)和60(岁)。大于等于60岁的就叫做“老年”,18岁到60岁之间的就叫做“中青年”,小于18岁就叫做“未成年”。然后再把这3类因子化成3个二分类就够了:“是否老年”、“是否中青年”和“是否未成年”。
非连续特征因子化成二元特征{0,1}后可以直接当做[0,1]之间的连续特征来用。我们之前文章《机器学习系列(3)_逻辑回归应用之Kaggle泰坦尼克之灾》就是这么使用的。
7. 去除特征之间的共线性
我们在对离散特征因子化过程中细分到二元特征为止即可。那对于二元特征本身能否因子化成两个特征?比如以下例子:
特征“螃蟹的性别”:{公,母} ,可否转换为:
特征“是否公螃蟹”:{是,否}
特征“是否母螃蟹”:{是,否}
这是不行的,因为这两个特征的信息完全一样,也叫做共线性。计算这两个特征之间的条件熵:
H(“是否公螃蟹”|“是否母螃蟹”)=0 也可以用计算条件熵的方法去衡量两类离散特征的差异性,方便去除共线性关系的特征。
连续特征也有着共线性的情况,比如同一个品种的螃蟹腿的“长度”和“粗细”是共线性关系。也就是说,如果我们知道螃蟹腿的长度是x 厘米,那么螃蟹腿的直径就是kx 厘米,k 是一个稳定的常数。因此我们只需要螃蟹腿的“长度”这一个特征就够了。那么连续特征的共线性如何去除?
可以计算两个变量(x,y) 的相关系数:
r xy =cov(x,y)σ x σ y =cov(x,y)cov(x,x)×cov(y,y) √
r xy 的取值范围是[-1,1],如果是0则统计独立,如果接近1则强相关。
可以计算这些数据的协方差矩阵,进而求出相关系数矩阵。就可以比较任意两个特征了。
既然协方差矩阵都求了,那就干脆用主成分分析(PCA)吧,这样更省事。得到主成分,线性相关的那些量就直接被舍弃了。我们在前文《深度学习与计算机视觉系列(7)_神经网络数据预处理,正则化与损失函数》 对PCA有相关论述。
感兴趣的同学可以试试把上述离散二元特征当做连续变量使用,构造几个数据,计算其相关系数并进行主成分分析。发现其相关系数就是-1,主成分分析后自动就变成一个主成分了。可见PCA对于连续特征与非连续特征都是去除共线性的通用方法。
8. 缺失值的处理
这个问题现在才讲,但实际过程中应该在前期去处理。掌握以下三点就够了:
如果某个特征的缺失值比较多:可能就直接舍弃。
如果缺失值不是很多,而且是连续特征:可以考虑用回归方法去拟合,或者直接用众数、中位数、平均数等具体的值去替代即可。
如果缺失值不是很多,而且是非连续特征:可以尝试把缺失值当做一个新的类目去处理,可能也揭示了一定的客观现实。
9. 离群点的分析
对于连续特征,最好看看其在样本中的分布。如果某些值偏离了主要聚集区域,可能需要单独抽出来分析,里面可能包含了更多的信息,可以这样画图方便观察:
10. 特征预处理小结
特征的预处理步骤比较多,相互之间的关系比较复杂。我们画了一张图以揭示它们之间的关系:
11. 剧情三:李雷另辟蹊径挑螃蟹
韩梅梅长叹一口气:“终于听你叨逼叨逼说完了。”
李雷说:“没办法啊,这块工作其实挺多的。我还要好多没说完……” “你打住”,韩梅梅赶紧说,“我算服了你了。但是李大码农,你还没有跟我说你怎么靠这些特征挑螃蟹呢。”
李雷说:“不急,用逻辑回归……”韩梅梅说:“不要用逻辑回归,我已经从赵媒婆那知道了。你换个方法,用非连续特征来做。”韩梅梅存心想刁难她的相亲对象。
李雷说:“那可以用贝叶斯。”
12. 用贝叶斯方法挑螃蟹
我们的标签用Y=“是满黄” 来表示,相应的Y ? ? ? =“不是满黄” 。Xi表示所有离散化的二元特征,如X 1 =“是河蟹”,X 2 =“是秋季收货”,X 3 =”钳子的力量大”…… 。于是在已知这些特征的情况下,该螃蟹“是满黄”的概率如下:
P(Y|X 1 ,X 2 ,X 3 …)=P(X 1 ,X 2 ,X 3 …|Y)×P(Y)P(X 1 ,X 2 ,X 3 …) 其实,可以直接判断P(Y|X 1 ,X 2 ,X 3 …) 是否大于1/2即可。因为P(X 1 ,X 2 ,X 3 …) 这一项算起来比较麻烦,我们用以下方法直接把它约掉。
先求出螃蟹“不是满黄”的概率:
P(Y ? ? ? |X 1 ,X 2 ,X 3 …)=P(X 1 ,X 2 ,X 3 …|Y ? )×P(Y ? )P(X 1 ,X 2 ,X 3 …) 再两式相除,得到:
P(Y|X 1 ,X 2 ,X 3 …)P(Y ? |X 1 ,X 2 ,X 3 …) =P(X 1 ,X 2 ,X 3 …|Y)×P(Y)P(X 1 ,X 2 ,X 3 …|Y ? )×P(Y ? ) 这样就约去了P(X1,X2,X3…)。只需要判断P(Y|X 1 ,X 2 ,X 3 …)P(Y ? |X 1 ,X 2 ,X 3 …) 是否大于1即可。但是,工程上用除法不太方便,两边同时取对数log,得到:
logP(Y|X 1 ,X 2 ,X 3 …)P(Y ? |X 1 ,X 2 ,X 3 …) =logP(X 1 ,X 2 ,X 3 …|Y)P(X 1 ,X 2 ,X 3 …|Y ? ) +logP(Y)P(Y ? ) 左边是螃蟹“是满黄”的逻辑发生比,只需要判断其是否大于0即可。
到目前为止,以上都是等价变换。
接下来我们引入贝叶斯方法中常用的条件独立假设:
P(X 1 ,X 2 ,X 3 …|Y)=P(X 1 |Y)×P(X 2 |Y)×P(X 3 |Y)…
P(X 1 ,X 2 ,X 3 …|Y ? ? ? )=P(X 1 |Y ? ? ? )×P(X 2 |Y ? ? ? )×P(X 3 |Y ? ? ? )… 将它们带入上式,就变成了:
logP(Y|X 1 ,X 2 ,X 3 …)P(Y ? |X 1 ,X 2 ,X 3 …) =logP(X 1 |Y)P(X 1 |Y ? ) +logP(X 2 |Y)P(X 2 |Y ? ) +logP(X 3 |Y)P(X 3 |Y ? ) +…+logP(Y)P(Y ? ) 于是我们得到了一个简单的求和式,只需要判断等式右边求和的结果是否大于0即可。而最关键的就是右边每一项都非常好求!假如训练集中所有的满黄螃蟹收集在一起,统计每一个特征出现的次数,除以满黄螃蟹的总数,就是其相应的条件(后验)概率了。再统计该特征在非满黄螃蟹集合中的条件(后验)概率,二者相除再取对数即可。
13. 用贝叶斯方法进行特征有效性分析
等式右边作为一个求和式,其中每个求和项logP(X i |Y)P(X i |Y ? ) 的绝对值越大,其对结果的影响越强烈,相对应的特征就是显著特征。而绝对值比较小的特征就是非显著特征,剔除掉也不会很明显地影响结果。这就完成了一个特征筛选的过程。
我们再分析一下各个求和项的结构,里面的概率部分是后验概率,是特征相对于标签的后验概率。这个后验概率与我们上一篇文章《从白富美相亲看特征预处理与选择(上)》中的后验概率方向相反,不要搞混淆了。
14. 贝叶斯与逻辑回归之间的关系
我们继续看看这个求和项,是不是很像逻辑回归中的求和项?我们如果拿二元特征当做连续变量采用逻辑回归方法。其判别式如下:
z=w 1 x 1 +w 2 x 2 +w 3 x 3 +…+b;其中x i ∈{0,1} 二者的表达式惊人地相似!莫非logP(X i |Y)P(X i |Y ? ) =w i ,二者一模一样?
感兴趣的同学可以自己举个例子试一下,发现还是有区别的,二者求出来的权重不一样。产生这样差别的原因是什么呢?
想必大家都猜到了。就是贝叶斯方法引入的两个条件独立假设。正因为这两个条件独立假设,贝叶斯方法直接跳过了逻辑回归中反复迭代用梯度下降法才能求出的各个权重。
因此贝叶斯方法与逻辑回归的区别就是贝叶斯方法引入了一个更强的附加假设,而且可以直接通过统计结果求权重,而不必用梯度下降法。
所以有些情况下贝叶斯方法求出来的结果不好,就可以考虑考虑是不是条件独立假设的原因。
因此,可以说“在某种假定下,可以证明:与朴素贝叶斯分类方法一样,许多神经网络和曲线拟合算法输出最大的后验假定。”——韩家炜:《数据挖掘:概念与技术(第三版)》
15. 剧情四:李雷露馅儿了
韩梅梅听完,十分感慨地说:“难怪机器学习能挑出正确的结果,难怪赵媒婆用机器学习方法从这么多人中能把你挑出里来。你还是有两下子嘛。”
“废话,她是我干妈”,李雷志得意满,不小心说漏嘴。 韩梅梅:“什么?!”
李雷后悔不已,尴尬地陪着笑脸说道:“梅梅,我错了,我不该瞒你这么久。”到了这个地步,李雷只能和盘托出了。
16. 数据VS算法
其实李雷早就知道韩妈妈要挑选相亲名单,如果按她的标准,李雷根本没法进入名单中。而李雷也猜想她会去找赵媒婆。他就早早地联系赵媒婆,跟她推销他的机器学习方法。赵媒婆终于被李雷忽悠动心了。李雷就帮她开发那个相亲算法。但其实赵媒婆的样本数量不够,特征数量却非常多,肯定会过拟合。李雷就跟她说他会多找一些相亲的数据。李雷能从哪里找啊,只能发动周围的同学,让他们找他们观察到的情侣案例。而在这些群体中,恰好中学、大学是同学的情侣比率非常高,而且很多男方是码农。而李雷刚好符合这个条件,李雷的评分就非常高了。
因为样本选择本来就代表性不足,没能覆盖更多的青年群体,所以还是过拟合,只是偏向了李雷这边的概率而已。
可见,做机器学习虽然看起来比较炫酷的是算法,但真正关键的是数据。数据决定了你结果的上限,而算法只是尽可能逼近这个上限。而这点李雷并没有告诉赵媒婆。
对样本情况的分析要在特征优化过程中尤其注意。整个流程图如下:
17. 特征选择的局限性
而且,李雷并不觉得感情这样复杂的东西能够用赵媒婆那些量化的指标衡量好的。房子、车子、学历、文凭这些并不能衡量两个人之间的感情。一些非常重要的特征是难以量化的,比如两个人的“三观”、两个人对待感情的态度、两个人相互相处的独一无二的经历、两个人刻骨铭心的情感体验、那种两个人相信能够一辈子都在一起的笃定的感觉……这些至关重要的特征极其复杂,却非常难以量化。所以对于这类问题,机器学习的能力还是很有限的。
18. 剧情五:尾声
韩梅梅听完李雷,既生气,又好笑,还有一点点小感动:这小子为了感情还是蛮拼的。
一段沉默之后,韩梅梅笑着对李雷说:“好了好了,我不怪你了。”李雷长舒一口气。
韩梅梅继续说:“问个挑螃蟹的问题。你刚才选了这么多特征。为什么不考虑用B超直接照一下,看看里面什么东西不就成了吗?”
李雷一听,犹如当头一棒,整个脑子都被草泥马占满了:“我去,这么简单的方法我怎么想不到?!”
韩梅梅这时已经笑得肚子痛了,根本说不上话。
李雷吐槽到:“梅梅,你太厉害了。我觉得机器永远也学不到的两样东西就是人类的情感和脑洞啊!”
其实博主也没有丧心病狂到抓只螃蟹去照B超,只是自己被这个想法逗乐了,大家开心就好哈。O(∩_∩)O~~
如果真要死磕,据说B超的穿透力比较弱,对骨骼、空气等很难达到深部,因此难以成像。但是通过声波的回声来判断,也是一个思路。就像有些人可以通过拍打西瓜听声音来判断它甜不甜的道理一样。
如果不用机械波而用电磁波,比如X射线,估计哪怕能看到螃蟹满黄顾客也不会吃了。顾客也会担心放射残留的。CT应该好些,但是贵呀。一套设备下来,螃蟹估计也不止120块钱了吧。没玩过CT,不知道成本多少……总之还是要考虑获取特征的成本的。
via:blog.csdn.net
转载请注明来自36大数据(): &
除非特别注明,本站所有文章均不代表本站观点。报道中出现的商标属于其合法持有人。请遵守理性,宽容,换位思考的原则。离散特征和连续特征同时存在,同时解决回归和分类的问题 - 简书
离散特征和连续特征同时存在,同时解决回归和分类的问题
有些同学对于mxnet的自定义Iter不是很熟悉,对多输出也不熟悉,因此我用一个比较复杂的例子来说明这个问题:
1. 特征中有连续特征和离散特征
2. 同时要解决回归问题和分类问题
本着End-to-End的精神,我们不做特征工程,当然也就不能做离散化。于是,连续特征可以直接作为输入,而离散特征则通过Embeding的方式输入。如果要同时解决回归和分类问题,我们就需要两个Loss层。
我们虚构一个简单的二手车价格预估的问题。我们假设一辆车的价格只取决于两个因素,一个是车的品牌,一个是车的里程。不同品牌的车有不同的出厂价格,而车的行驶里程越长,价格就会越低。因此我们可以基于这个假设,用如下的代码构造一个数据集:
#我们虚构了201个不同的品牌,并给每个品牌设置一个出场价格
series = [1 + i for i in range(100)] + [101 - i for i in range(100)]
for i in range(10000):
k = random.randint(0, 199)
#越贵的品牌,我们认为在数据集里出现的次数越少,因为它卖的少
count = 1000 / series[k]
for j in range(count):
dis = random.random() * 10
#实际的价格是品牌的出场价除以里程数的开方
price = series[k] / math.sqrt(1.0 + dis)
print str(price) + '\t' + str(dis) + '\t' + str(k)
这里,车的品牌是一个离散特征,而里程是个连续的特征。问题的目标是,给定品牌和里程,同时预测车的价格(回归问题),以及车的价格区间(分类问题)。我们用如下的网络来解决这个问题:
# dis 是输入的里程
dis = mx.symbol.Variable('dis')
# price 是要预测的目标价格
price = mx.symbol.Variable('price')
# price_interval 是要预测的价格区间
price_interval = mx.symbol.Variable('price_interval')
# series 是输入的车的品牌
series = mx.symbol.Variable('series')
dis = mx.symbol.Flatten(data = dis, name = "dis_flatten")
series = mx.symbol.Embedding(data = series, input_dim = 200,
output_dim = 100, name = "series_embed")
series = mx.symbol.Flatten(series, name = "series_flatten")
net = mx.symbol.Concat(*[dis, series], dim = 1, name = "concat")
net = mx.symbol.FullyConnected(data = net, num_hidden = 100, name = "fc1")
net = mx.symbol.Activation(data = net, act_type="relu")
net = mx.symbol.FullyConnected(data = net, num_hidden = 100, name = "fc2")
net = mx.symbol.Activation(data = net, act_type="relu")
net = mx.symbol.FullyConnected(data = net, num_hidden = 1, name = "fc3")
# 这里最后为什么用relu呢?是因为价格一定是个正数
net = mx.symbol.Activation(data = net, act_type="relu")
net = mx.symbol.LinearRegressionOutput(data = net, label = price, name = "lro")
net2 = mx.symbol.Concat(*[dis, series], dim = 1, name = "concat")
net2 = mx.symbol.FullyConnected(data = net2, num_hidden = 100, name = "fc21")
net2 = mx.symbol.Activation(data = net2, act_type="relu")
net2 = mx.symbol.FullyConnected(data = net2, num_hidden = 100, name = "fc22")
net2 = mx.symbol.Activation(data = net2, act_type="relu")
net2 = mx.symbol.FullyConnected(data = net2, num_hidden = 8, name = "fc23")
net2 = mx.symbol.Activation(data = net2, act_type="relu")
net2 = mx.symbol.SoftmaxOutput(data = net2, label = price_interval, name="sf")
# 这里net预测price,net2预测price_interval, 最后group在一起返回
return mx.symbol.Group([net, net2])
这个例子里,我们需要同时提供dis, series, price, price_interval 四个变量。常见的Iter似乎不支持这个功能,因此可以自己实现一个:
class PriceIter(mx.io.DataIter):
def __init__(self, fname, batch_size):
super(PriceIter, self).__init__()
self.batch_size = batch_size
self.dis = []
self.series = []
self.price = []
# 这里预先从文件读入所有的数据存下来
for line in file(fname):
price, d, s = line.strip().split("\t")
self.price.append(float(price))
self.series.append(np.array([int(s)], dtype = np.int))
self.dis.append(np.array([float(d) / 10.0]))
# 输入数据的shape
self.provide_data = [('dis', (batch_size, 1)),
('series', (batch_size, 1))]
# 输出数据的shape
self.provide_label = [('price', (batch_size, )),
('price_interval', (batch_size,))]
def __iter__(self):
count = len(self.price)
for i in range(count / self.batch_size):
bseries = []
blabel = []
blabel_interval = []
for j in range(self.batch_size):
k = i * self.batch_size + j
bdis.append(self.dis[k])
bseries.append(self.series[k])
blabel.append(self.price[k])
blabel_interval.append(interval(self.price[k]))
data_all = [mx.nd.array(bdis),
mx.nd.array(bseries)]
label_all = [mx.nd.array(blabel), mx.nd.array(blabel_interval)]
data_names = ['dis', 'series']
label_names = ['price', 'price_interval']
data_batch = Batch(data_names, data_all, label_names, label_all)
yield data_batch
def reset(self):
全部的例子见

我要回帖

更多关于 秒赞空间 的文章

 

随机推荐