本篇主要做的是乙個流失預警模型實時查詢的乙個測試,需求描述:使用者名單請求判斷是否流失,秒級內返回判斷結果。
操作場景如下:
流失預警模型,**使用者是否在未來一段時間內流失(牽涉到流失定義,使用者活躍度定義,使用者行為時間定義等)建立,用到了使用者最近行為特徵、行為趨勢特徵等,最後**是否流失(1流失,0留存)。在本文的測試之前已經把模型建好。
實驗條件:ubuntu13.04 32位,mysql,
mysqldb,
scikit-learn1.4
安裝mysql
sudo apt-get install mysql-client-core-5.5
sudo apt-get install mysql-server
安裝python訪問mysql的odbc
sudo apt-get install python-mysqldb //python操作mysql
登陸mysql 建立倉庫datamining,建立classification表,上傳使用者的行為資料,實驗中是2844900*24個字段(上傳資料的時候,要用
mysql --local-infile=1 -u root -p 登陸,因為需要從本地上傳)
安裝scikit-learn 1.4
sudo apt-get install build-essential python-dev python-numpy python-setuptools python-scipy libatlas-dev libatlas3-base
sudo apt-get install python-sklearn
scikit-learn是用python寫的機器學習演算法庫,裡面演算法非常多,而且文件清晰而且完整,api的呼叫介面都很類似,用起來非常方便。
實測測試描述:隨機生成乙個使用者id,通過id去mysql查詢該id的行為特徵,然後把該id的行為通過scikit-learn預先生成好的模型測試,最後返回流失概率結果
**如下
# -*- coding: cp936 -*-
from sklearn.ensemble import randomforestclassifier
import csv_io
import time,random
from sklearn.externals import joblib
from mysqldb import *
usernum=1 #隨機產生使用者id
sample=[str(i) for i in xrange(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() for i in f.readlines()]
index='\''+'\',\''.join(index)+'\''
command="select * from classification where yyuid in (%s);" % (index)
cn=connection('localhost','root','*******','datamining') #ip位址,使用者名稱,密碼,倉庫名字
cur=cn.cursor()
cur.execute(command) #執行命令
rows=cur.fetchall() #取回結果
test = [i[1:] for i in rows]
cur.close()
cn.close
old=time.time()
time_file=old-new
#通過測試
predicted_probs = rf.predict_proba(test)
predicted_probs = ["%f" % x[1] for x in predicted_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的時間,結果返回時間等,有這方面經驗的朋友請多拍拍磚,指教下。
實時異常預警
線上業務的快速發展對系統穩定性提出了更高的要求。每次在系統出現異常波動時,如何及時 準確的發現並提醒業務方,顯得尤其重要。這裡有很關鍵的兩個要求 異常識別基於歷史資料,獲取當前時間點的可能數值範圍,當實際值在該範圍以外時,即認為資料異常。最最簡單的方式當然是當同比或環比變化超出某一閾值時,即認為資料...
客戶流失預警模型 資料預處理與特徵衍生
1 人為截斷,高於某一閾值的資料,統一等於某乙個數 2 刪除極端值 3 單獨建模型 1 完全隨機缺失 2 隨機缺失,依賴其他變數,如 配偶姓名 的缺失取決於 婚姻狀況 3 完全非隨機缺失 缺失值是由於本身缺陷導致,如年齡較低的信用卡辦卡人員不願意透露父母親的 1 刪除缺失值的屬性 2 插補填充 常用...
實時專案4 預警需求
實時預警,是一種經常出現在實時計算中的業務型別。根據日誌資料中系統報錯異常,或者使用者行為異常的檢測,產生對應預警日誌。預警日誌通過圖形化介面的展示,可以提醒監控方,需要及時核查問題,並採取應對措施。需求 同一裝置,5分鐘內三次及以上用不同賬號登入並領取優惠劵,並且過程中沒有瀏覽商品。達到以上要求則...