加载预训练词向量模型-python
本文主要是使用python加载预训练的词向量模型,这些模型都是使用大规模的预料训练得到,如word2vec,glove和fasttext。使用预训练的模型可以提高我们的准确性。
简单看看三者之间的区别
Word2Vec
word2vec的主要思想是在根据每个单词的上下文训练一个模型,因此,类似的单词也会有类似的数字表示。
就像一个前馈神经网络(NN),假设你有一组独立的变量和一个你想要预测的目标变量,你首先把你的句子变成单词(tokenize),并根据窗口的大小创建多个词组。所以其中一个组合可以是一对单词,比如(“cat”,“purr”),其中"cat"是独立变量(X),而“purr”是我们想要预测的目标因变量(Y)。
我们通过一个由随机权值初始化的embedding层将“cat”输入到NN中,并将其传递到softmax层,最终目的是预测“purr”。优化方法如SGD将损失函数最小化"(target word | context words)" ,该方法试图将给定上下文单词的目标词的预测损失最小化。如果我们使用足够的epoch的训练,那么em ...
Instacart Market Basket Analysis(2nd place)
这个比赛是要根据顾客的历史购买记录,预测 Instacart 的消费者将再次购买哪种商品,这样可以在顾客需要这个商品的时候,货源是充足的。这种侧重于理解时间行为模式的问题使得这个问题与普通的项目推荐有所不同,在普通项目推荐中,我们通常假设用户的需求和偏好在短时间内相对固定。 对于Netflix来说,他们可以猜想你看了这部电影,你就会想看另一部类似的电影,但如果是你昨天买了杏仁黄油和卫生纸,今天你会不会再买这两样就不好说了.
数据说明:
12345678910111213141. 数据说明 数据共有300 0000orders, 20 0000users, 5000products, 每个user提供有4-100个orders2. 各数据内容了解 aisles:产品摆放位置说明 order_products__prior:订单产品关联表 orders.csv: 用户下单记录表。 products.csv: 产品ID分类,及其摆放位置的关系表 departments.csv: 产品分类表3. 目标分析 目标是预测用户下次购 ...
FM算法-python实现
我仍然记得第一次遇到点击率预测问题时的情形,在那之前,我一直在学习数据科学,对自己取得的进展很满意,在机器学习黑客马拉松活动中也开始建立了自信,并决定好好迎接不同的挑战。
为了做得更好,我购买了一台内存16GB,i7处理器的机器,但是当我看到数据集的时候却感到非常不安,解压缩之后的数据大概有50GB - 我不知道基于这样的数据集要怎样进行点击率预测。幸运地是,Factorization Machines(FM)算法拯救了我。
任何从事点击率预测问题或者推荐系统相关工作的人都会遇到类似的情况。由于数据量巨大,利用有限的计算资源对这些数据集进行预测是很有挑战性的。
然而在大多数情况下,由于很多特征对预测并不重要,所以这些数据集是稀疏的(每个训练样本只有几个变量是非零的)。在数据稀疏的场景下,因子分解有助于从原始数据中提取到重要的潜式或隐式的特征。
因子分解有助于使用低维稠密矩阵来表示目标和预测变量之间的近似关系。在本文中我将讨论算法Factorization Machines(FM) 和Field-Aware Factorization Machines(FFM),然后在回归/分类问题中 ...
Regularized Greedy Forests (RGF)-正则化贪心森林
本文主要简单的说明下boosting algorithms家族中的一个算法成员,叫做Regularized Greedy Forests (RGF),在GBDT的基础上,RGF算法针对GBDT每次迭代只优化新建树以及过拟合的问题,提出了正则化的全局优化贪心搜索改进算法:
1.每次迭代直接对整个贪心森林进行学习
2.新增决策树后进行全局的参数优化
3.引入显式的针对决策树的正则项来防止过拟合。
非线性函数学习中,梯度提升算法是当前最有效的一种算法,每一迭代都依赖与上次迭代训练的结果,错误分类的数据被增大权重,因此下次训练时候会重点关注权重比较大的数据.
然而,GBDT算法将决策树基函数看成一个黑盒子,因而可以很方便的将决策树替换成其他算法,但是,在GBDT算法中,每一次的迭代中的唯一目标就是学习出n个节点决策树,从而将单颗树的学习与整个森林的学习分隔开.没有很好的利用到决策树本身的性质.新增的决策树只会改变本身参数的变化而没有改变老决策树的参数.
相反,在RGF算法中主要分为两部分:
固定节点权重,更改森林的结构使得损失函数下降的最快
固定森林的结构,更新节点权重使得损失函数 ...
Ensemble之stacking
Stacking是一种模型组合技术,用于组合来自多个预测模型的信息,以生成一个新的模型。即将训练好的所有基模型对整个训练集进行预测,第j个基模型对第i个训练样本的预测值将作为新的训练集中第i个样本的第j个特征值,最后基于新的训练集进行训练。同理,预测的过程也要先经过所有基模型的预测形成新的测试集,最后再对测试集进行预测.
当然,stacking并不是都能带来惊人的效果,当模型之间存在明显差异时,stacking的效果是相当好的,而当模型都很相似时,带来的效果往往并不是那么亮眼。
实现
直接以kaggle的Porto Seguro’s Safe Driver Prediction比赛数据为例。
这是Kaggle在9月30日开启的一个新的比赛,举办者是巴西最大的汽车与住房保险公司之一:Porto Seguro。该比赛要求参赛者根据汽车保单持有人的数据建立机器学习模型,分析该持有人是否会在次年提出索赔。比赛所提供的数据均已进行处理,由于数据特征没有实际意义,因此无法根据常识或业界知识简单地进行特征工程。
数据下载地址: Data
加载所需要模块
123456789101112131415 ...
Kaggle网站流量预测任务第一名解决方案
近日,Artur Suilin 等人发布了 Kaggle 网站流量时序预测竞赛第一名的详细解决方案。他们不仅公开了所有的实现代码,同时还详细解释了实现的模型与经验。
该比赛主要预测维基百科约145000篇文章的未来网页流量问题,属于时序预测问题。
下面我们将简要介绍 Artur Suilin 如何修正 GRU 以完成网站流量时序预测竞赛。
预测有两个主要的信息源:
1.局部特征。我们看到一个趋势时,希望它会继续(自回归模型)朝这个趋势发展;看到流量峰值时,知道它将逐渐衰减(滑动平均模型);看到假期交通流量增加,就知道以后的假期也会出现流量增加(季节模型)。
2.全局特征。如果我们查看自相关(autocorrelation)函数图,就会注意到年与年之间强大的自相关和季节间的自相关。
我决定使用 RNN seq2seq 模型进行预测,原因如下:
1.RNN 可以作为 ARIMA 模型的自然扩展,但是比ARIMA 更灵活,更具表达性.
2.RNN 是非参数的,大大简化了学习。想象一下对 145K 时序使用不同的ARIMA 参数。
3.任何外源性的特征(数值或类别、时间依赖或序列依赖 ...
Boruta进行特征选择—python
变量选择是模型构建的一个重要方面,每个建模人员都必须学习。通过变量选择,可以排除相关变量以及数据噪音等,有助于提高模型的泛化性。
许多新手认为,保留所有(或更多)的变量就能产生最佳的模型,因为没有丢失任何信息。可悲的是,他们错了!从模型中删除一个变量,变量个数减少了却增加了模型的精度,这种事情你遇到过多少次?至少,我已经碰到过很多次。这样的变量往往被发现是相关的,而且会妨碍实现更高的模型精度。
Boruta原本是一个R包,但是github上面有对应的python版本,点击链接1,链接2
Boruta算法
Boruta是一种特征选择算法。精确地说,它是随机森林周围的一种包装算法。这个包的名字来源是斯拉夫神话中一个居住在松林的恶魔。我们知道,特征选择是预测模型中很关键的一步。当构建一个数据集包含多个变量的模型时,这个步骤尤为重要。
当你有兴趣了解变量相关性的价值,而不是只局限于建立一个具有良好的预测精度黑盒的预测模型时候,用Boruta算法来处理这些数据集无疑是最佳选择。
Boruta函数通过循环的方式评价各变量的重要性,在每一轮迭代中,对原始变量和影子变量进行重要性比较。如果原始变量的 ...
bayesian optimization
几乎所有的机器学习算法都包括一些超参数。这些参数和常规参数不同,它们不是模型的一部分,不会在模型拟合中被自动调整,需要在额外的步骤中进行调整。常见的超参数有逻辑回归模型中的正则项lambda、支持向量机中的C项、基于树的算法中树的数量(如,随机森林、梯度提升机)。
一般常见的超参数优化方法主要有:
网格搜索
随机搜索
基于梯度的优化
贝叶斯优化
在这4中方法之中,我们尝试了网格搜索,随机搜索和贝叶斯优化。我们发现贝叶斯优化是最高效的,可以自动达到最优。
为什么贝叶斯优化比网格搜索和随机搜索更高效呢?
在寻找最优超参数值的时候,需要提前确定一些条件。首先,也是最重要的,任何算法都需要一个目标函数,目标是使得目标函数达到最大值;或者一个损失函数,目标是使得损失函数达到最小值。然后,需要确定搜索范围,一般通过上限和下限来确定。可能还有一些对于算法的参数,比如搜索的步长。
网格搜索可能是应用最广泛的超参数搜索算法了,因为它确实很简单。网格搜索通过查找搜索范围内的所有的点,来确定最优值。它返回目标函数的最大值或损失函数的最小值。给定较大的搜索范围,以及较小的步长,网格搜索是 ...
使用Neo4j对共同基金进行分析
就在前几天,我和一位投资风险经理谈了他的团队正在研究的一个数据问题,他想知道Neo4j是否能提供帮助。假设你有大约20,000个共同基金和ETFs,你想要追踪他们是如何衡量基准的,例如标准普尔500指数的回报率。比如说,2000个不同的基准,你想要跟踪它五年内的每一天的情况。这就有20000∗5∗252∗200020000 * 5* 252 * 200020000∗5∗252∗2000 共500亿数据点。如果我们使用关系数据库的话,这是一个很大的连接表。我们如何使用neo4j建立一个有效模型?
为了简单起见,假设我们只想追踪一个度量,这个度量是r2r^2r2。当我们比较共同基金和基准的价值变化时,变化轨迹有多近?r2r^2r2总是在0和1之间。0值意味着基准与共同基金无关,而1值意味着有关。那么我们怎么来建立模型呢?
我们的第一个选项是将该基金作为一个节点建模,基准作为一个节点,并通过他们对应的日期进行关系连接,其中日期和r2r^2r2作为关系的属性,如上所示。我们将有20,000个基金节点,2000个基准节点,以及500亿条关系。这是一个非常稠密的图。
首先我们尝试一个查询,看看 ...
使用Neo4j进行航班搜索
我想我将利用这个机会来解释为什么我喜欢这篇博文中的graphs。我将试着解释如何从graph的角度看问题,让你找到创造性的解决方案。我们这篇文章的背景是航班搜索,但我们真正的任务是如何快速有效地绘制graph,这样我们就可以将我们的知识应用到其他问题上。
之前,我给你们展示了不同的航空数据模型。当涉及到graph建模时,要认识到是没有一个完全正确的方法,需要根据你的查询目的构建模型。最优模型严重依赖于您想要查询的目的。为了证明这一点,我将向你们展示另一种方法来模拟航空公司的航班数据,并对航班搜索进行优化。如果你还记得,我们最后的模型是:
我们所做的最后一个建模优化是创建一个“目的地”节点,在特定的一天从同一个机场到同一个目的地的航班。后来,我了解到,世界上只有大约40k的商业机场,而neo4j支持64k关系类型。这是有用的,因为一旦一个节点拥有超过40个关系,而不是将关系存储在列表中,它们就会按类型和方向被分解并存储在组中。这些是graph中所谓的“密集”节点。如果我们知道关系的类型和方向,我们就可以在这些关系中指定方向,甚至不用考虑其他关系。记住,我们的遍历速度取决于我们要遍历多 ...







