最近忙着赶global comm的deadline无暇比赛,当有功夫回过头来看的时候发现比赛已经夹杂了很多非技术的因素在里面了,就连我这个本来是写博客拉粉丝的也有点小不爽。本着我的初心是写博客拉粉丝,我还是再写一弹。

鉴于我一直感觉LR会出奇迹,这两天开始转型LR,这里介绍一下最基本的LR思路,可以帮助不懂LR的同学上个手,只靠这个指南肯定不会有什么好成绩,不过可以为未来的扩展打下一个基础。用的是最naive的做法,了解的大神们可以绕道了。

LR其实可以指两种算法linear regressionlogistic regression,其实两者本质上都是线性模型。前者一般用来做数值预测比如房价会涨到多少,明天股票指数是多少;后者一般用来做分类,比如肿瘤是良性还是恶性,明天会不会下雨。尽管机器学习领域还有很多神奇的算法,但是很多情况下这两个LR就可以大杀四方了。一些论文很花哨深度学习现在也很热,但很多时候,工业界用的还是这种简单的模型。

具体到这个比赛上,很明显这是一个分类问题,我们要对每个商家根据用户四个月的行为判断用户下个月到底是买还是不买,就要用到logistic regression。这里简要介绍一下LR的工作形式,输入是一组特征和特征对应的target,得到的结果是特征和最后target的关系,即一组系数。

举个栗子来说:我选取了两个特征,分别是前三个月用户对这个商家的浏览数和购买数,那我的target就是下个月我有没有买这个商家的东西。如果一个人,浏览了5次,购买了2次,下个月买了,就是[5, 2, 1];如果没有买就是[5, 2, 0]。我们给LR算法输入的训练集就是这样一些东西,而LR输出的就是一组浏览和购买与买或不买之间的系数关系。这样再给一个浏览4购买3的行为你就可以对他是否会买这个东西利用lr的公式得出一个在0和1之间的一个分数,越接近1说明买的概率越大。

其实LR的目的就是自动求出特征和结果之间的系数关系,你所专注的应该是找模型以及和模型匹配的特征而不是人工的去找系数关系,这个系数寻找的过程其实才是所有机器学习的模型中算法要干的事情。如果你只是一味的手工调参数的话可以说你根本没用机器学习的方法。

到具体的LR的实现上,主要分为三步。第一步构建训练集合,也就是标记一部分正样本和负样本数据,针对这个比赛来说就是找到一批前几个月和用户与之发生交互,并且下一个月购买了的行为作为正样本(一定要发生过交互),再找一批发生交互但下一个月没有购买的行为作为负样本(注意控制正负样本的比例)。第二步将这些采样的样本放入logistic regression 的计算模型中得到浏览和购买对用户下个月行为的系数关系,这一步可以用现成的库去实现。第三步就是用这些系数关系来预测那些没有标记的行为会不会产生购买行为。

理想情况下可以针对每个商家每个用户各自构建模型,但是出于入门的目的,暂且用一套模型来处理所用用户和商家。

简单的写一下第二和第三部分的代码,其实真到用机器学习算法这一部分是很简单的,并不像有些同学想象的那样难。博主继续用python需要安装pandas和statsmodels两个库可能还需要用到numpy,linux下用pip或者apt-get都可以装上,安装的步骤就自行google了。

import pandas as pd
import statsmodels.api as sm #这就是要安装的两个库,import进来 train = pd.read_csv("sample.csv") #sample的格式是target,view_num,buy_num即你标记好的训练集,记得第一行一定要是标题
train_cols = train.columns[1:] #以第一列以后的列,即二三列作为训练特征,就是以view_num和buy_num为训练特征
logit = sm.Logit(train['target'], train[train_cols]) #表示以后两列作为训练特征,target列为标记值进行逻辑回归
result = logit.fit() #要是开心的话可以用result.summary()看一下回归结果 combos = pd.read_csv("vectors.csv") #vectors是未标记的特征向量,也就是我们要预测的,格式为uid,bid,view_num,buy_num
train_cols = combos.columns[2:]
combos['prediction'] = result.predict(combos[train_cols]) #为每组特征进行预测打分,存储在一个新的prediction列,这里是第五列 predicts = defaultdict(set)
for term in combos.values:
uid, bid, prediction = str(int(term[0])), str(int(term[1])), term[4]
if prediction > POINT: #可以通过调节POINT的大小来控制最后结果的个数,当然你也可以取分数topN
predicts[uid].add(bid)

上面的代码主要是参考了Logistic Regression in Python这篇博客进行了化简。更多的用法可以参考这篇博客。

可以看到算法的具体使用还是很简单的,所以麻烦的不是算法本身,麻烦的其实是考察每个算法模型,并对每个算法模型构建合适的特征去采样构建训练集。我构建训练集的代码可要比这个长的多的多了。大部分的分类算法的形式都是类似的,基本上都是上述的三个步骤,大家一个跑通了后其他的算法应该就会轻车熟路了。

用着两个最基本特征训练的结果虽说离进榜还比较远,不过成绩在我看来还是不错的,LR的威力果然很大,毕竟我们采用两个特征,购物车收藏夹也没考虑时间因素也没考虑,大家可以自己尝试着加上去,应该会有不错的结果。或者还能考虑把用户聚类或者把商家聚类,对每一类建立一个模型,结果肯定也会比现在好。LR的扩展性还是很好的,剩下的就看大家怎么挖掘特征了。不过算法的最好效果怎样就不好说了,因为训练的数据太少了,特征加多了很容易over fitting。

PS:LR真的是大杀器,建议如果是想通过比赛来进入机器学习这个领域的同学可以把比赛放一放好好研究一下NG的machine learning基本上看完logistic regression就会对这个算法有个比较直观的了解。嗯我是NG老师的脑残粉,但是NG老师讲完LR后会说你凭借LR就可以秒掉硅谷大部分的data analyst这件事你不要太当真

转载地址:http://oilbeater.com/%E9%98%BF%E9%87%8C%E5%A4%A7%E6%95%B0%E6%8D%AE%E6%AF%94%E8%B5%9B/2014/04/04/the-bigdata-race-3.html

阿里大数据竞赛非官方指南第三弹-- LR入门的更多相关文章

  1. 阿里大数据竞赛season1 总结

    关于样本测试集和训练集数量上,一般是选择训练集数量不小于测试集,也就是说训练集选取6k可能还不够,大家可以多尝试得到更好的效果: 2. 有人提出归一化方面可能有问题,大家可以查查其他的归一化方法,但是 ...

  2. GitHub 干货 | 各大数据竞赛 Top 解决方案开源汇总

    AI 科技评论编者按:现在,越来越多的企业.高校以及学术组织机构通过举办各种类型的数据竞赛来「物色」数据科学领域的优秀人才,并借此激励他们为某一数据领域或应用场景找到具有突破性意义的方案,也为之后的数 ...

  3. Kaggle大数据竞赛平台入门

    Kaggle大数据竞赛平台入门 大数据竞赛平台,国内主要是天池大数据竞赛和DataCastle,国外主要就是Kaggle.Kaggle是一个数据挖掘的竞赛平台,网站为:https://www.kagg ...

  4. "大中台、小前台”新架构下,阿里大数据接下来怎么玩? (2016-01-05 11:39:50)

    "大中台.小前台”新架构下,阿里大数据接下来怎么玩?_炬鼎力_新浪博客 http://blog.sina.com.cn/s/blog_1427354e00102vzyq.html " ...

  5. 阿里大数据比赛sesson2_RF&GBRT(下)

    -----------__-----------接上文---------__---------- 2.Xlab RF上手 2.1.训练特征表准备 训练的特征表gbrt_offline_section_ ...

  6. 阿里大数据产品Dataphin上线公共云,将助力更多企业构建数据中台

    日前,由阿里数据打造的智能数据构建与管理Dataphin,重磅上线阿里云-公共云,开启智能研发版本的公共云公测!在此之前,Dataphin以独立部署方式输出并服务线下客户,已助力多家大型客户高效自动化 ...

  7. 大数据竞赛平台——Kaggle 入门

    Reference: http://blog.csdn.net/witnessai1/article/details/52612012 Kaggle是一个数据分析的竞赛平台,网址:https://ww ...

  8. 大数据竞赛平台——Kaggle 入门篇

    这篇文章适合那些刚接触Kaggle.想尽快熟悉Kaggle并且独立完成一个竞赛项目的网友,对于已经在Kaggle上参赛过的网友来说,大可不必耗费时间阅读本文.本文分为两部分介绍Kaggle,第一部分简 ...

  9. 转:[大数据竞赛]协同过滤在这个问题上是否work

    http://bbs.aliyun.com/read/154433.html?spm=5176.7189909.0.0.gzyohy&fpage=2 看到主办方之前发的一篇文章里提到,这个购买 ...

随机推荐

  1. sqlmap使用教程(超详细)

    -u 指定目标URL (可以是http协议也可以是https协议) -d 连接数据库 --dbs 列出所有的数据库 --current-db 列出当前数据库 --tables 列出当前的表 --col ...

  2. Android学习11

    Android存储概念 File内部存储 通过file=openFileOutput()获得,将数据存储在data/data/+包名+files下面. layout布局文件: <?xml ver ...

  3. bit Buffer

    在音频流解析过程中,常常会涉及到顺序读取某些bit的操作. #include<stdio.h> typedef struct _BIT_BUF { unsigned char buffer ...

  4. C#中的循环:while do...while for

    循环:重复将相同或类似规律的代码进行反复执行 减少代码冗余  可维护  可扩展 while(bool) { ...; } 代码块中可以使用break或者continue中断 break:中断整个循环 ...

  5. LinuxC下argv,argc[]的意义

    MarkdownPad Document *:first-child { margin-top: 0 !important; } body>*:last-child { margin-botto ...

  6. async 异步协程进阶

    协程通过 async/await 语法进行声明,是编写异步应用的推荐方式 例如新定义一个协程(coroutine object): async def foo(): return 42 首先先来介绍下 ...

  7. matplotlib动态图subplots()和subplot()不同及参数

    一.fig,ax = subplots(nrows,ncols,sharex,sharey,squeeze,subplot_kw,gridspec_kw,**fig_kw)  创建画布和子图 nrow ...

  8. 聊聊Redis的持久化

    两种持久化策略 1.AOF:记录每一次的写操作到日志上,重启时重放日志以重建数据2.RDB:每隔一段时间保存一次当前时间点上的数据快照    快照就是一次又一次地从头开始创造一切3.可以关闭持久化4. ...

  9. mcast_get_loop函数

    #include <errno.h> #include <net/if.h> #include <sys/socket.h> #include <netine ...

  10. flex布局构建大屏框架并支持翻页动画、滚动表格功能

      本文将利用flex属性构建大屏可视化界面.界面主要分标题栏.工具栏.数据可视化窗口.其中,翻页动画以及滚动表格功能分别分布在数据可视化界面两侧. 鼠标点击标题,可看到左侧窗口翻转动画: 整体布局效 ...