1. 程式人生 > >LogisticRegression使用者流失預測模型初探【推薦】

LogisticRegression使用者流失預測模型初探【推薦】

什麼是邏輯迴歸?

Logistic迴歸與多重線性迴歸實際上有很多相同之處,最大的區別就在於它們的因變數不同,其他的基本都差不多。正是因為如此,這兩種迴歸可以歸於同一個家族,即廣義線性模型(generalizedlinear model)。

這一家族中的模型形式基本上都差不多,不同的就是因變數不同。

  • 如果是連續的,就是多重線性迴歸;
  • 如果是二項分佈,就是Logistic迴歸;
  • 如果是Poisson分佈,就是Poisson迴歸;
  • 如果是負二項分佈,就是負二項迴歸。

Logistic迴歸的因變數可以是二分類的,也可以是多分類的,但是二分類的更為常用,也更加容易解釋。所以實際中最常用的就是二分類的Logistic迴歸。

Logistic迴歸的主要用途:

  • 尋找危險因素:尋找某一疾病的危險因素等;
  • 預測:根據模型,預測在不同的自變數情況下,發生某病或某種情況的概率有多大;
  • 判別:實際上跟預測有些類似,也是根據模型,判斷某人屬於某病或屬於某種情況的概率有多大,也就是看一下這個人有多大的可能性是屬於某病。

Logistic迴歸主要在流行病學中應用較多,比較常用的情形是探索某疾病的危險因素,根據危險因素預測某疾病發生的概率,等等。例如,想探討胃癌發生的危險因素,可以選擇兩組人群,一組是胃癌組,一組是非胃癌組,兩組人群肯定有不同的體徵和生活方式等。這裡的因變數就是是否胃癌,即“是”或“否”,自變數就可以包括很多了,例如年齡、性別、飲食習慣、幽門螺桿菌感染等。自變數既可以是連續的,也可以是分類的。

分析主題?分析目的?分析結論?

最近學了Python的sklearn,結合實際使用者,想建立使用者流失預測模型。網上查了很多資料,針對使用者流失預警模型採用決策樹,邏輯迴歸演算法比較多,當然也有使用SVM,貝葉斯演算法。下面就是我根據自己工作中的一個產品作為主題,預測其使用者流失與留存。流失=上個月有消費,本月無消費表流失(其實也是消費流失啦)。資料週期使用的是一兩個月來做分析,什麼情況下使用者會消費流失?於是挑選了一些指標特徵來做分析,比如上個月的消費次數、最近的消費時間(可量化),消費金額,rmf這個原理還是有一個分析依據的。當然還有其他特徵如,使用者觀看總時長、使用者活躍天數、停留時長、啟動次數、等。

import pandas as pd
df=pd.read_csv('DL135667_RESULT.csv')
df_data=df.loc[:,['pay_times','pay_r','pay','all_dr','all_ndt']]
df_target=df.loc[:,['is_lost']]
X= df_data.as_matrix()
Y=df_target.as_matrix()
特徵工程:程式碼忽略,這個在資料收集和清理後已做了些分析。

針對上面選擇的指標,利用決策樹模型查下看看特徵在分類中起到的作用大

from sklearn.ensemble import ExtraTreesClassifier
x_train,x_test,y_train,y_test=train_test_split(X,Y,test_size=0.2) 
#利用資訊熵作為劃分標準,對決策樹進行訓練,這裡做了些測試,深度設定為7效果比較好。 
clf=tree.DecisionTreeClassifier(criterion='entropy',max_depth=7)   
clf.fit(x_train,y_train)
#把決策樹寫入檔案  
	if os.path.isdir(u'D:\\sklearn測試庫'):  
		pass  
	else:  
		os.makedirs(u'D:\\sklearn測試庫')  
	with open(u'D:\\sklearn測試庫\\決策結果.txt','w') as  f:  
		f=tree.export_graphviz(clf,out_file=f)  
	print(u'打印出特徵') 
expected = y_test
predicted = clf.predict(x_test)
#預測情況,精確率,召回率,f1分數等
print(metrics.classification_report(expected, predicted))
	print(metrics.confusion_matrix(expected, predicted)) 


from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import ExtraTreesClassifier
#logisticrgression邏輯迴歸
lg_model = LogisticRegression(penalty='l2',C=1000)
a_normalized = normalize(scale(X), norm='l2')  #資料標準化正則化
#特徵對模型分類重要程度
	model = ExtraTreesClassifier()
	model.fit(a_normalized,Y)
	print('feature_importances:')
	print(model.feature_importances_)
#pca降維,該方法是測試下降維的效果
pca = decomposition.PCA(n_components=2)
a_pca = pca.fit_transform(a_normalized)
lx_train,lx_test,ly_train,ly_test=train_test_split(a_pca,Y,test_size=0.2) 
lg_model.fit(lx_train, ly_train)
lexpected = ly_test
predicted = lg_model.predict(lx_test)
print(metrics.classification_report(lexpected, predicted))
print(metrics.confusion_matrix(lexpected, predicted))	

交叉認證分#scores = cross_validation.cross_val_score(clf, raw data, raw target, cv=5, score_func=None).clf是不同的分類器,可以是任何的分類器。比如支援向量機分類器。clf = svm.SVC(kernel='linear', C=1)cv引數就是代表不同的cross validation的方法了。如果cv是一個int數字的話,並且如果提供了raw target引數,那麼就代表使用StratifiedKFold分類方式,如果沒有提供raw target引數,那麼就代表使用KFold分類方式。cross_val_score函式的返回值就是對於每次不同的的劃分raw data時,在test data上得到的分類的準確率。至於準確率的演算法可以通過score_func引數指定,如果不指定的話,是用clf預設自帶的準確率演算法。

#交叉驗證
scores = cross_validation.cross_val_score(lg_model, a_pca, Y,cv=5)#score_func=metrics.f1_score 可選擇指標引數,預設自帶的準確率演算法。
print scores