日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

【实战】用机器学习来提升你的用户增长:(三、预测客户的终生价值)

發(fā)布時(shí)間:2025/3/8 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【实战】用机器学习来提升你的用户增长:(三、预测客户的终生价值) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

作者:Bar?? KaramanFollow? ? ??編譯:ronghuaiyang

正文共:8484 字 13 圖

預(yù)計(jì)閱讀時(shí)間:25 分鐘

導(dǎo)讀

前一篇文章我們對(duì)客戶進(jìn)行了分群,但是我們還希望對(duì)每個(gè)客戶有一個(gè)量化的指標(biāo)來評(píng)價(jià),而終生價(jià)值就是一個(gè)非常好指標(biāo),今天給大家介紹什么是終生價(jià)值,如何構(gòu)建機(jī)器學(xué)習(xí)模型來預(yù)測(cè)客戶的終生價(jià)值。

前文回顧:

用機(jī)器學(xué)習(xí)來提升你的用戶增長(zhǎng):第一步,了解你的目標(biāo)

用機(jī)器學(xué)習(xí)來提升你的用戶增長(zhǎng):第二步,客戶分群

第三部分: 預(yù)測(cè)客戶的終生價(jià)值

在前一篇文章中,我們對(duì)客戶進(jìn)行了細(xì)分,找出了最好的客戶。現(xiàn)在是時(shí)候衡量我們應(yīng)該密切跟蹤的最重要的指標(biāo)之一了:客戶終生價(jià)值。

我們對(duì)客戶進(jìn)行投資(收購(gòu)成本、線下廣告、促銷、折扣等)以產(chǎn)生收入和盈利。當(dāng)然,這些行動(dòng)使一些客戶的終身價(jià)值超級(jí)有價(jià)值,但總有一些客戶拉低了利潤(rùn)率。我們需要識(shí)別這些行為模式,對(duì)客戶進(jìn)行細(xì)分并采取相應(yīng)的行動(dòng)。

計(jì)算終生價(jià)值是比較容易的部分。首先,我們需要選擇一個(gè)時(shí)間窗口。可以是3,6,12,24個(gè)月。由下式可知,在特定的時(shí)間段內(nèi),我們可以得到每個(gè)客戶的終身價(jià)值:

終身價(jià)值:總收入 - 總成本

這個(gè)等式給出了歷史的終生價(jià)值。如果我們看到一些客戶在歷史上具有非常高的負(fù)終生價(jià)值,那么采取行動(dòng)可能就太晚了。在這一點(diǎn)上,我們需要用機(jī)器學(xué)習(xí)來預(yù)測(cè)未來:

我們將建立一個(gè)簡(jiǎn)單的機(jī)器學(xué)習(xí)模型來預(yù)測(cè)我們客戶的終生價(jià)值

終生價(jià)值預(yù)測(cè)

對(duì)于這個(gè)例子,我們也將繼續(xù)使用我們的在線零售數(shù)據(jù)集。讓我們找到正確的道路:

  • 為客戶終生價(jià)值的計(jì)算定義一個(gè)合適的時(shí)間框架

  • 確定我們將用于預(yù)測(cè)未來的特征并構(gòu)造這些特征

  • 計(jì)算用于訓(xùn)練機(jī)器學(xué)習(xí)模型的終生價(jià)值(LTV)

  • 構(gòu)建并運(yùn)行機(jī)器學(xué)習(xí)模型

  • 檢查模型是否有用

確定時(shí)間框架實(shí)際上取決于你的行業(yè)、商業(yè)模式、戰(zhàn)略等等。對(duì)于一些行業(yè)來說,1年是很長(zhǎng)的一段時(shí)間,而對(duì)于另一些行業(yè)來說,1年是很短的一段時(shí)間。在我們的例子中,我們將繼續(xù)使用6個(gè)月。

每個(gè)客戶ID的RFM得分,我們?cè)谇耙黄恼轮杏?jì)算過,是特征集的完美候選。為了正確實(shí)現(xiàn)它,我們需要對(duì)數(shù)據(jù)集進(jìn)行劃分。我們使用3個(gè)月的數(shù)據(jù),計(jì)算RFM并使用它來預(yù)測(cè)未來6個(gè)月。因此,我們需要首先創(chuàng)建兩個(gè)dataframes并將RFM分?jǐn)?shù)加到它們里面。

#import?libraries from?datetime?import?datetime,?timedelta,date import?pandas?as?pd %matplotlib?inline from?sklearn.metrics?import?classification_report,confusion_matrix import?matplotlib.pyplot?as?plt import?numpy?as?np import?seaborn?as?sns from?__future__?import?division from?sklearn.cluster?import?KMeansimport?plotly.plotly?as?py import?plotly.offline?as?pyoff import?plotly.graph_objs?as?goimport?xgboost?as?xgb from?sklearn.model_selection?import?KFold,?cross_val_score,?train_test_splitimport?xgboost?as?xgb#initate?plotly pyoff.init_notebook_mode()#read?data?from?csv?and?redo?the?data?work?we?done?before tx_data?=?pd.read_csv('data.csv') tx_data['InvoiceDate']?=?pd.to_datetime(tx_data['InvoiceDate']) tx_uk?=?tx_data.query("Country=='United?Kingdom'").reset_index(drop=True)#create?3m?and?6m?dataframes tx_3m?=?tx_uk[(tx_uk.InvoiceDate?<?date(2011,6,1))?&?(tx_uk.InvoiceDate?>=?date(2011,3,1))].reset_index(drop=True) tx_6m?=?tx_uk[(tx_uk.InvoiceDate?>=?date(2011,6,1))?&?(tx_uk.InvoiceDate?<?date(2011,12,1))].reset_index(drop=True)#create?tx_user?for?assigning?clustering tx_user?=?pd.DataFrame(tx_3m['CustomerID'].unique()) tx_user.columns?=?['CustomerID']#order?cluster?method def?order_cluster(cluster_field_name,?target_field_name,df,ascending):new_cluster_field_name?=?'new_'?+?cluster_field_namedf_new?=?df.groupby(cluster_field_name)[target_field_name].mean().reset_index()df_new?=?df_new.sort_values(by=target_field_name,ascending=ascending).reset_index(drop=True)df_new['index']?=?df_new.indexdf_final?=?pd.merge(df,df_new[[cluster_field_name,'index']],?on=cluster_field_name)df_final?=?df_final.drop([cluster_field_name],axis=1)df_final?=?df_final.rename(columns={"index":cluster_field_name})return?df_final#calculate?recency?score tx_max_purchase?=?tx_3m.groupby('CustomerID').InvoiceDate.max().reset_index() tx_max_purchase.columns?=?['CustomerID','MaxPurchaseDate'] tx_max_purchase['Recency']?=?(tx_max_purchase['MaxPurchaseDate'].max()?-?tx_max_purchase['MaxPurchaseDate']).dt.days tx_user?=?pd.merge(tx_user,?tx_max_purchase[['CustomerID','Recency']],?on='CustomerID')kmeans?=?KMeans(n_clusters=4) kmeans.fit(tx_user[['Recency']]) tx_user['RecencyCluster']?=?kmeans.predict(tx_user[['Recency']])tx_user?=?order_cluster('RecencyCluster',?'Recency',tx_user,False)#calcuate?frequency?score tx_frequency?=?tx_3m.groupby('CustomerID').InvoiceDate.count().reset_index() tx_frequency.columns?=?['CustomerID','Frequency'] tx_user?=?pd.merge(tx_user,?tx_frequency,?on='CustomerID')kmeans?=?KMeans(n_clusters=4) kmeans.fit(tx_user[['Frequency']]) tx_user['FrequencyCluster']?=?kmeans.predict(tx_user[['Frequency']])tx_user?=?order_cluster('FrequencyCluster',?'Frequency',tx_user,True)#calcuate?revenue?score tx_3m['Revenue']?=?tx_3m['UnitPrice']?*?tx_3m['Quantity'] tx_revenue?=?tx_3m.groupby('CustomerID').Revenue.sum().reset_index() tx_user?=?pd.merge(tx_user,?tx_revenue,?on='CustomerID')kmeans?=?KMeans(n_clusters=4) kmeans.fit(tx_user[['Revenue']]) tx_user['RevenueCluster']?=?kmeans.predict(tx_user[['Revenue']]) tx_user?=?order_cluster('RevenueCluster',?'Revenue',tx_user,True)#overall?scoring tx_user['OverallScore']?=?tx_user['RecencyCluster']?+?tx_user['FrequencyCluster']?+?tx_user['RevenueCluster'] tx_user['Segment']?=?'Low-Value' tx_user.loc[tx_user['OverallScore']>2,'Segment']?=?'Mid-Value'? tx_user.loc[tx_user['OverallScore']>4,'Segment']?=?'High-Value'?

我們已經(jīng)創(chuàng)建好了我們的RFM評(píng)分,現(xiàn)在我們的特征集合如下:

既然我們的特征集已經(jīng)準(zhǔn)備好了,我們?yōu)槊總€(gè)客戶計(jì)算6個(gè)月的LTV,我們將使用這些LTV來訓(xùn)練我們的模型。

數(shù)據(jù)集中沒有成本。這就是為什么收入直接成為我們的LTV。

#calculate?revenue?and?create?a?new?dataframe?for?it tx_6m['Revenue']?=?tx_6m['UnitPrice']?*?tx_6m['Quantity'] tx_user_6m?=?tx_6m.groupby('CustomerID')['Revenue'].sum().reset_index() tx_user_6m.columns?=?['CustomerID','m6_Revenue']#plot?LTV?histogram plot_data?=?[go.Histogram(x=tx_user_6m.query('m6_Revenue?<?10000')['m6_Revenue']) ]plot_layout?=?go.Layout(title='6m?Revenue') fig?=?go.Figure(data=plot_data,?layout=plot_layout) pyoff.iplot(fig)

這段代碼計(jì)算LTV并繪制它的直方圖:

直方圖清楚地顯示我們有客戶的LTV為負(fù)。我們也有一些異常值。過濾掉異常值對(duì)于建立一個(gè)合適的機(jī)器學(xué)習(xí)模型是有意義的。

好的,下一個(gè)步驟。我們將合并我們的3個(gè)月和6個(gè)月的dataframes,以查看LTV和我們的特征集之間的相關(guān)性。

tx_merge?=?pd.merge(tx_user,?tx_user_6m,?on='CustomerID',?how='left') tx_merge?=?tx_merge.fillna(0)tx_graph?=?tx_merge.query("m6_Revenue?<?30000")plot_data?=?[go.Scatter(x=tx_graph.query("Segment?==?'Low-Value'")['OverallScore'],y=tx_graph.query("Segment?==?'Low-Value'")['m6_Revenue'],mode='markers',name='Low',marker=?dict(size=?7,line=?dict(width=1),color=?'blue',opacity=?0.8)),go.Scatter(x=tx_graph.query("Segment?==?'Mid-Value'")['OverallScore'],y=tx_graph.query("Segment?==?'Mid-Value'")['m6_Revenue'],mode='markers',name='Mid',marker=?dict(size=?9,line=?dict(width=1),color=?'green',opacity=?0.5)),go.Scatter(x=tx_graph.query("Segment?==?'High-Value'")['OverallScore'],y=tx_graph.query("Segment?==?'High-Value'")['m6_Revenue'],mode='markers',name='High',marker=?dict(size=?11,line=?dict(width=1),color=?'red',opacity=?0.9)), ]plot_layout?=?go.Layout(yaxis=?{'title':?"6m?LTV"},xaxis=?{'title':?"RFM?Score"},title='LTV') fig?=?go.Figure(data=plot_data,?layout=plot_layout) pyoff.iplot(fig)

下面的代碼合并了我們的特征集和LTV數(shù)據(jù),并繪制了LTV與總體RFM評(píng)分:

正相關(guān)是很明顯的。高RFM分?jǐn)?shù)意味著高LTV。

在建立機(jī)器學(xué)習(xí)模型之前,我們需要確定這個(gè)機(jī)器學(xué)習(xí)問題的類型。LTV本身是一個(gè)回歸問題。機(jī)器學(xué)習(xí)模型可以預(yù)測(cè)LTV的值。但在這里,我們想要LTV分群。因?yàn)樗尚?#xff0c;更容易與他人溝通。通過應(yīng)用K-means聚類,我們可以識(shí)別現(xiàn)有的LTV組并構(gòu)建分群。

考慮到這個(gè)分析的業(yè)務(wù)部分,我們需要根據(jù)預(yù)測(cè)的LTV來區(qū)別對(duì)待客戶。對(duì)于這個(gè)例子,我們將使用聚類,并聚成3個(gè)部分(部分的數(shù)量真的取決于你的業(yè)務(wù)動(dòng)態(tài)和目標(biāo)):

  • 低LTV

  • 中等LTV

  • 高LTV

我們將使用K-means聚類來確定分群并觀察它們的特征:

#remove?outliers tx_merge?=?tx_merge[tx_merge['m6_Revenue']<tx_merge['m6_Revenue'].quantile(0.99)]#creating?3?clusters kmeans?=?KMeans(n_clusters=3) kmeans.fit(tx_merge[['m6_Revenue']]) tx_merge['LTVCluster']?=?kmeans.predict(tx_merge[['m6_Revenue']])#order?cluster?number?based?on?LTV tx_merge?=?order_cluster('LTVCluster',?'m6_Revenue',tx_merge,True)#creatinga?new?cluster?dataframe tx_cluster?=?tx_merge.copy()#see?details?of?the?clusters tx_cluster.groupby('LTVCluster')['m6_Revenue'].describe()

我們已經(jīng)完成了LTV聚類,下面是每個(gè)分群的特點(diǎn):

2是最好的,平均LTV為8.2k,而0是最差的,為396。

在訓(xùn)練機(jī)器學(xué)習(xí)模型之前還有幾個(gè)步驟:

  • 需要做一些特征工程。

  • 我們應(yīng)該把類別列轉(zhuǎn)換成數(shù)字列。

  • 我們會(huì)根據(jù)我們的標(biāo)簽(LTV分群)檢查特征的相關(guān)性。

  • 我們把我們的特征集和標(biāo)簽(LTV)分解為X和y,我們使用X來預(yù)測(cè)y。

  • 創(chuàng)建訓(xùn)練和測(cè)試數(shù)據(jù)集。

  • 訓(xùn)練集將用于構(gòu)建機(jī)器學(xué)習(xí)模型。

  • 我們將把我們的模型應(yīng)用到測(cè)試集,看看它的實(shí)際性能。

下面的代碼為做了這些:

#convert?categorical?columns?to?numerical tx_class?=?pd.get_dummies(tx_cluster)#calculate?and?show?correlations corr_matrix?=?tx_class.corr() corr_matrix['LTVCluster'].sort_values(ascending=False)#create?X?and?y,?X?will?be?feature?set?and?y?is?the?label?-?LTV X?=?tx_class.drop(['LTVCluster','m6_Revenue'],axis=1) y?=?tx_class['LTVCluster']#split?training?and?test?sets X_train,?X_test,?y_train,?y_test?=?train_test_split(X,?y,?test_size=0.05,?random_state=56)

我們從第一行開始。**get_dummies()**方法將類別列轉(zhuǎn)換為0-1。用個(gè)例子看看它具體做了什么:

這是get_dummies()之前的數(shù)據(jù)集。我們有一個(gè)類別列,叫做segment。應(yīng)用get_dummies()后會(huì)發(fā)生什么:

segment列沒有了,但我們有新的數(shù)字列來表示它。我們已經(jīng)將它轉(zhuǎn)換為3個(gè)不同的列,其中包含0和1,并使其可用于我們的機(jī)器學(xué)習(xí)模型。

行的相關(guān)性我們有以下數(shù)據(jù):

我們發(fā)現(xiàn),3個(gè)月的Revenue, Frequency和RFM分?jǐn)?shù)將有助于我們的機(jī)器學(xué)習(xí)模型。

既然我們有了訓(xùn)練和測(cè)試集,我們可以構(gòu)建我們的模型。

#XGBoost?Multiclassification?Model ltv_xgb_model?=?xgb.XGBClassifier(max_depth=5,?learning_rate=0.1,objective=?'multi:softprob',n_jobs=-1).fit(X_train,?y_train)print('Accuracy?of?XGB?classifier?on?training?set:?{:.2f}'.format(ltv_xgb_model.score(X_train,?y_train))) print('Accuracy?of?XGB?classifier?on?test?set:?{:.2f}'.format(ltv_xgb_model.score(X_test[X_train.columns],?y_test)))y_pred?=?ltv_xgb_model.predict(X_test) print(classification_report(y_test,?y_pred))

我們使用了一個(gè)強(qiáng)大的ML庫(kù)XGBoost來為我們進(jìn)行分類。它是一個(gè)多分類模型,因?yàn)槲覀冇?個(gè)組,讓我們看看最初的結(jié)果:

測(cè)試集的正確率為84%,看起來非常好。是嗎?

首先,我們需要檢查基準(zhǔn)測(cè)試。最大的cluster 是0號(hào)cluster,占總數(shù)的76.5%。如果我們盲目地說每個(gè)客戶都屬于cluster 0,那么我們的準(zhǔn)確率將達(dá)到76.5%。84%對(duì)76.5%告訴我們,我們的機(jī)器學(xué)習(xí)模型是有用的,但肯定需要改進(jìn)。我們應(yīng)該找出模型的不足之處。我們可以通過查看分類報(bào)告來識(shí)別:

0號(hào)分群的精確度和召回是可以接受。例如,對(duì)于0號(hào)群體(低LTV),如果模型告訴我們?cè)摽蛻魧儆?號(hào)分群,那么100個(gè)客戶中有90個(gè)將是正確的(精確度)。該模型成功識(shí)別了93%的實(shí)際cluster 0的客戶(召回)。但是我們確實(shí)需要改進(jìn)其他分群的模型。例如,我們只檢測(cè)到56%的中端LTV客戶。可能采取的行動(dòng):

  • 增加更多的特征,改進(jìn)特征工程

  • 嘗試XGBoost以外的不同的模型

  • 對(duì)當(dāng)前模型使用超參數(shù)調(diào)整

  • 如有可能,向模型中添加更多數(shù)據(jù)

好了!現(xiàn)在我們有一個(gè)機(jī)器學(xué)習(xí)模型,可以預(yù)測(cè)未來客戶的LTV細(xì)分情況。我們可以很容易地在此基礎(chǔ)上調(diào)整我們的行動(dòng)。例如,我們絕對(duì)不想失去高LTV的客戶。因此,我們將在下一部分中關(guān)注客戶流失預(yù)測(cè)。

—END—

英文原文:https://towardsdatascience.com/data-driven-growth-with-python-part-3-customer-lifetime-value-prediction-6017802f2e0f

往期精彩回顧適合初學(xué)者入門人工智能的路線及資料下載機(jī)器學(xué)習(xí)在線手冊(cè)深度學(xué)習(xí)在線手冊(cè)AI基礎(chǔ)下載(pdf更新到25集)本站qq群1003271085,加入微信群請(qǐng)回復(fù)“加群”獲取一折本站知識(shí)星球優(yōu)惠券,復(fù)制鏈接直接打開:https://t.zsxq.com/yFQV7am喜歡文章,點(diǎn)個(gè)在看

總結(jié)

以上是生活随笔為你收集整理的【实战】用机器学习来提升你的用户增长:(三、预测客户的终生价值)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。