位列首位的当属Youtube推荐强化学习的两篇论文。虽然强化学习目前在推荐系统和CTR预估领域工业界由于系统复杂、效果未有显著提升等众所周知的原因确实不够成熟也尚未大规模应用起来。但是Youtube推荐的这两篇论文从某种程度上让强化学习的应用方向变得更明确了一些,而且作者在Industry Day上也宣称线上实验效果显示这个是YouTube单个项目近两年来最大的reward增长,也从某种程度上会激发各大公司的研究者们继续跟进的兴趣。
这是第一篇论文,提出了一种Top-K的Off-Policy修正方案将RL中Policy-Gradient类算法得以应用在动作空间数以百万计的Youtube在线推荐系统中。
这是Youtube推荐应用强化学习的第二弹,主要贡献是提出了一种名为SLATEQ的Q-Learning算法,优化推荐系统里面同时展示给用户多个item情况的长期收益LTV(Long-term Value),将长期收益加入排序多目标中进行建模优化。重点在于与baseline使用的深度网络和输入特征都完全一样。
FaceBook推荐最新论文,通过建模与系统协同设计提出一种butterfly-shuffle的机制来提升模型并行化,离线训练上在没有任何超参调优下收敛速度与准确率优于DCN,并开源了代码。
华为 at WWW 2019,提出基于卷积神经网络的CTR特征生成方法FGCNN,包含特征生成和深度分类器两部分,可以和任意CTR预估模型进行组合。
阿里 at KDD 2019,提出DSTN模型用于点击率CTR预估,考虑更多空域与时域的辅助信息包括上下文展示过的ad以及历史点击/未点击ad来更好地预测目标item的点击率。从论文实验数据看,效果大幅度超过DeepFM和GRU,并开源了代码。
最新的深度CTR预估模型AutoInt,通过过Multi-head注意力机制将特征投射到多个子空间中,并在不同的子空间中捕获不同的特征组合形式,效果超过xDeepFM等达到最好。
腾讯 at KDD2019,微信看一看团队对传统Look-alike进行了改造,提出实时Look-alike算法RALM,解决推荐系统多样性问题,效果好于YoutubeDNN。
还记得阿里 at KDD 2018的深度树匹配召回模型TDM吗?升级版JTM提出索引与模型同时优化的方案,大幅提升召回效果。
腾讯 at KDD2019,构建了ConcepT概念挖掘标记系统,利用query搜索点击日志从用户视角提取不同的概念,以提高对短文本(query)和长文章(document)的理解,从而推动推荐,搜索等业务的提升。实验证明,ConcepT在 QQ 浏览器信息流业务中性能优异,曝光效率相对提升6.01%。
阿里 at IJCAI2019,考虑到不同用户行为序列的session内行为同构与session之间行为异构的特性提出了基于sesssion的CTR预估模型DSIN。使用self-attention机制抽取session内用户兴趣,使用Bi-LSTM针对用户跨session兴趣进行建模。
腾讯 at AAAI2019,提出IFM通过特征以及特征组不同角度灵活学习特征间交互的重要性,并提出了通用的Interation-NN框架和DeepIFM来捕捉高阶交互,效果优于DeepFM并开源了代码。
阿里天猫提出MIND模型通过Dynamic Routing的方法从用户行为和用户属性信息中动态学习出多个表示用户兴趣的向量,更好的捕捉用户的多样兴趣,来提升召回的丰富度和准确度,效果好于YoutubeDNN。
阿里 at KDD2019,通过系统设计解决用户超长行为历史下CTR建模与在线预测性能瓶颈,效果好于GRU4Rec和DIEN。
微软 at ACL 2019,LSTUR用于在新闻推荐任务中同时学习用户长期和短期的兴趣表示。模型的整体结构可分为新闻编码器、用户长期兴趣和短期兴趣模型、以及候选新闻的个性化分数预测模型,效果好于GRU4Rec。
KDD2019,HGN提出通过feature与instance gating的多层级结构结合BPR来更好的捕获用户的长短期兴趣,效果好于GRU4Rec以及NextItRec。
阿里巴巴搜索推荐事业部的新研究,首次使用强大的 Transformer 模型捕获用户行为序列的序列信号,供电子商务场景的推荐系统使用。原有DIN 提出使用注意力机制来捕获候选项与用户先前点击商品之间的相似性,但未考虑用户行为序列背后的序列性质。离线实验和在线 A/B 测试表明,BST 与现有方法相比有明显优势。目前 BST 已经部署在淘宝推荐的 rank 阶段,每天为数亿消费者提供推荐服务[2]。
深度CTR预估新积木:PNN + FFM - FM = ONN模型,效果好于DeepFM和PNN。
Transformer引入推荐系统工业界,利用用户历史点击序列预测下一个点击item,效果超过GRU4Rec。
阿里 at SIGIR2019,胶囊神经网络应用于推荐提出CARP模型来从评论中更好地建模用户对商品的喜好程度,效果好于最新的ANR等。
阿里 at IJCAI2019,提出DeepMCP模型通过匹配、关联、预测三个子模块更好地建模用户-ad,ad之间以及特征-CTR关系,效果优于DeepFM并开源了代码。
]]>本文转载 微信公众号 - 专知 https://w.url.cn/s/AIDTB0s
原文发表时间:2017-11-13 所有有点久,后续我计划更新最新的一版
交叉熵H(p,q)是指按照不真实分布q来编码样本p所需的编码长度的期望。交叉熵损失是神经网络分类问题中常见的损失函数,用来判断模型对真实概率分布估计的准确程度,q(x)是预测的概率分布,p(x) 是真实的概率分布(在多分类问题的 one-hot 编码)
$$
H(p,q)=-\sum_x p(x) log\ q(x)
$$
二分类问题又可进一步展开为:
$$H(y,a)=H_y(a)=−(yloga+(1−y)log(1−a))$$
1 | # y_ 真实输出值,y 预测值 |
TensorFlow中交叉熵的损失函数(loss function)主要有以下几种:
1 | def softmax_cross_entropy_with_logits_v2( |
Computes softmax cross entropy between logits and labels
原来的函数为nn.softmax_cross_entropy_with_logits,现在deprecated,位于nn_ops.py文件下。
softmax交叉熵loss,参数为网络最后一层的输出和onehot形式的标签。衡量独立互斥离散分类任务的误差,each entry is in exactly one class。
1 | logits = tf.constant([[1, 2, 3], [2, 1, 3], [3, 1, 2]], tf.float64) |
1 | def sparse_softmax_cross_entropy_with_logits( |
Computes sparse softmax cross entropy between logits and labels
这个函数和上面的区别就是labels参数应该是没有经过onehot的标签,其余的都是一样的。
1 | def sigmoid_cross_entropy_with_logits( |
Computes sigmoid cross entropy given logits
sigmoid交叉熵loss,与softmax不同的是,该函数首先进行sigmoid操作之后计算交叉熵的损失函数。衡量独立互斥离散分类任务的误差,可以处理多分类任务中的多目标检测,多标记学习等。
实现方式如下:
let
x = logits
,z = labels
The logistic loss = max(x, 0) - x * z + log(1 + exp(-abs(x)))
1 | def weighted_cross_entropy_with_logits(targets, logits, pos_weight, name=None): |
交叉熵损失通常定义为:
$$ loss_usual = targets * -log(sigmoid(logits)) + (1 - targets) * -log(1 - sigmoid(logits)) $$
而这种正例加权的损失函数定义为:
$$
loss_weight = targets * -log(sigmoid(logits)) * pos_weight + (1 - targets) * -log(1 - sigmoid(logits))
$$
当设置参数 pos_weight>1 时,减少了False Negative的数量,增加了召回率。
当设置参数 pos_weight<1 时,减少了False Positive的数量,增加了准确率。
实现方式如下:
let
x = logits
,z = targets
,q = pos_weight
,
settingl = (1 + (q - 1) * z)
loss = (1 - z) x + l (log(1 + exp(-abs(x))) + max(-x, 0))
TensorFlow 不仅支持经典的损失的损失函数,还可以优化任意的自定义损失函数。有两个办法:
其一、你自己用C++写一个。你需要把tensorflow的源代码下载下来,然后自己用C++写一个函数。可参考Adding an op。
其二、你把你自己定义的损失函数用tensorflow中的标准函数表示出来。比如你需要MSE(虽然这个已经有了),可以写成 loss = tf.reduce_mean(tf.square(tf.sub(y_real, y_pred)))
例子来源于《Tensorflow实战Google深度学习框架》1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48"""
使用交叉熵损失函数的神经网络分类demo
"""
import tensorflow as tf
from numpy.random import RandomState
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
batch_size=8
x=tf.placeholder(tf.float32,shape=(None,2),name='x_input')
y_=tf.placeholder(tf.float32,shape=(None,1),name='y_input')
w2=tf.Variable(tf.random_normal([3,1],stddev=1,seed=1))
w1=tf.Variable(tf.random_normal([2,3],stddev=1,seed=1))
a=tf.matmul(x,w1)
y=tf.matmul(a,w2)
#定义损失函数和反向传播算法
#自定义交叉熵
cross_entropy=-tf.reduce_mean(y_*tf.log(tf.clip_by_value(y,1e-10,1.0)))
train_step=tf.train.AdamOptimizer(0.001).minimize(cross_entropy)
#模拟生成训练集
rdm=RandomState(1)
dataset_size=128
X=rdm.rand(dataset_size,2)
Y=[[int(x1+x2<1)]for (x1,x2) in X]
#0、1二分类
print(X.shape)
print(Y)
with tf.Session() as sess:
init_op=tf.global_variables_initializer()
sess.run(init_op)
print(sess.run(w1))
print(sess.run(w2))
STEPS=5000
for i in range(STEPS):
start = ( i* batch_size)%dataset_size
end= min(start+batch_size,dataset_size)
#通过选取的样本训练神经网络或训练参数
sess.run(train_step,feed_dict={x: X[start:end], y_ : Y[start:end]})
if i % 1000 == 0:
#计算每隔一段时间所有数据的交叉熵并输出
total_cross_entropy=sess.run(cross_entropy,feed_dict={x:X,y_:Y})
print("After %d training steps,cross entropy on all data is %g"%(i,total_cross_entropy))
print(sess.run(w1))
print(sess.run(w2))
对于理想的分类问题和回归问题,可采用交叉熵或者MSE损失函数,但是对于一些实际的问题,理想的损失函数可能在表达上不能完全表达损失情况,以至于影响对结果的优化。例如:对于产品销量预测问题,表面上是一个回归问题,可使用MSE损失函数。可实际情况下,当预测值大于实际值时,损失值应是正比于商品成本的函数;当预测值小于实际值,损失值是正比于商品利润的函数,多数情况下商品成本和利润是不对等的。自定义损失函数如下:
$$
Loss(y,y’)=\sum_{i=1}^n f(y_i,y’_i),
f(x,y)= \left\{
\begin{matrix}
a(x-y), x > y \\
b(y-x), x \leqslant y
\end{matrix} \right.
$$
代码如下:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38"""
使用自定义损失函数的神经网络回归demo
"""
import tensorflow as tf
from numpy.random import RandomState
batch_size=8
x=tf.placeholder(tf.float32,shape=(None,2),name='x_input')
y_=tf.placeholder(tf.float32,shape=(None,1),name='y_input')
w1=tf.Variable(tf.random_normal([2,1],stddev=1,seed=1))
#预测值
y=tf.matmul(x,w1)
loss_less=10
loss_more=1
#定义损失函数和反向传播算法
#自定义损失函数
loss=tf.reduce_sum(tf.where(tf.greater(y,y_),(y-y_)*loss_more,(y_-y)*loss_less))
train_step=tf.train.AdamOptimizer(0.001).minimize(loss)
rdm=RandomState(1)
dataset_size=128
X=rdm.rand(dataset_size,2)
Y=[[x1+x2+rdm.rand()/10.0-0.05]for (x1,x2) in X]
with tf.Session() as sess:
init_op=tf.global_variables_initializer()
sess.run(init_op)
STEPS=5000
for i in range(STEPS):
start = (i * batch_size) % dataset_size
end= min(start+batch_size,dataset_size)
#通过选取的样本训练神经网络或训练参数
sess.run(train_step,feed_dict={x: X[start:end], y_ : Y[start:end]})
print(sess.run(w1))
https://www.ccf.org.cn/xspj/sjk/sjwj/nrjs/
序号 | 刊物名称 | 刊物全称 | 出版社 | 地址 |
1 | SIGMOD | ACM Conference on Management of Data | ACM | http://dblp.uni-trier.de/db/conf/sigmod/ |
2 | SIGKDD | ACM Knowledge Discovery and Data Mining | ACM | http://dblp.uni-trier.de/db/conf/kdd/ |
3 | ICDE | IEEE International Conference on Data Engineering | IEEE | http://dblp.uni-trier.de/db/conf/icde/ |
4 | SIGIR | International Conference on Research on Development in Information Retrieval | ACM | http://dblp.uni-trier.de/db/conf/sigir/ |
5 | VLDB | International Conference on Very Large Data Bases | Morgan Kaufmann | http://dblp.uni-trier.de/db/conf/vldb/ |
序号 | 刊物名称 | 刊物全称 | 出版社 | 地址 |
1 | CIKM | ACM International Conference on Information and Knowledge Management | ACM | http://dblp.uni-trier.de/db/conf/cikm/ |
2 | WSDM | ACM International Conference on Web Search and Data Mining | ACM | http://dblp.uni-trier.de/db/conf/wsdm/ |
3 | PODS | ACM Symposium on Principles of Database Systems | ACM | http://dblp.uni-trier.de/db/conf/pods/ |
4 | DASFAA | Database Systems for Advanced Applications | Springer | http://dblp.uni-trier.de/db/conf/dasfaa/ |
5 | ECML-PKDD | European Conference on Machine Learning and Principles and Practice of Knowledge Discovery in Databases | Springer | http://dblp.uni-trier.de/db/conf/ecml/ |
6 | ISWC | IEEE International Semantic Web Conference | IEEE | http://dblp.uni-trier.de/db/conf/semweb/ |
7 | ICDM | International Conference on Data Mining | IEEE | http://dblp.uni-trier.de/db/conf/icdm/ |
8 | ICDT | International Conference on Database Theory | Springer | http://dblp.uni-trier.de/db/conf/icdt/ |
9 | EDBT | International Conference on Extending DB Technology | Springer | http://dblp.uni-trier.de/db/conf/edbt/ |
10 | CIDR | International Conference on Innovative Data Systems Research | Online Proceeding | http://dblp.uni-trier.de/db/conf/cidr/ |
11 | SDM | SIAM International Conference on Data Mining | SIAM | http://dblp.uni-trier.de/db/conf/sdm/ |
序号 | 刊物名称 | 刊物全称 | 出版社 | 地址 |
1 | APWeb | Asia Pacific Web Conference | Springer | http://dblp.uni-trier.de/db/conf/apweb/ |
2 | DEXA | Database and Expert System Applications | Springer | http://dblp.uni-trier.de/db/conf/dexa/ |
3 | ECIR | European Conference on IR Research | Springer | http://dblp.uni-trier.de/db/conf/ecir/ |
4 | ESWC | Extended Semantic Web Conference | Elsevier | http://dblp.uni-trier.de/db/conf/esws/ |
5 | WebDB | International ACM Workshop on Web and Databases | ACM | http://dblp.uni-trier.de/db/conf/webdb/ |
6 | ER | International Conference on Conceptual Modeling | Springer | http://dblp.uni-trier.de/db/conf/er/ |
7 | MDM | International Conference on Mobile Data Management | IEEE | http://dblp.uni-trier.de/db/conf/mdm/ |
8 | SSDBM | International Conference on Scientific and Statistical DB Management | IEEE | http://dblp.uni-trier.de/db/conf/ssdbm/ |
9 | WAIM | International Conference on Web Age Information Management | Springer | http://dblp.uni-trier.de/db/conf/waim/ |
10 | SSTD | International Symposium on Spatial and Temporal Databases | Springer | http://dblp.uni-trier.de/db/conf/ssd/ |
11 | PAKDD | Pacific-Asia Conference on Knowledge Discovery and Data Mining | Springer | http://dblp.uni-trier.de/db/conf/pakdd/ |
12 | WISE | Web Information Systems Engineering | Springer | http://dblp.uni-trier.de/db/conf/wise/ |
https://www.ccf.org.cn/xspj/rgzn/
序号 | 刊物名称 | 刊物全称 | 出版社 | 地址 |
1 | AAAI | AAAI Conference on Artificial Intelligence | AAAI | http://dblp.uni-trier.de/db/conf/aaai/ |
2 | NeurIPS | Annual Conference on Neural Information Processing Systems | MIT Press | http://dblp.uni-trier.de/db/conf/nips/ |
3 | ACL | Annual Meeting of the Association for Computational Linguistics | ACL | http://dblp.uni-trier.de/db/conf/acl/ |
4 | CVPR | IEEE Conference on Computer Vision and Pattern Recognition | IEEE | http://dblp.uni-trier.de/db/conf/cvpr/ |
5 | ICCV | International Conference on Computer Vision | IEEE | http://dblp.uni-trier.de/db/conf/iccv/ |
6 | ICML | International Conference on Machine Learning | ACM | http://dblp.uni-trier.de/db/conf/icml/ |
7 | IJCAI | International Joint Conference on Artificial Intelligence | Morgan Kaufmann | http://dblp.uni-trier.de/db/conf/ijcai/ |
序号 | 刊物名称 | 刊物全称 | 出版社 | 地址 |
1 | COLT | Annual Conference on Computational Learning Theory | Springer | http://dblp.uni-trier.de/db/conf/colt/ |
2 | EMNLP | Conference on Empirical Methods in Natural Language Processing | ACL | http://dblp.uni-trier.de/db/conf/emnlp/ |
3 | ECAI | European Conference on Artificial Intelligence | IOS Press | http://dblp.uni-trier.de/db/conf/ecai/ |
4 | ECCV | European Conference on Computer Vision | Springer | http://dblp.uni-trier.de/db/conf/eccv/ |
5 | ICRA | IEEE International Conference on Robotics and Automation | IEEE | http://dblp.uni-trier.de/db/conf/icra/ |
6 | ICAPS | International Conference on Automated Planning and Scheduling | AAAI | http://dblp.uni-trier.de/db/conf/aips/ |
7 | ICCBR | International Conference on Case-Based Reasoning and Development | Springer | http://dblp.uni-trier.de/db/conf/iccbr/ |
8 | COLING | International Conference on Computational Linguistics | ACM | http://dblp.uni-trier.de/db/conf/coling/ |
9 | KR | International Conference on Principles of Knowledge Representation and Reasoning | Morgan Kaufmann | http://dblp.uni-trier.de/db/conf/kr/ |
10 | UAI | International Conference on Uncertainty in Artificial Intelligence | AUAI | http://dblp.uni-trier.de/db/conf/uai/ |
11 | AAMAS | International Joint Conference on Autonomous Agents and Multi-agent Systems | Springer | http://dblp.uni-trier.de/db/conf/atal/index.html |
12 | PPSN | Parallel Problem Solving from Nature | Springer | http://dblp.uni-trier.de/db/conf/ppsn/ |
序号 | 刊物名称 | 刊物全称 | 出版社 | 地址 |
1 | AISTATS | Artificial Intelligence and Statistics | JMLR | http://dblp.uni-trier.de/db/conf/aistats/ |
2 | ACCV | Asian Conference on Computer Vision | Springer | http://dblp.uni-trier.de/db/conf/accv/ |
3 | ACML | Asian Conference on Machine Learning | JMLR | http://dblp.uni-trier.de/db/conf/acml/ |
4 | BMVC | British Machine Vision Conference | British Machine Vision Association | http://dblp.uni-trier.de/db/conf/bmvc/ |
5 | NLPCC | CCF International Conference on Natural Language Processing and Chinese Computing | Springer | https://dblp.uni-trier.de/db/conf/nlpcc/ |
6 | CoNLL | Conference on Computational Natural Language Learning | Association for Computational Linguistics | http://dblp.uni-trier.de/db/conf/conll |
7 | GECCO | Genetic and Evolutionary Computation Conference | ACM | http://dblp.uni-trier.de/db/conf/gecco/ |
8 | ICTAI | IEEE International Conference on Tools with Artificial Intelligence | IEEE | http://dblp.uni-trier.de/db/conf/ictai/ |
9 | IROS | IEEE\RSJ International Conference on Intelligent Robots and Systems | IEEE | http://dblp.uni-trier.de/db/conf/iros/ |
10 | ALT | International Conference on Algorithmic Learning Theory | Springer | http://dblp.uni-trier.de/db/conf/alt/ |
11 | ICANN | International Conference on Artificial Neural Networks | Springer | http://dblp.uni-trier.de/db/conf/icann/ |
12 | FG | International Conference on Automatic Face and Gesture Recognition | IEEE | http://dblp.uni-trier.de/db/conf/fgr/ |
13 | ICDAR | International Conference on Document Analysis and Recognition | IEEE | http://dblp.uni-trier.de/db/conf/icdar/ |
14 | ILP | International Conference on Inductive Logic Programming | Springer | http://dblp.uni-trier.de/db/conf/ilp/ |
15 | KSEM | International conference on Knowledge Science,Engineering and Management | Springer | http://dblp.uni-trier.de/db/conf/ksem/ |
16 | ICONIP | International Conference on Neural Information Processing | Springer | http://dblp.uni-trier.de/db/conf/iconip/ |
17 | ICPR | International Conference on Pattern Recognition | IEEE | http://dblp.uni-trier.de/db/conf/icpr/ |
18 | ICB | International Joint Conference on Biometrics | IEEE | http://dblp.uni-trier.de/db/conf/icb/ |
19 | IJCNN | International Joint Conference on Neural Networks | IEEE | http://dblp.uni-trier.de/db/conf/ijcnn/ |
20 | PRICAI | Pacific Rim International Conference on Artificial Intelligence | Springer | http://dblp.uni-trier.de/db/conf/pricai/ |
21 | NAACL | The Annual Conference of the North American Chapter of the Association for Computational Linguistics | NAACL | http://dblp.uni-trier.de/db/conf/naacl/ |
在Airbnb机器学习应用中,搜索排序是获得最大成功的案例之一。大多数初始收益是来自于梯度提升决策树模型(即GBDT)。 然而,随着时间的推移收益趋于稳定。 本文讨论了我们尝试应用神经网络的这样一个突破性的工作。我们提出的观点并非旨在推动新建模技术的前沿。 相反,我们的故事是我们发现在将神经网络应用于现实生活产品时有用的元素。对我们来说是深度学习的曲线比较陡。但对于开始类似工作的其他团队来说,希望对我们的挣扎和胜利的描述将提供一些有用的指示。 一路顺风!
Airbnb是一个双向市场:hosts房东 vs guests房客 。
搜索排序模型最早是人工设计的打分函数,就是使用了策略。后来使用了GBDT模型替换了这个策略,Airbnb 的房屋预定得到了大幅度的提升,于是就迭代优化了很多次。
本文的搜索排名只是 Airbnb 模型生态中的一部分,所有的模型最后的目标都是给客户呈现一个最优的房屋预定列表。生态中的模型有一些是预测房东接受客人预定的概率,一些是预测客人在体验上给五星的概率等。本论文只讨论搜索排名的模型,这个模型负责根据客户预定房屋的可能性给房屋检索列表做一个最优的排序。
一个成功的搜索会话是以客户开始搜索为开始,以客户预定房屋成功为结束。
本文主要从以下几个方面展开:
单隐层的NN,32个全连接单元,ReLU激活函数。
NN的输入特征和GBDT模型一样,训练的目标函数都是最小化 L2 损失函数,都是与GBDT保持一致。
将NN和Lambdarank结合使我们首次得到突破。离线我们使用NDCG作为主要指标,因此在NN模型中可以直接优化NDCG,相比于之前的简单NN会有两个重要的改进:
1 | def apply_discount(x): |
受到Deep & Cross Network for Ad Click Predictions,也就是DCN的启发,新模型融合了决策树、因子分解机、神经网络三者的优点。 将FM预测的结果作为一个特征加入NN,将GBDT的每棵树的叶子节点index作为一个类别特征加入NN。
在最后的尝试中,我们放弃了所有的复杂模型,精简到使用10倍训练数据来训练一个两个隐层的DNN模型。网络架构如下:
至于为啥隐层数目是127、83这样的数字而不是传统的128、64这种2的幂数,我很好奇的问过作者,得到的回复是:I like prime number.
We later tested Lambdarank vs pairwise loss in isolation and found them neutral in bookings. So we deprecated Lambdarank and now use the pairwise loss as it is much simpler and faster.
包含的特征有:
每个Listing都有其相对应的唯一ID,使用Listing id作为特征。
将高基数的类别特征做Embedding,在很多应用上取得了成功,如NLP中单词的Embedding的应用,谷歌的推荐系统中用户id和视频id的Embedding。
但是用Listing ids做Embedding特征导致了过拟合问题,究其原因是由于数据量不足。即使是最受欢迎的Listing,也可以在一年中最多预订365次,而且每个Listing的典型预订量要少得多。
NLP中单词的Embedding时,word可以无限制的重复;谷歌的推荐系统中用户id和视频id的同样也是可以不断重复出现。但是Airbnb的独特业务性质,导致了该方案的失败。
bookings有物理限制,但是用户浏览listing详情页没有限制。进一步发现,用户长时间的浏览listing详情页和bookings是正相关的。
为了解决Listing ids过拟合的问题,建立了多任务学习的模型,同时预测一间房间booking的概率和长时间浏览的概率。最重要的是,Listing id的Embedding输入隐层后,在网络模型中进行了共享。因此我们这样做的动机是希望能够从长时间浏览中学习的信息来预测booking,避免过拟合。
由于长时间浏览的label是远超过bookings用户几个数量级的,在booking loss上使用了更高的权重作为补偿。后面将长时间浏览的label调整为 log(view duration) ,在线打分时,我们仅使用了预测booking。
长时间浏览的数据可能由于高端和高价格的listings所主导,
关于listing的浏览后续会作为一个专题进行深入研究。
刚开始baseline使用的GBDT做了大量的特征工程,典型的特征转换,包括计算比率,窗口滑动平均等等。
刚开始时用与GBDT相同的输入特征来训练NN,效果很差,因为树模型对特征的大小不敏感,而神经网络的输入需要进行归一化。决策树对数值型特征的大小并不是很重要,只要表征有序就可以,而神经网络对此很敏感。如果输入特征的数值超过通常特征值的范围,在做反向传播计算的时候,就会引起大的梯度改变。由于梯度消失,会导致像 ReLU 这样的激活函数处于永久关闭状态。为了避免这个现象的发生,我们要保证所有特征的值域在一个小的范围内变化。通常的做法是让特征的分布值域在{-1,1},中心点映射到 0。
We wanted the feature to be evenly distributed around 0. Putting the median in the denominator ensures that. The offset of 1 is to equalize the offset of 1 in the numerator.
power law distribution:
除了将特征映射到一个限制的数值范围,本文确保绝大部分的特征服从平滑的分布。原因如下:
我们如何测试模型在登录样本的泛化效果很好呢?在调试并应用适当的标准化时,大多数特征都获得了平滑分布,但有一些我们不得不做专门的特征工程。有个例子是listing的地理位置,由经度和纬度表示。为了使地理特征分布更平滑,通过计算与中心点的偏移量来表征地理特征信息。
检查特征完整性(Checking feature completeness):某些特征的分布不平滑,会导致模型学习信息缺失。有个例子是房屋未来可以被占用的天数。调查发现列表中有一些房屋有最低的住宿要求,可能延长到几个月。但是我们没有在模型中添加最小所需停留时间,因为它取决于日历并且过于复杂。 但是,如果考虑入住率分布,我们添加了listing平均居住时长作为模型的一个特征。
在一个维度上缺乏平滑分布的一些特征可能在更高维度上变得平滑。 如果这些维度已经可用于模型,那么我们有必要仔细思考,如果没有,那么添加它们。
过拟合的Listing ID不是我们尝试的唯一高基数类别特征。对于NN而言,我们还有其他一些尝试,通过很少的特征工程获得了高回报。 通过一个具体的例子最好证明这一点。 客人对一个城市的各个临近城市的偏好是一个重要的位置信号。 对于GBDT模型,这些信息由一个设计严密的pipeline提供,该pipeline跟踪社区和城市的预订等级分布。 建设和维护这条pipeline所付出的努力是巨大的。 然而,它并未考虑预订房源价格等关键要素。
在神经网络中,处理这些信息就很简单了。 我们通过获取查询中指定的城市和与Listing对应的12级S2 cell格来创建新的分类特征。
发现了地理偏好,比如旧金山西海湾南部的位置比跨越桥梁的位置更受欢迎,后者往往交通拥堵频发。
Dropout as data augmentation. https://arxiv.org/abs/1506.08700
dropout一般被看做很多共享参数模型的集合,即bagging;这篇文章从数据增强角度给予解释,dropout可以看成无领域知识的情况下在输入空间进行数据增强的方法。dropout强迫一个神经单元,和随机挑选出来的其他神经单元共同工作,达到好的效果。消除减弱了神经元节点间的联合适应性,增强了泛化能力。
Initialization
Xavier initialization:$$\text{Var}(W) = \frac{1}{n_\text{in}}$$
Glorot & Bengio’s paper originally recommended using $$\text{Var}(W) = \frac{2}{n_\text{in} + n_\text{out}}$$
Learning rate
Tensorflow has a “Lazy Adam Optimizer“ that only updates the gradient for variables whose indices appear in the current batch. This may be a good idea for very sparse data like language models.
Vanilla Adam updates all parameters at every step, while lazy Adam only updates parameters that are actually employed – in a sparse setting like a language model, that can make a big difference, because lazy Adam applies no updates to rare words until they appear, at which time they get a big update. More common words are updated more frequently.
How much training data do you need?
总的来说,评估特征重要性和模型可解释性是我们向NN转移的一个领域。评估特征重要性对于优先考虑工程工作和指导模型迭代至关重要。 NN的优势在于理解特征之间的非线性组合。 当理解特定特征扮演什么角色时,这也是一个弱点,因为非线性交互使得单独研究任何特征变得非常困难。 接下来,我们将重述一些破译NN的尝试。
分数分数(Score Decomposition):我们最初的做法是获取神经网络产生的最终得分,并尝试将其分解为各个节点贡献得分。没有纯净的方法来分离是特定传入节点的影响,还是像ReLU这样的非线性激活函数的影响。
消除测试(Ablation Test):
Permutation Test
TopBot Analysis:我们自创了一个工具,旨在不以任何方式扰乱特征来解释特征,命名为TopBot,是上下分析器的缩写。将测试集作为输入,并使用模型对每个测试qurey对应的列表进行排序。 然后,它从每个query顶部排名listing中生成特征值的分布图,并将它们与底部listing中的特征值分布进行比较。
可以看到price在top listing和bottom listing还是有区别的,top listing更倾向于拥有相对小的price,表示模型对价格敏感。而review count却没有任何区别。 从这里,也可以得到一些信息。
图15总结了我们迄今为止的深度学习历程。在无处不在的深度学习成功故事的基础上,我们开始处于乐观的高峰期,认为深度学习将成为GBDT模型的替代品,并为我们带来惊人的收益。许多初步讨论都集中在保持其他一切不变,并用神经网络取代当前模型,以了解我们可以获得的收益。这使我们陷入绝望之谷,最初这些收益都没有实现。事实上,我们在开始时看到的只是在线指标的回归。随着时间的推移,我们意识到转向深度学习根本不是替代模型;而是关于扩展系统。因此,它需要重新思考模型周围的整个系统。限制在较小的尺度,像GBDT这样的型号可以说性能相当,更容易处理,我们继续将它们用于集中的中型问题。
那么我们是否会向其他人推荐深度学习?那将是一个全心全意的。而且这不仅是因为该模型在线表现的强劲增长。其中一部分与深度学习如何改变我们的路线图有关。早期的重点主要是功能工程,但在深入学习之后,尝试手动对功能进行更好的数学运算已经失去了光彩。这使我们能够在更高层次上解决问题,例如我们如何改进优化目标,并且我们是否准确地代表了所有用户?在采用神经网络搜索排名的第一步后两年,我们觉得我们刚刚开始。
]]>本文转自 Spark中ml和mllib的区别
fit
;不像mllib中不同模型会有各种各样的trainXXX
。维护状态
, 这个状态通常只修复BUG不增加新功能。以上就是ml和mllib的主要异同点。下面是ml和mllib逻辑回归的例子,可以对比看一下, 虽然都是模型训练和预测,但是画风很不一样。
1 | sparse_data = [ |
1 | from pyspark.sql import Row |
很多年前我从一个电视节目中看到平遥古城,第一次看到还是蛮震撼的,因此在心中一直有想去古城走走的情节。我有去过很多个古镇,皖南的、苏州的、成都的,还有北方的古北水镇,正是习惯了南方的小桥流水和那般精致,才愈发觉得北方的古城给人一种稳重厚实的感觉,平遥古城也是这样一个地方。
傍晚时分到达平遥古城东门不远的一个宾馆里,放下行李就饥肠辘辘的直奔古城了。昏黄的灯光下,沿路两边的叫卖声,形形色色的游客和熙熙攘攘的车辆,走在石板路上,漫无目的逛了很久,才找了家饭馆吃饭。之前有听说平遥古城内的美食小吃不是一般的难吃,特意选了一家店大人多的,要了平遥特色的各种栲栳栳、长山药等,结果上菜后懵逼了,无色无味难看难吃到无力吐槽,勉强吃了几口逃之夭夭……
随后逛了逛南大街和西大街,这里是古城内最为繁盛的传统商业街。跟所有旅游区一样,老字号与传统名店铺林立,琳琅满目的工艺品店、美食、酒吧、路边小商贩、特色的足浴室、还有北京玩剩下的VR体验馆等等,文艺气息似乎绝不输给外面世界的任何一个地方。
平遥酒吧一条街没有九寨风情街那样的震耳欲聋,所以走在路上能清楚的听到那些驻唱歌手的歌声都很好听。“我在平遥等你,任凭时光老去······”,街旁的酒吧里,随着有节奏的手鼓声,传来一首平遥之恋的小曲。我在平遥等你是一家有情调的寄明信片的店儿,在古城几条街上看见多次,门外合影的妹子是真多。据说这儿可以寄存你给未来的自己写的信,也难怪这里最受文艺青年的青睐了。
在平遥古城住了一晚,第二天早上起床发现外面下雨了,这个假期还是没有逃掉下雨天,心里有点失望,还没见过阳光明媚蓝天白云下古城慢节奏生活的我,又怎会相信下雨天的古城会有另一番韵味……白天走在城里,视野要开阔很多,遇到下雨天,石板路面很滑,积水很多,鞋子很容易湿。因为只有半天的时间,没法走遍古城纵横交错的四大街、八小街、七十二条蚰蜒巷,甚至连几处出名的古城景点都不愿去找了,索性不再脚步匆匆,避开喧嚣的主干道,走向羊肠小道。总觉得相比丽江和大理的浪漫,平遥古城则低调深沉,充满沧桑,随着岁月的洗涤,破旧的民居年久失修,残砖断瓦,枯木石雕是消失的财富帝国的遗迹,让人满目苍夷。
以前平遥进城收200元门票,城内景点随意观赏,现在进城不需要门票,但是古城里的景点有一张130元的联票,可以去著名的日升昌、县衙、登古城墙……现在的古城越来越商业,越来越喧嚣,很难找到与世无争的安宁,但还是比钢铁丛林的城市森林静谧。在这之前我想象中的平遥古城应该是很多个乔家大院组成的,然后走进城里才发现这儿似乎是多个南锣鼓巷加北锣鼓巷的乡村版。
今天的早饭和午餐也都是在城里吃的,不过对平遥美食已经没有很大的期待了,果断从大众点评上找,平遥最出名的应该还是特色面食栲栳栳和牛肉等,而且消费真的不高。而且在这里我注意到支付方式都是现金、微信或支付宝的转账,没有银联支付和线下移动支付,互联网行业在三四线小城还没有渗透。就像我在宾馆住宿时,老板说的,平遥要是消费提高了,就没人来了,不知道这是不是一种悲哀。
中午12点时启程回京了,从平遥回北京,600多公里,预计八点到京。高速路上,一路尽有清明时节雨纷纷,耳畔回荡着歌声: 开车行驶在公路无际无边,有离开自己的错觉……今天是返程高峰,外面还下雨,车内很黑暗,一觉醒来,发现同行的98年出生的清华建筑系女生,用手机看PDF书籍,划线和高亮做注解,再一觉醒来,她手机开着手电筒,看了一路打印的讲义,旅行和学习,始终在路上,这才是应有的生活态度。
]]>早上6点半起床,7点出发,走S339省道去云冈石窟,大同这个季节的早上还是有点冷的,需要多穿衣服。
简单介绍下云冈石窟,位于大同市城西约16公里的武周山,石窟依山开凿,是世界文化遗产,也是中国四大石窟之一。参观云冈石窟更像是在阅读一段北魏的历史,迄今1500多年,也就是追溯到公元386年到534年间左右的鲜卑族建立起的北魏王朝。鲜卑是游牧民族,起源于今天的黑龙江额尔古纳河上游与大兴安岭一带,两汉之际开始从东北向南迁徙,在不断的征战中逐步扩大自己的势力范围。公元398年北魏迁都平城(也就是大同),由于佛教的发展及北魏皇帝崇信佛教,开凿云冈石窟。后北魏继续南迁洛阳后,兴建了龙门石窟。
经过历时的洗礼,现在的景区更像是一座公园,从偌大的停车场到售票厅,到新建的庙宇,真正的二十窟,还有博物馆。参观时从第一窟到第二十窟,但是真正修建的时间是从第二十窟到第一窟的,即早期、中期和晚期石窟。前二窟很小但是聚集了很多人,刚进来大家都很好奇吧,这里很多窟是禁止拍照的,中间有三窟正在维护暂停观赏,第二十窟是最大也是最早修建的。云冈石窟重在雕刻,其石像上面的彩色都是清朝时期工匠所为,其他详细的可参看官网的介绍。整个园区环境清幽,不算太大,两个小时足够,对于这类人文历史景观,建议大家在参观时几个人一起请个导游讲解比较好。
上午10点半离开景区,上车时有个插曲,早上出门将未拆封的一瓶纯净水倒入自己的水杯中,可能太过匆忙,杯盖没有扭紧,一杯水流湿了整个书包。书包里的外套全湿,纸巾吸了不少水,因此iPad万幸没有湿。
离开大同,上高速G55,一路向南,赶往乔家大院和平遥古城。
在三天假期的第二天中午,我从晋北到晋中。
汽车行驶在这片黄土高原的高速路上,地势海拔也渐渐从一千米降到几百米。北方的天空虽然是蓝天,却是那种依稀的淡淡的蓝,空气中始终有些雾阻碍视野。
车窗外是一片灰色,让我想起南方的春暖花开是一片绿色,蓝天下沐浴春风和阳光,我想回家乡了。
下午四点到达晋中祁县的乔家大院。乔家大院的出名不知道是否与电影《大红灯笼高高挂》和电视剧《乔家大院》有关,但这座建立于清乾隆间的雄伟壮观的建筑群体,确实设计之精巧,工艺之精细,传闻“皇家有故宫,民宅看乔家”,当然有那么一点夸张的成分。刚走进乔家大院时,以为是走进了博物馆,当你细细观察那奇特的建筑风格,砖瓦磨合,斗拱飞檐,彩饰金装,砖石木雕,像我这个非建筑系毕业的都感叹到精工细做和工艺精湛。当然,乔家大院并不是让你来欣赏建筑的,每个院子每间屋子或多或少有它的故事,关于乔氏几代人家族兴衰的历史。按照今天编剧的写法,这里是会有富二代少爷吸毒而亡,刁蛮千金小姐爱炫富引来绑匪且被撕票等狗血情节的……
乔家大院不算特别大,全部参观完在2个小时内足够,但是方向感不强的人可能很快被绕晕。夕阳西下,听着广场上播放的电视剧中的那些主题曲,看着周边还在不断翻建的新房子,总觉得这处静谧的大院本该低调却因过渡开发而变得如此喧嚣。
六点钟,从乔家大院离开,去往平遥古城,我最期待的地方。
]]>“人间四月芳菲尽,蕾红叶绿四季春。”今年的春天来的有点晚,这个时节的北方依然是春寒料峭。关于行走山西的计划,一直在我笔记本的List上。平日一直忙于工作,假期去哪也未曾想过,所以临时起意去山西,主要还是北京到山西比较近,更好的利用三天假期时间。清明时节,没有雨纷纷。4月1日在公司里继续忙碌完一天下班后,去超市购物回家后,收拾行李,准备第二天一早的行程。
放假前一天才开始准确行程,略显仓促,没有传说中的说走就走那么惬意。现在每一次的旅行对于我来说,不愿在行走之前的工作日去花时间做计划,那会打乱工作的节奏,相反,我会选择在旅行过程中忘掉工作,随意而行,期待未知的风景。
没有华丽或雅致的文字,没有绝美或文艺的照片,仅为记录这次旅途中的点点滴滴。
山西,太行山之西,历史文化悠久,地理上属于山地高原。对于我这样的南方人,上学时很少遇到山西的同学,来北京工作后倒是遇到不少,因此所了解到的山西比较出名的旅游景点莫过于恒山、五台山、云冈石窟、平遥古城和乔家大院这些了。
五岳中有个形容是东岳泰山之雄,西岳华山之险,北岳恒山之幽,中岳嵩山之峻,南岳衡山之秀。如果用一个字形容恒山,就是幽,是指恒山的幽静。恒山位于大同市浑源县境内,自古即为道教圣地,所以山上以寺庙为核心。
下午1点半到了恒山脚下的悬空寺,由于人太多,没有去登寺,远远望了两眼直奔恒山正门,也算是一个遗憾。恒山上山的路比较好走,没有很多的盘山公路,所以开车很快就能到半山腰处的大门,这里已经有海拔一千五百米左右(晋北地势较高,海拔均在一千米左右),所以从大门检票到登顶,其实也就累积上升几百米的高度,因此爬行难度系数低。
大概2点时下车稍作休息吃了点东西,平缓了下身体,开始登山。登山的路一直都是在平稳上升,没有曲折的路段,也没有之前爬山遇到的绝望坡、九十九道弯、百步云梯等险峻的台阶。据说后线山道较险,路边绝壁如墙,沿途自然景观极佳,是驴友的最爱。
这个季节在南方已经春暖花开,然而在北方早晚还是很冷的。恒山上沿途有很多积雪,远处的群山顶上也有大片积雪如同雪山。网上看到图文说登山最好的时节是五六月,山上花开茂盛,绿意盎然,而不像现在还几乎是光秃秃的一片。下午3:45就到了山顶主峰天峰岭,海拔2017米,这儿聚集好多人在排队和主碑合影留念。我们在上面停留了一会儿4点时开始下山,45分钟到达起点。从用时来看,上山2小时,下山1小时,足矣。
5点多出发离开恒山,奔赴大同市里,一个半小时候后到达酒店——魏都生态乐园酒店。作为煤矿资源发达的城市,大同的路上重卡车太多,如果自驾游需要注意了,担心大车盲区。我们住的四星级酒店紧挨着高速出口,类似于城郊区,离市中心很多路,以至于晚上都没有地方吃饭。最近的中信广场走过去花了有40分钟,一开始不知道会有这么多路,在滴滴叫不到车的情况下做了个错误的决定。后来才知道大同没有滴滴快车,只有出租车,不知道是不是出于地方保护政策。
八点多的城里,很多店铺都关门了,路上很安静,这对在北京习惯夜生活的我们来说有点不适应。在市里找到一家孟记面馆,不免俗套的要一份大同刀削面,才十块钱,面的味道还行,没让人失望。吃完饭在旁边的小超市买点吃的,然后打车回去,出租车漫天要价,于是第一辆车我拒绝了,叫了很久才叫到第二辆车。跟师傅聊天,问沿途的这些大烟囱和白色排放物,以及空气中弥漫的二氧化硫味。师傅告知那是大同第二发电厂,专为北京输电,飘出的是水蒸气不是污染物。还有大同的煤虽很出名,但都以低价卖给河北了,后来要债都要不回来……师傅还说这个季节有点冷,大同没啥好看的,要等到六月份来才行…师傅没有打表,自己估算了下路程,然后让给他转账,可能在大同这样一座小城里,任意两个地点之间的路程,对师傅来说经验比工具更为准确和方便。
回到酒店早早躺下,在山西的第一天结束。
]]>岛上书店的原著英文名是The Storied Life of A.J. Fikry,正如英文名直译费克里富有戏剧性的人生,讲述了书店老板A.J.充满故事的生命中,遇到了一些可爱的人,经历着爱与被爱、付出与接受、孤独与陪伴的一生。
A.J. Fikry住在爱丽丝岛上,一个小岛,他拥有岛上唯一的书店,不过最近他更喜欢喝酒,而不是卖书,因为他在为惨死车祸中的妻子妮可感到悲伤。A.J.和妮可是大学的同学,同样都是研究文学的博士生毕业,这也算是志同道合的一对了。妮可去世后,A.J.的颓废使得书店遭遇危机,屋漏偏逢连夜雨,书店里最宝贵的珍藏本图书《帖木儿》也遭窃了。仿佛命运从未眷顾过他,他的内心沦为了荒岛。
就在此时,神秘的小女孩玛雅,出现在书店中, 看似A.J.照顾起这个孤儿,其实也是玛雅意外地拯救了陷于孤独绝境中的A.J.,并且成为了连接他和小姨子伊斯梅、警长兰比亚斯、出版社女业务员阿米莉娅之间的纽带。
阿米莉娅Amelia是一位出版社代表,邀请爱丽丝书店出售本季最新的作品。 A.J.一开始对她并不友好,后来在接触中慢慢心生爱意。这位中年男人不懂的怎样表达,甚至连去她家看望她都很含蓄,连玛雅看着都急,好在最后两个人终在一起。伊斯梅是妮可的姐姐,也就是A.J.的小姨子,可惜遇到了一个花心的丈夫和一个个谎言,最后和警长兰比亚斯心生爱意。兰比亚斯是A.J.的好朋友,职业的敏感让他在伊斯梅家中发现了一些秘密:关于玛雅的身世、那本被盗的书……
小岛上的主要人物和故事还有很多,但他们的生命紧紧相依,并最终一起走出了人生的困境,遗憾的是A.J.没有战胜肿瘤而离去,书店也有了新的主人,所有对书和生活的热爱都周而复始,愈加汹涌。
如果你喜欢阅读,喜欢书籍和书店,我相信这是一部能吸引你的小说。这儿有些书中的经典语录。
A.J.:“想要了解一个人,你只需要问一个问题‘你最喜欢哪本书?’”
“一旦一个人在乎一件事,就发现自己不得不开始在乎一切事。”A.J.向阿米莉亚求婚:“……我可以向你保证有书、有交流,还有我的全心全意,艾米。”
兰比亚斯:“有时候别人跟你说你踏上一种旅程,结果却成了另外一种旅程。”
“生活中每一桩糟糕事,几乎都是时机不当的结果,每件好事,都是时机恰到好处的结果。”
《迟暮开花》:“因为从心底害怕自己不值得被爱,我们独来独往。然而就是因为独来独往,才让我们以为自己不值得被爱。有一天,你不知道是什么时候,你会驱车上路。有一天,你不知道是什么时候,你会遇见他。你会被爱,因为你今生第一次真正不再孤单。你会选择不再孤单下去。”
我是利用早上上班坐地铁的半个多小时和晚上睡觉前躺床上看一小时书的时间,零散且不急不慢地在读。从一开始的情节迷茫、情感复杂到最后的人物心理反思,隐情的慢慢暴露,从开始的颓废到心里充满希望走出困境,小岛上的生活仿佛与世隔绝,而爱是最好的礼物,让一无所有的孤岛成为丰富美丽的存在。
所以,每一本书,都是一个世界。
]]>Xgboost是大规模并行boosted tree的工具,它是目前最快最好的开源boosted tree工具包,比常见的工具包快10倍以上。在数据科学方面,有大量kaggle选手选用它进行数据挖掘比赛,其中包括两个以上kaggle比赛的夺冠方案。在工业界规模方面,xgboost的分布式版本有广泛的可移植性,支持在YARN, MPI, Sungrid Engine等各个平台上面运行,并且保留了单机并行版本的各种优化,使得它可以很好地解决于工业界规模的问题。
本文是我今天在Mac系统下成功安(cai)装(keng)Xgboost的笔记(Windows系统用户请出门左转),Mac系统10.12版本按照Xgboost官网安装指南,出现了错误。
如果按照传统Python库用pip来安装:sudo pip install xgboost,同样出现了错误,最后亲测下面方法安装成功。
Homebrew是Mac系统下非常优秀的包管理工具,相当于Ubuntu的apt-get,安装命令:
1 | /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" |
Mac系统默认有Python、Ruby、Shell等环境,但是没有gcc和g++的,安装XCode之后会有clang,而XCode自带的clang是不支持OpenMP的,所以需要重新安装gcc。这个过程比较久,一直在下载,网速快的话差不多半个多小时吧。
1 | brew install gcc --without-multilib |
1 | git clone --recursive https://github.com/dmlc/xgboost |
1 | cp make/config.mk ./config.mk |
用vim打开config.mk,修改下面两行:
1 | export CC = gcc-6 |
这样做是为了用之前下载的gcc-6而不是系统已有的gcc来编译。
本来按照官网的 make -j4 来编译,但是未成功,所以改用下面这种方法来编译:
1 | ./build.sh |
安装Xgboost的Python版需要Numpy、Scipy等数值计算库,建议安装Anaconda,所有的科学计算和数据挖掘库都安装好了。
1 | cd python-package |
1 | >>> import xgboost as xgb |
OK,没有报错,安装成功。
下面你可以用Xgboost算法来玩数据了,官网有好多Example来学习。
1 | import xgboost as xgb |
如果你想玩kaggle比赛,Xgboost这把屠龙刀更不可少。
]]>Spark对数据的核心抽象——弹性分布式数据集(Resilient Distributed Dataset,简称RDD)。RDD其实就是分布式的元素集合。在 Spark中,对数据的所有操作不外乎创建 RDD、转化已有RDD以及调用RDD操作进行求值。而在这一切背后,Spark会自动将RDD中的数据分发到集群上,并将操作并行化执行。
Spark提供了两种创建 RDD 的方式:
1 | val lines = sc.textFile("/path/to/README.md") |
1 | val lines = sc.parallelize(List("pandas", "i like pandas")) |
RDD 支持两种操作: 转化操作 transformation 和 行动操作 action
转化操作是返回一个新的 RDD 的操作,比如 map() 和 filter()
map() 接收一个函数,把这个函数用于 RDD 中的每个元素, 将函数的返回结果作为结果RDD中对应元素的值。 如用Scala 实现map计算 RDD中各值的平方:
1 | val input = sc.parallelize(List(1, 2, 3, 4)) |
flatMap()和 map() 类似,函数被分别应用到了输入 RDD 的每个元素上,不过返回的不是一个元素,而是一个返回值序列的迭代器。即对每个输入元素生成多个输出元素,得到由各列表中的元素组成的 RDD。
filter() 则接收一个函数,并将 RDD 中满足该函数的 元素放入新的 RDD 中返回,如用 Scala 实现 filter() 转化操作:
1 | val inputRDD = sc.textFile("log.txt") |
函数 | 功能 | 示例 | 结果 |
---|---|---|---|
map() | 将函数应用于 RDD 中的每个元素,将返回值构成新的RDD | rdd.map(x => x + 1) | {2, 3, 4, 4} |
flatMap() | 将函数应用于 RDD 中的每个元素,将返回的迭代器的所有内容构成新的RDD,通常用来切分单词 | rdd.flatMap(x => x.to(3)) | {1, 2, 3,2, 3, 3, 3} |
filter() | 返回一个由通过传给 filter() 的函数的元素组成的 RDD | rdd.filter(x => x != 1) | {2, 3, 3} |
distinct() | 去重 | rdd.distinct() | {1, 2, 3} |
sample(withReplacement, fraction, [seed]) | 对 RDD 采样,以及是否替换 | rdd.sample(false, 0.5) | 非确定的 |
行动操作则是向程序返回结果或把结果写入外部系统的操作,会触发实际的计算,比如 count() 和 first()
在 Scala 中使用行动操作对错误进行计数:
1 | println("Input had " + badLinesRDD.count() + " concerning lines") |
reduce()接收一个函数作为参数,这个函数操作两个RDD的元素类型的数据并返回一个同样类型的新元素。一个简单的例子就是函数 + ,可以用它来对RDD进行累加。
Scala 中的 reduce():
1 | val sum = rdd.reduce((x, y) => x + y) |
fold() 和 reduce() 类似,接收一个与 reduce() 接收的函数签名相同的函数,再加上一个 “初始值”来作为每个分区第一次调用时的结果。例如 + 对应的 0, * 对应的 1,或拼接操作对应的空列表
collect() 函数可以用来获取整个 RDD 中的数据,但collect() 不能用在大规模数据集上,仅当整个数据集能在单台机器的内存中放得下时才能使用。
saveAsTextFile()、saveAsSequenceFile(),或者任意的其他行动操作来把 RDD 的数据内容以各种自带的格式保存起来。
默认情况下RDD的内容是临时的,但Spark提供了在RDD中持久化数据的机制。第一次调用动作并计算出RDD内容后,RDD的内容可以存储在集群的内存或磁盘上。这样下一次需要调用依赖该RDD的动作时,就不需要从依赖关系中重新计算RDD,数据可以从缓存分区中直接返回:
cached.cache()
cached.count()
cached.take(10)
在上述代码中,cache方法调用指示在下次计算RDD后,要把RDD存储起来。调用count会导致第一次计算RDD。采取(take)这个动作返回一个本地的Array,包含RDD的前10个元素。但调用take时,访问的是cached已经缓存好的元素,而不是从cached的依赖关系中重新计算出来的。
当Spark持久化存储一个RDD 时,计算出 RDD 的节点会分别保存它们所求出的分区数据。如果一个有持久化数据的节点发生故障,Spark会在需要用到缓存的数据时重算丢失的数据分区。Spark为持久化RDD定义了几种不同的机制,用不同的StorageLevel值表示。
rdd.cache()是rdd.persist(StorageLevel.MEMORY)的简写,它将RDD存储为未序列化的对象。
]]>###算法过程
快速排序 的思想很简单,整个排序过程只需要三步:
1 | public class QuickSort { //一次划分 |
1 | int Division(int a[],int left, int right) //分割 |
1 | function quickSort(arr){ |
1 | #!/usr/bin/python |
1 | qsort <- function(v) { |
1 | $ hexo new "My New Post" |
More info: Writing
1 | $ hexo server |
More info: Server
1 | $ hexo generate |
More info: Generating
1 | $ hexo deploy |
More info: Deployment
]]>