99999久久久久久亚洲,欧美人与禽猛交狂配,高清日韩av在线影院,一个人在线高清免费观看,啦啦啦在线视频免费观看www

熱線電話:13121318867

登錄
首頁大數(shù)據(jù)時代如何用python預(yù)測“命定的那個TA”什么時候住酒店?
如何用python預(yù)測“命定的那個TA”什么時候住酒店?
2020-05-25
收藏

如何預(yù)測“命定的那個TA”什么時候住酒店?

作者:野水晶體 

來源:livandata


看到這個題目,大家是否會有一些小小的想法?別鬧了!筆者是一個正經(jīng)人,討論的也是一個有關(guān)python的技術(shù)問題,哈哈~

每個人的行為都是有跡可循的,這些蛛絲馬跡可以作為預(yù)測的數(shù)據(jù)支持,有沒有想過一個人什么時候住酒店能夠被預(yù)測出來?筆者作為一個從事機器學(xué)習(xí)方面的程序員,對這一問題表示肯定,因為,如果不信就沒有工作了。

筆者以為:所謂預(yù)測即為通過歷史上遺留下來的蛛絲馬跡:行為、訂單甚至大廳門口的攝像頭,判斷某個人接下來的行為舉動。這樣的預(yù)測多少還是有些價值的,畢竟,人的想法是會通過行為表達出來,想法是漸變的,也就預(yù)示著行為存在一定的連續(xù)性。

試想一下,如果一個人或者一個公司能有客戶在某個地方的消費記錄,以及通過觀察分析發(fā)現(xiàn)客戶的基本特征數(shù)據(jù)量足夠大的情況下是否能夠預(yù)測出客人什么時候入住酒店呢?我想結(jié)論大家都知道了~

作為一個旁觀者和理論家(哈哈),我們來一起探討一下,什么樣的特征和模型能夠預(yù)測出客戶住酒店的時間?

有沒有一點小小激動,畢竟預(yù)測是在不確定性中尋找肯定~

01、酒店預(yù)測的價值 Value

有誰會關(guān)心酒店的預(yù)測結(jié)果呢?

如果你想到的是情感問題,哈哈,我想該讓你失望了,因為筆者是一個滿心工作的狂人。姑且將上面的人群算作一個吧,還會有誰呢?

1) 心系萬千客戶的大老板們;

2) 將驕傲賦予代碼的程序員們;

3) 天天接待客戶的銷售精英們;

4) 想盡奇招探索客戶的運營大佬們;

……

預(yù)測的價值在于能夠幫助決策者減少混亂,是否到店?什么時候到店?的基礎(chǔ)上實現(xiàn)客群的細(xì)分并在細(xì)分客群的思路下挖掘客戶更深入的價值。在大數(shù)據(jù)領(lǐng)域中,預(yù)測將會是大數(shù)據(jù)的核心價值。

02、預(yù)測的思路 Thoughts

什么樣的客戶會進入到我們的酒店呢?

客戶什么樣的行為預(yù)示著要來酒店了呢?

我想這是酒店運營或老板最關(guān)心的問題吧?

正如上文所言,一個好的預(yù)測是需要對歷史數(shù)據(jù)進行充分的解讀,然后基于數(shù)據(jù)特性進行模型的構(gòu)建,最終得到預(yù)測結(jié)果。

因此,我們需要分析一下什么樣的情況下才會發(fā)生酒店入住行為,以及入住時間受什么因素影響?

對于酒店的入住,往往受較多方面的影響:出差、旅游、走親訪友……

入住時間呢?影響入住時間的因素往往較為寬泛,比如:春夏秋冬季節(jié)時令、酒店所處城市、酒店附近交通的便利程度、天氣情況等等……

再結(jié)合酒店的定位、客戶的年齡、性別,以及從著裝、談吐定位出的薪資水平、社會階層等幾乎可以勾勒出一個較為完整的特征集合了。

基本特征如下:

如何預(yù)測“命定的那個TA”什么時候住酒店?

其中有些特征是需要進行線下錄入,或者邏輯推理完成,比如:入住目的,在華為公司附近的酒店,見到來自上海的華為員工,工作日獨身一人辦理入住,完全有理由相信,他來是出差的~

特征整理好之后我們就需要對模型有一個預(yù)判了:

首先這是一個連續(xù)值預(yù)測模型,我們姑且把時間轉(zhuǎn)化成連續(xù)值,預(yù)測到月日粒度就可以了。

常見的連續(xù)值預(yù)測模型有如下幾個:

1) 線性回歸;

2) 神經(jīng)網(wǎng)絡(luò)RNN等;

3) 決策樹融合線性回歸等;

4) ARIMA等時間序列模型;

每一種模型都會有他的優(yōu)勢和缺點,比如:線性回歸預(yù)測方便簡單,但是較難解決自相關(guān)的問題;神經(jīng)網(wǎng)絡(luò)能較好的擬合高維特性但是解釋性較差;ARIMA需要較強的融合時間因素等等。他們的優(yōu)缺點包括但不限于這些描述,有興趣的讀者可以深入了解一下。

本文筆者采用的是決策樹融合線性回歸GBDT+Ridge的建模方式,這一方式主要是受到GBDT+LR模型的啟發(fā),facebook構(gòu)建的GBDT+LR融合模型在點擊率預(yù)測中效果顯著,曾一度在各個公司中應(yīng)用,但是在連續(xù)值預(yù)測中多少會有一些不足,畢竟LR模型是一個用線性回歸實現(xiàn)的分類模型,曲線的調(diào)整會影響預(yù)測的效果。

GBDT+Ridge融合模型用嶺回歸替換掉了LR的部分,對應(yīng)功能上Ridge更適合進行連續(xù)值的預(yù)測。另外,Ridge可以通過添加約束條件以及懲罰系數(shù),限定預(yù)測范圍和解決多重共線性的問題,預(yù)測結(jié)果調(diào)整上具有一定程度的靈活性;

GBDT本身在決策樹方面有較好的名氣:

1) 其對特征值有較好的容忍性,數(shù)據(jù)有空值、異常值等情況下都可以有效運行;

2) 對較高維度的特征融合效果也較為突出,因為樹的特性,GBDT能夠有效的探索高維的特征特性,每一個樹狀分支都是對多個特征的高維度融合;

3) 由于其boosting的設(shè)計思路,不停的迭代優(yōu)化能夠迅速提升模型的準(zhǔn)確性;

所以GBDT從一出生就是明星算法。

但是其本身也存在一定的缺點:

1) 樹的每個分支都有一個維度相乘的效果,每個維度的變化都會引發(fā)整體的變化,因此其靈敏度較高,容易過擬合;

2) 無法較好的用在連續(xù)值預(yù)測上,GBDT本質(zhì)上還是一個分類算法;

而Ridge剛好彌補了這一問題,線性回歸Ridge中各個特征值是相加的,單個特征的變化對整體的影響較小,同時Ridge本身就是用來進行連續(xù)值預(yù)測的,又較好的解決了多重共線性的問題。

基于上面的考慮,筆者對兩個模型進行了融合,讓有情人終成眷屬。

如何預(yù)測“命定的那個TA”什么時候住酒店?

03、預(yù)測的實現(xiàn)邏輯 Logic

模型的預(yù)測基本上遵循數(shù)據(jù)建模的常規(guī)套路,我們借這個機會將流程進行一些梳理:

1) 特征清洗:數(shù)據(jù)的離散化、歸一化,缺失值填充,one_hot/WOE變化等;

2) 特征降維降維主要有兩方面原因,其一是維度之間有一些共線性,我們在訓(xùn)練過程中需要把對y值影響不大或者x之間相互影響的特征剔除掉;其二是當(dāng)我們用one_hot進行向量化變化之后,往往存在梯度爆炸等問題,為了解決這一問題,我們經(jīng)常用到的方法有:主成分分析、因子分析、決策樹篩選、相關(guān)系數(shù)計算、embedding、稀疏自編碼等;

3) 切分訓(xùn)練集和測試集:在訓(xùn)練集和測試集的切分中常用的方法有兩個:其一是按照一定比例隨機提取,比如:隨機2:8分,80%數(shù)據(jù)做訓(xùn)練集,20%數(shù)據(jù)做測試集,這一方法簡單高效,但是訓(xùn)練的準(zhǔn)確性較低;其二:K-fold切分,將數(shù)據(jù)集拆分成測試集和訓(xùn)練集之后,對訓(xùn)練集進行K折拆分,循環(huán)訓(xùn)練,循環(huán)驗證,可以有效防止過擬合的現(xiàn)象;

4) 構(gòu)建模型:模型的構(gòu)建正如上文提到的,我們使用的GBDT+Ridge融合模型,在建模過程中,需要格外小心模型的輸入和輸出數(shù)據(jù)格式,通常我們會把融合模型整合成一個函數(shù),那么對應(yīng)的參數(shù)作為輸入數(shù)據(jù)就需要做好格式對照;

5) 模型保存/使用:訓(xùn)練好的模型需要進行保存固話,這樣可以避免下次使用模型的時候重新訓(xùn)練,畢竟一次模型的訓(xùn)練需要較長的時間,固話模型的一些常用方法有:pickle、joblib等,對于一些深度學(xué)習(xí)的模型存在各自的方法,比如keras中的model.save();模型使用時也有對應(yīng)的方法,比如:joblib和pickle中的loads函數(shù),可以有效的還原訓(xùn)練好的模型,直接使用到生產(chǎn)環(huán)境中。

6) 訓(xùn)練結(jié)果驗證:訓(xùn)練結(jié)果需要進行比較才能知道好壞,我們通常會選擇多個模型,融合之后通過一定的指標(biāo)進行比較,常用的比較指標(biāo)有:F-score、AUC、ROC曲線等。

上面即為構(gòu)建模型的常規(guī)思路,在這樣的思路下,我們實現(xiàn)了酒店入住時間的預(yù)測,小小的滿足了一下宅男的臆想,看到這里估計會被我的技術(shù)折服吧,哈哈,小小調(diào)侃一下~

下面是作為程序員的必備課了,上代碼~

04、預(yù)測代碼 Code

預(yù)測代碼主要是基于下面的思路進行構(gòu)建的:

1)數(shù)據(jù)結(jié)構(gòu)為:

如何預(yù)測“命定的那個TA”什么時候住酒店?

2)文件結(jié)構(gòu)為:

如何預(yù)測“命定的那個TA”什么時候住酒店?

3) 對應(yīng)代碼為:

首先需要對代碼進行特征處理;

……

grd = GradientBoostingClassifier(n_estimators=60)# 調(diào)用one-hot編碼。grd_enc = OneHotEncoder()# 調(diào)用LR分類模型。# grd_lm = LogisticRegression()grd_lm = RidgeCV(alphas=[0.1, 1.0, 10.0])# 使用X_train訓(xùn)練GBDT模型,后面用此模型構(gòu)造特征grd.fit(train_X, train_y)# fit one-hot編碼器grd_enc.fit(grd.apply(train_X)[:, :, 0])# 使用訓(xùn)練好的GBDT模型構(gòu)建特征,然后將特征經(jīng)過one-hot編碼作為新的特征輸入到LR模型訓(xùn)練。# clf = grd_lm.fit(grd_enc.transform(grd.apply(X_train_lr)[:, :, 0]), y_train_lr)clf = grd_lm.fit(grd_enc.transform(grd.apply(X_train_lr)[:, :, 0]), y_train_lr)   # 線性回歸建模# 用訓(xùn)練好的LR模型對X_test做預(yù)測y_pred_grd_lm = grd_lm.predict(grd_enc.transform(grd.apply(test_X)[:, :, 0]))

……

其次需要進行數(shù)據(jù)匯總;

……

data_s = pd.merge(data_1_4, data_2_2, on='id', how='inner')data_s = pd.merge(data_s, data_3_4, on='id', how='inner')data_s = pd.merge(data_s, data_4_2, on='id', how='inner').drop_duplicates().reset_index()data_s = data_s.filter(regex="[^'index']")data_s.to_csv('data_s.csv', encoding="utf_8_sig")

……

最后就是驗證和使用;

grd = GradientBoostingClassifier(n_estimators=60)# 調(diào)用one-hot編碼。grd_enc = OneHotEncoder()# 調(diào)用LR分類模型。# grd_lm = LogisticRegression()grd_lm = RidgeCV(alphas=[0.1, 1.0, 10.0])# 使用X_train訓(xùn)練GBDT模型,后面用此模型構(gòu)造特征grd.fit(train_X, train_y)# fit one-hot編碼器grd_enc.fit(grd.apply(train_X)[:, :, 0])# 使用訓(xùn)練好的GBDT模型構(gòu)建特征,然后將特征經(jīng)過one-hot編碼作為新的特征輸入到LR模型訓(xùn)練。# clf = grd_lm.fit(grd_enc.transform(grd.apply(X_train_lr)[:, :, 0]), y_train_lr)clf = grd_lm.fit(grd_enc.transform(grd.apply(X_train_lr)[:, :, 0]), y_train_lr)   # 線性回歸建模# 用訓(xùn)練好的LR模型對X_test做預(yù)測y_pred_grd_lm = grd_lm.predict(grd_enc.transform(grd.apply(test_X)[:, :, 0]))

……

思路和python代碼都只是機器學(xué)習(xí)的引導(dǎo),算是建模的一個較為完整的流程,希望能夠?qū)Υ蠹矣兴鶐椭?,有興趣歡迎相互溝通~

數(shù)據(jù)分析咨詢請掃描二維碼

若不方便掃碼,搜微信號:CDAshujufenxi

數(shù)據(jù)分析師資訊
更多

OK
客服在線
立即咨詢
客服在線
立即咨詢
') } function initGt() { var handler = function (captchaObj) { captchaObj.appendTo('#captcha'); captchaObj.onReady(function () { $("#wait").hide(); }).onSuccess(function(){ $('.getcheckcode').removeClass('dis'); $('.getcheckcode').trigger('click'); }); window.captchaObj = captchaObj; }; $('#captcha').show(); $.ajax({ url: "/login/gtstart?t=" + (new Date()).getTime(), // 加隨機數(shù)防止緩存 type: "get", dataType: "json", success: function (data) { $('#text').hide(); $('#wait').show(); // 調(diào)用 initGeetest 進行初始化 // 參數(shù)1:配置參數(shù) // 參數(shù)2:回調(diào),回調(diào)的第一個參數(shù)驗證碼對象,之后可以使用它調(diào)用相應(yīng)的接口 initGeetest({ // 以下 4 個配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺檢測極驗服務(wù)器是否宕機 new_captcha: data.new_captcha, // 用于宕機時表示是新驗證碼的宕機 product: "float", // 產(chǎn)品形式,包括:float,popup width: "280px", https: true // 更多配置參數(shù)說明請參見:http://docs.geetest.com/install/client/web-front/ }, handler); } }); } function codeCutdown() { if(_wait == 0){ //倒計時完成 $(".getcheckcode").removeClass('dis').html("重新獲取"); }else{ $(".getcheckcode").addClass('dis').html("重新獲取("+_wait+"s)"); _wait--; setTimeout(function () { codeCutdown(); },1000); } } function inputValidate(ele,telInput) { var oInput = ele; var inputVal = oInput.val(); var oType = ele.attr('data-type'); var oEtag = $('#etag').val(); var oErr = oInput.closest('.form_box').next('.err_txt'); var empTxt = '請輸入'+oInput.attr('placeholder')+'!'; var errTxt = '請輸入正確的'+oInput.attr('placeholder')+'!'; var pattern; if(inputVal==""){ if(!telInput){ errFun(oErr,empTxt); } return false; }else { switch (oType){ case 'login_mobile': pattern = /^1[3456789]\d{9}$/; if(inputVal.length==11) { $.ajax({ url: '/login/checkmobile', type: "post", dataType: "json", data: { mobile: inputVal, etag: oEtag, page_ur: window.location.href, page_referer: document.referrer }, success: function (data) { } }); } break; case 'login_yzm': pattern = /^\d{6}$/; break; } if(oType=='login_mobile'){ } if(!!validateFun(pattern,inputVal)){ errFun(oErr,'') if(telInput){ $('.getcheckcode').removeClass('dis'); } }else { if(!telInput) { errFun(oErr, errTxt); }else { $('.getcheckcode').addClass('dis'); } return false; } } return true; } function errFun(obj,msg) { obj.html(msg); if(msg==''){ $('.login_submit').removeClass('dis'); }else { $('.login_submit').addClass('dis'); } } function validateFun(pat,val) { return pat.test(val); }