您的位置:首页 > 其它

流失预警模型--实时查询

2014-02-25 13:50 323 查看
本篇主要做的是一个流失预警模型实时查询的一个测试,需求描述:用户名单请求判断是否流失,秒级内返回判断结果。

操作场景如下:


流失预警模型,预测用户是否在未来一段时间内流失(牵涉到流失定义,用户活跃度定义,用户行为时间定义等)建立,用到了用户最近行为特征、行为趋势特征等,最后预测是否流失(1流失,0留存)。在本文的测试之前已经把模型建好。
实验条件:ubuntu13.0432位,mysql,mysqldb,scikit-learn1.4

安装Mysql
sudoapt-getinstallmysql-client-core-5.5
sudoapt-getinstallmysql-server

安装python访问mysql的ODBC
sudoapt-getinstallpython-mysqldb//python操作mysql

登陆mysql创建仓库datamining,创建classification表,上传用户的行为数据,实验中是2844900*24个字段(上传数据的时候,要用mysql--local-infile=1-uroot-p登陆,因为需要从本地上传)

安装scikit-learn1.4

sudoapt-getinstallbuild-essentialpython-devpython-numpypython-setuptoolspython-scipylibatlas-devlibatlas3-base

sudoapt-getinstallpython-sklearn


Scikit-learn是用python写的机器学习算法库,里面算法非常多,而且文档清晰而且完整,API的调用接口都很类似,用起来非常方便。

实测测试描述:随机生成一个用户ID,通过ID去mysql查询该ID的行为特征,然后把该ID的行为通过scikit-learn预先生成好的模型测试,最后返回流失概率结果

代码如下

#-*-coding:cp936-*-

fromsklearn.ensembleimportRandomForestClassifier

importcsv_io

importtime,random

fromsklearn.externalsimportjoblib

fromMySQLdbimport*


userNum=1#随机产生用户ID

sample=[str(i)foriinxrange(2844900)]

index=random.sample(sample,userNum)

fw=open('user.txt','w')

fw.writelines('\n'.join(index))

fw.close()


print"测试开始"

#计时

old=time.time()

#加载预先生成好的模型

rf=joblib.load('/home/kobe/datamining/model/dt.pkl')

new=time.time()

time_model=new-old


#查询数据

f=open('user.txt')

index=[i.strip()foriinf.readlines()]

index='\''+'\',\''.join(index)+'\''

command="select*fromclassificationwhereyyuidin(%s);"%(index)


cn=Connection('localhost','root','*******','datamining')#ip地址,用户名,密码,仓库名字

cur=cn.cursor()

cur.execute(command)#执行命令

rows=cur.fetchall()#取回结果

test=[i[1:]foriinrows]

cur.close()

cn.close

old=time.time()


time_file=old-new


#通过测试

predicted_probs=rf.predict_proba(test)

predicted_probs=["%f"%x[1]forxinpredicted_probs]

new=time.time()

time_result=new-old


#把流失概率写回文件

csv_io.write_delimited_file("result.csv",predicted_probs)

time_write=time.time()-new


#完成

print"Done!"

print"加载模型",time_model

print"查询数据",time_file

print"模型测试",time_result

print"写入结果",time_write

print"总耗时",time_model+time_file+time_result+time_write


最后测试了3种算法,算法都使用了默认参数,结果如下,单位是秒

加载模型时间

数据查询时间

模型测试时间

写入结果时间

前4项总时间

决策树算法

0.086

0.074

0.0096

0.000590

0.1710

随机森林

0.134

0.092

0.01303

0.000595

0.2397

逻辑回归

0.104

0.087

0.0118

0.0006

0.2034


总结:从表格结果上看主要的时间是耗在模型加载跟数据查询上。其中模型加载时间耗时占一半(优化方向:1)把模型一直cache到内存里,有没有什么方案实现?2)换别的编程语言。。),数据查询这一块,测试中在没有对classification表建索引的情况下也能有这个效率有点让我惊讶。当然生产环境下的实时不仅需要考虑这些,还要考虑用户请求的并发量,用户行为实时采集和计算(牵涉到流失计算那块),前端传ID的时间,结果返回时间等,有这方面经验的朋友请多拍拍砖,指教下。


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐