【視頻】支持向量機算法原理和Python用戶流失數(shù)據(jù)挖掘SVM實例
全文鏈接:http://tecdat.cn/?p=32604
原文出處:拓端數(shù)據(jù)部落公眾號
分析師:Bailey Zheng和Lijie?Zhang
即使是同一種植物,由于生長的地理環(huán)境的不同,它們的特征會有所差異。例如鳶尾花,可分為山鳶尾、雜色鳶尾、維吉尼亞鳶尾。
假設(shè)此時您得到了一朵鳶尾花,如何判斷它屬于哪一類呢?
支持向量機算法原理
·其主要思想是找到空間中的一個能夠?qū)⑺袛?shù)據(jù)樣本劃開的超平面,并且使得樣本集中所有數(shù)據(jù)到這個超平面的距離最短。
·支持向量機可以分為線性和非線性兩大類。
支持向量機的標(biāo)準(zhǔn):
非線性支持向量機
·高斯核:尺度參數(shù)gamma
·多項式核:階數(shù)degree
(線性支持向量機:正則化參數(shù)C) 調(diào)參
數(shù)據(jù)指標(biāo):
SL花尊長度(cm) ,SW花芎寬度(cm)PL花辨長度(cm),PW花瓣寬度(cm)鳶尾花種類: Iris Setosa;
Iris Versicolour;Iris Virginica
數(shù)據(jù)數(shù)量:共150個數(shù)據(jù)點
使用多項式核函數(shù)的非線性支持向量機訓(xùn)練分類模型
Python用戶流失數(shù)據(jù)挖掘:建立支持向量機、邏輯回歸、XGboost、隨機森林、決策樹、樸素貝葉斯模型和Kmeans用戶畫像
在今天產(chǎn)品高度同質(zhì)化的品牌營銷階段,企業(yè)與企業(yè)之間的競爭集中地體現(xiàn)在對客戶的爭奪上
“用戶就是上帝”促使眾多的企業(yè)不惜代價去爭奪盡可能多的客戶。但是企業(yè)在不惜代價發(fā)展新用戶的過程中,往往會忽視或無暇顧及已有客戶的流失情況,結(jié)果就導(dǎo)致出現(xiàn)這樣一種窘?jīng)r:一邊是新客戶在源源不斷地增加,而另一方面是辛辛苦苦找來的客戶卻在悄然無聲地流失。因此對老用戶的流失進行數(shù)據(jù)分析從而挖掘出重要信息幫助企業(yè)決策者采取措施來減少用戶流失的事情至關(guān)重要,迫在眉睫。
1.2 目的:
深入了解用戶畫像及行為偏好,挖掘出影響用戶流失的關(guān)鍵因素,并通過算法預(yù)測客戶訪問的轉(zhuǎn)化結(jié)果,從而更好地完善產(chǎn)品設(shè)計、提升用戶體驗。
1.3 數(shù)據(jù)說明:
此次數(shù)據(jù)是攜程用戶一周的訪問數(shù)據(jù),為保護客戶隱私,已經(jīng)將數(shù)據(jù)經(jīng)過了脫敏,和實際商品的訂單量、瀏覽量、轉(zhuǎn)化率等有一些差距,不影響問題的可解性。
2 讀取數(shù)據(jù)
#?顯示全部特征
df.head()
?3 切分?jǐn)?shù)據(jù)
#?劃分訓(xùn)練集,測試集
X_train,?X_test,?y_train,?y_test?=?train_test_split(X,?y,?test_size=0.2,?random_state=666)
3.1 理解數(shù)據(jù)
可以看到變量比較的多,先進行分類,除去目標(biāo)變量label,此數(shù)據(jù)集的字段可以分成三個類別:訂單相關(guān)指標(biāo)、客戶行為相關(guān)指標(biāo)、酒店相關(guān)指標(biāo)。
4 特征工程
#?用訓(xùn)練集進行數(shù)據(jù)探索
train?=?pd.concat([X_train,y_train],axis=1)
4.1 數(shù)據(jù)預(yù)處理
4.1.1 刪除不必要的列
X_train.pop("sampleid")
X_test.pop("sampleid")
train.pop("sampleid")
4.1.2 數(shù)據(jù)類型轉(zhuǎn)換
字符串類型的特征需要處理成數(shù)值型才能建模,將arrival和d相減得到"提前預(yù)定的天數(shù)",作為新的特征
#?增加列
#?將兩個日期變量由字符串轉(zhuǎn)換為日期格式類型
train["arrial"]?=?pd.to_datimetain["arrval"])
X_tst["arival"]?=?d.to_daetime(X_est["arival"])
#?生成提前預(yù)定時間列(衍生變量)
X_trin["day_adanced"]?=?(X_rain["arival"]-Xtrain["d"]).dt.days
##?刪除列
X_tran.dro(columns="d","arrivl"],inpace=True)
4.1.3 缺失值的變量生成一個指示啞變量
zsl?=?tain.isnll().sum()[tain.isnll(.sum()!=0].inex
4.1.4 根據(jù)業(yè)務(wù)經(jīng)驗填補空缺值?
ordernum_oneyear 用戶年訂單數(shù)為0 ,lasthtlordergap 11%用600000填充 88%用600000填充 一年內(nèi)距離上次下單時長,ordercanncelednum 用0填充 用戶一年內(nèi)取消訂單數(shù),ordercanceledprecent 用0t填充 用戶一年內(nèi)取消訂
單率 242114 242114 -為空 有2種情況 1:新用戶未下訂單的空-88.42% 214097 2.老用戶1年以上未消費的空 增加編碼列未下訂單新用戶和 1年未下訂單的老用戶
price_sensitive -0 ,中位數(shù)填充 價格敏感指數(shù),consuming_capacity -0 中位數(shù)填充 消費能力指數(shù) 226108 -為空情況 1.從未下過單的新用戶214097 2.12011個人為空原因暫不明確
uv_pre -24小時歷史瀏覽次數(shù)最多酒店歷史uv. cr_pre -0,中位數(shù)填充 -24小時歷史瀏覽次數(shù)最多酒店歷史cr -0,中位數(shù)填充 29397 -為空 1.用戶當(dāng)天未登錄APP 28633 2.剛上線的新酒店178 586 無uv,cr記錄 編碼添加 該APP剛上線的新酒店 764 29397
customereval_pre2 用0填充-24小時歷史瀏覽酒店客戶評分均值, landhalfhours -24小時內(nèi)登陸時長 -用0填充28633 -為空:用戶當(dāng)天未登錄APP 28633
hotelcr ,hoteluv -中位數(shù)填充 797
剛上新酒店 60 #未登錄APP 118
avgprice 0 填充一部分價格填充為0 近一年未下過訂單的人數(shù),cr 用0填充,
tkq?=?["hstoryvsit_7ordernm","historyviit_visit_detaipagenum","frstorder_b","historyvi
#?tbkq?=?["hitoryvsit_7dernum","hisryvisit_isit_detailagenum"]
X_train[i].fillna(0,inplace=True)
##?一部分用0填充,一部分用中位數(shù)填充
#?新用戶影響的相關(guān)屬性:ic_sniti,cosuing_cacity
n_l?=?picesensitive","onsmng_cpacty"]
fori?in?n_l
X_trini][Xra[X_trinnew_ser==1].idex]=0
X_est[i][X_test[X_test.nw_user==1].inex]=0
4.1.5 異常值處理
將customer_value_profit、ctrip_profits中的負(fù)值按0處理
將delta_price1、delta_price2、lowestprice中的負(fù)值按中位數(shù)處理
for?f?in?flter_two:
a?=?X_trin[].median()
X_tran[f][X_train[f]<0]=a
X_test[f][X_est[]<0]=a
tran[f][train[f]<0]=a
4.1.6 缺失值填充
趨于正態(tài)分布的字段,使用均值填充:businessrate_pre2、cancelrate_pre、businessrate_pre;偏態(tài)分布的字段,使用中位數(shù)填充.
def?na_ill(df):
for?col?in?df.clumns:
mean?=?X_trai[col].mean()
dfcol]=df[col].fillna(median)
return
##?衍生變量年成交率
X_train["onear_dalate"]=_tain["odernum_onyear"]/X_tran"visinum_onyar"]
X_st["onyardealae"]=X_st["orernum_neyear"]/Xtest[visitumonyear"]
X_al?=pd.nca([Xtin,Xtes)
#決策樹檢驗
dt?=?Decsionr(random_state=666)
pre=?dt.prdict(X_test)
pre_rob?=?dt.preicproa(X_test)[:,1]
pre_ob
4.2 數(shù)據(jù)標(biāo)準(zhǔn)化
scaler?=?MinMacaer()
#決策樹檢驗
dt?=?DeonTreasifi(random_state=666)
5 特征篩選
5.1 特征選擇-刪除30%列
X_test?=?X_test.iloc[:,sp.get_spport()]
#決策樹檢驗
dt?=?DecisonreeClssifie(random_state=666)
dt.fit(X_trin,y_tain)
dt.score(X_tst,y_est)
pre?=?dt.pdict(X_test)
pe_rob?=?dt.redicproba(X_test)[:,1]
pr_rob
uc(pr,tpr)
5.2 共線性/數(shù)據(jù)相關(guān)性
#共線性--嚴(yán)重共線性0.9以上,合并或刪除
d?=?Xtrai.crr()
d[d<0.9]=0?#賦值顯示高相關(guān)的變量
pl.fufsiz=15,15,dpi200)
ssheatp(d)
6 建模與模型評估
6.1 邏輯回歸
y_prob?=?lr.preictproba(X_test)[:,1]
y_pred?=?lr.predict(X_test
fpr_lr,pr_lr,teshold_lr?=?metris.roc_curve(y_test,y_prob)
ac_lr?=?metrcs.aucfpr_lr,tpr_lr)
score_lr?=?metrics.accuracy_score(y_est,y_pred)
prnt("模準(zhǔn)確率為:{0},AUC得分為{1}".fomat(score_lr,auc_lr))
prit("="*30
6.2 樸素貝葉斯
gnb?=?GasinNB()?#?實例化一個LR模型
gnb.fi(trai,ytran)?#?訓(xùn)練模型
y_prob?=?gn.pic_proba(X_test)[:,1]?#?預(yù)測1類的概率
y_pred?=?gnb.preict(X_est)?#?模型對測試集的預(yù)測結(jié)果
fpr_gnb,tprgnbtreshold_gb?=?metrics.roc_crve(ytesty_pob)?#?獲取真陽率、偽陽率、閾值
aucgnb?=?meic.aucf_gnb,tr_gnb)?#?AUC得分
scoe_gnb?=?merics.acuray_score(y_tes,y_pred)?#?模型準(zhǔn)確率
6.3 支持向量機
s?=SVkernel='f',C=,max_ter=10,randomstate=66).fit(Xtrain,ytrain)
y_rob?=?sc.decsion_untio(X_st)?#?決策邊界距離
y_ed?=vc.redit(X_test)?#?模型對測試集的預(yù)測結(jié)果
fpr_sv,tpr_vc,theshld_sv?=?mtris.rc_urv(y_esty_pob)?#?獲取真陽率、偽陽率、閾值
au_vc?=?etics.ac(fpr_sc,tpr_sv)?#?模型準(zhǔn)確率
scre_sv?=?metrics.ccuracy_sore(_tst,ypre)
6.4 決策樹
dtc.fit(X_tran,_raiproba(X_test)[:,1]?#?預(yù)測1類的概率
y_pred?=?dtc.predct(X_test?#?模型對測試集的預(yù)測結(jié)果
fpr_dtc,pr_dtc,thresod_dtc=?metrcs.roc_curvey_test,yprob)?#?獲取真陽率、偽陽率、閾值
6.5 隨機森林
c?=?RndoForetlassiir(rand_stat=666)?#?建立隨機森
rfc.it(X_tain,ytrain)?#?訓(xùn)練隨機森林模型
y_rob?=?rfc.redict_poa(X_test)[:,1]?#?預(yù)測1類的概率
y_pedf.pedic(_test)?#?模型對測試集的預(yù)測結(jié)果
fpr_rfc,tp_rfc,hreshol_rfc?=?metrcs.roc_curve(y_test,_prob)?#?獲取真陽率、偽陽率、閾值
au_fc?=?meris.auc(pr_rfctpr_fc)?#?AUC得分
scre_rf?=?metrcs.accurac_scor(y_tes,y_ped)?#?模型準(zhǔn)確率
6.6 XGboost
#?讀訓(xùn)練數(shù)據(jù)集和測試集
dtainxgbatrx(X_rai,yrain)
dtest=g.DMrx(Xtest
#?設(shè)置xgboost建模參數(shù)
paras{'booser':'gbtee','objective':?'binay:ogistic','evlmetric':?'auc'
#?訓(xùn)練模型
watchlst?=?(dtain,'trai)
bs=xgb.ran(arams,dtain,n_boost_round=500eva=watchlst)
#?輸入預(yù)測為正類的概率值
y_prob=bst.redict(dtet)
#?設(shè)置閾值為0.5,得到測試集的預(yù)測結(jié)果
y_pred?=?(y_prob?>=?0.5)*1
#?獲取真陽率、偽陽率、閾值
fpr_xg,tpr_xgb,heshold_xgb?=?metricsroc_curv(test,y_prob)
aucxgb=?metics.uc(fpr_gb,tpr_xgb?#?AUC得分
score_gb?=?metricsaccurac_sore(y_test,y_pred)?#?模型準(zhǔn)確率
print('模型準(zhǔn)確率為:{0},AUC得分為:{1}'.format(score_xgb,auc_xgb))
6.7 模型比較
plt.xlabel('偽陽率')
plt.ylabel('真陽率')
plt.title('ROC曲線')
plt.savefig('模型比較圖.jpg',dpi=400,?bbox_inches='tight')
plt.show()
6.8 重要特征
ea?=?pd.Sries(dct(list((X_trclumsfc.eatre_imortancs_))))
ea.srt_vlues(acedig=False
fea_s?=?(fa.srt_vauesacnding=alse)).idex
6.9 流失原因分析
cityuvs和cityorders值較小時用戶流失顯著高于平均水平,說明攜程平臺小城市的酒店信息缺乏,用戶轉(zhuǎn)向使用小城市酒店信息較全的競品導(dǎo)致用戶流失
訪問時間點在7點-19點用戶流失比例高與平均水平:工作日推送應(yīng)該避開這些時間點
酒店商務(wù)屬性指數(shù)在0.3-0.9區(qū)間內(nèi)用戶流失大于平均水平,且呈現(xiàn)遞增趨勢,說明平臺商務(wù)指數(shù)高的酒店和用戶期望有差距(價格太高或其他原因?), 商務(wù)屬性低的用戶流失較少
一年內(nèi)距離上次下單時長越短流失越嚴(yán)重,受攜程2015年5月-2016年1月爆出的負(fù)面新聞影響較大,企業(yè)應(yīng)該更加加強自身管理,樹立良好社會形象
消費能力指數(shù)偏低(10-40)的用戶流失較嚴(yán)重,這部分用戶占比50%應(yīng)該引起重視
價格敏感指數(shù)(5-25)的人群流失高于平均水平,注重酒店品質(zhì)
用戶轉(zhuǎn)化率,用戶年訂單數(shù),近1年用戶歷史訂單數(shù)越高,24小時內(nèi)否訪問訂單填寫頁的人群比例越大流失越嚴(yán)重,需要做好用戶下單后的追蹤體驗, 邀請?zhí)顚懭胱◇w驗,整理意見作出改進
提前預(yù)定天數(shù)越短流失越嚴(yán)重用戶一年內(nèi)取消訂單數(shù)越高流失越嚴(yán)重
6.10 建議:
考慮占取三四線城市和低端酒店范圍的市場份額
用戶易受企業(yè)負(fù)面新聞影響,建議企業(yè)勇于承擔(dān)社會責(zé)任,加強自身管理,提高公關(guān)新聞處理時效性,樹立品牌良好形像
在節(jié)假日前2-3周開始熱門景點酒店推送
做好酒店下單后的追蹤體驗,邀請?zhí)顚懭胱◇w驗,并整理用戶意見作出改進
7 客戶畫像
7.1 建模用戶分類
#?用戶畫像特征
user_feature?=?["decisiohabit_user,'starprefer','lastpvgap','sid',
'lernum",'historyvisit_visit_detaipagenum',
"onyear_dealrat
]
#?流失影響特征
fea_lis?=?["cityuvs",
"cityorders",
"h",
"businessrate_pre2"
#?數(shù)據(jù)標(biāo)準(zhǔn)化?Kmeans方法對正態(tài)分布數(shù)據(jù)處理效果更好
scaler?=?StanardScalr()
lo_atribues?=?pdDatarame(scr.fittransfrm(all_cte),columns=all_ce.coluns)
#?建模分類
Kmens=Means(n_cluste=2,rndom_state=0)?#333
Keans.fi(lot_attributes?#?訓(xùn)練模型
k_char=Kmenscluster_centers_?#?得到每個分類
plt.figure(figsize=(5,10))
7.2 用戶類型占比
types=['高價值用戶','潛力用戶']
ax.pie[1],?raius=0.,colors='w')
plt.savefig(用戶畫像.jpg'dpi=400,?box_inchs='tigh')
7.3 高價值用戶分析
占比19.02,訪問頻率和預(yù)定頻率都較高,消費水平高,客戶價值大,追求高品質(zhì),對酒店星級要求高,客戶群體多集中在老客戶中,
建議:
多推薦口碑好、性價比高的商務(wù)酒店連鎖酒店房源吸引用戶;
在非工作日的11點、17點等日間流量小高峰時段進行消息推送。
為客戶提供更多差旅地酒店信息;
增加客戶流失成本:會員積分制,推出會員打折卡
7.4 潛力用戶分析
占比:80.98% 訪問頻率和預(yù)定頻率都較低,消費水平較低,對酒店星級要求不高,客戶群體多集中在新客戶中,客戶價值待挖掘 建議:
因為新用戶居多,屬于潛在客戶,建議把握用戶初期體驗(如初期消費有優(yōu)惠、打卡活動等),還可以定期推送實惠的酒店給此類用戶,以培養(yǎng)用戶消費慣性為主;
推送的內(nèi)容應(yīng)多為大減價、大酬賓、跳樓價之類的;
由于這部分用戶占比較多,可結(jié)合該群體流失情況分析流失客戶因素,進行該群體市場的開拓,進一步進行下沉分析,開拓新的時長。
關(guān)于作者
在此對Bailey Zheng和Lijie?Zhang對本文所作的貢獻表示誠摯感謝。Lijie?Zhang熟悉機器學(xué)習(xí) sklearn, xgboost 等庫進行數(shù)據(jù)挖掘和數(shù)據(jù)建模。Bailey擅長計量經(jīng)濟、機器學(xué)習(xí)。
若您是個人學(xué)習(xí)者或培訓(xùn)負(fù)責(zé)人,希望學(xué)習(xí)拓端的線上/線下課程, 欲了解更多拓端學(xué)堂課程及信息,請點擊文末“閱讀原文”咨詢。 ?
最受歡迎的見解
1.PYTHON用戶流失數(shù)據(jù)挖掘:建立邏輯回歸、XGBOOST、隨機森林、決策樹、支持向量機、樸素貝葉斯模型和KMEANS聚類用戶畫像
2.R語言基于樹的方法:決策樹,隨機森林
3.python中使用scikit-learn和pandas決策樹
4.機器學(xué)習(xí):在SAS中運行隨機森林?jǐn)?shù)據(jù)分析報告
5.R語言用隨機森林和文本挖掘提高航空公司客戶滿意度
6.機器學(xué)習(xí)助推快時尚精準(zhǔn)銷售時間序列
7.用機器學(xué)習(xí)識別不斷變化的股市狀況——隱馬爾可夫模型的應(yīng)用
8.python機器學(xué)習(xí):推薦系統(tǒng)實現(xiàn)(以矩陣分解來協(xié)同過濾)
9.python中用pytorch機器學(xué)習(xí)分類預(yù)測銀行客戶流失