流失預警模型 實時查詢

2022-07-12 08:00:08 字數 3898 閱讀 6275

本篇主要做的是乙個流失預警模型實時查詢的乙個測試,需求描述:使用者名單請求判斷是否流失,秒級內返回判斷結果。

操作場景如下:

流失預警模型,**使用者是否在未來一段時間內流失(牽涉到流失定義,使用者活躍度定義,使用者行為時間定義等)建立,用到了使用者最近行為特徵、行為趨勢特徵等,最後**是否流失(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分鐘內三次及以上用不同賬號登入並領取優惠劵,並且過程中沒有瀏覽商品。達到以上要求則...