继续创造,加快成长!这是我参与「日新方案 10 月更文应战」的第4天,点击查看活动详情

定义问题

猜测下用户在未来能带来的收益。

LTV

这个被称为用户的生命周期价值(CLV:Customer Lifetime Value)或称为LTV(Lifetime Value),指的是每个用户(购买者、会员、运用者)在未来可能为该服务带来的收益总和。

机器学习:怎样用模型预测用户的生命周期价值?

适用范畴

对以广告、出售等动态现金流入的服务(例如App服务、会员网站、电子商务)是适当重要的营运参考数据。

  1. 了解产品用户实践价值。
  2. 基于大数据的CLV管理方法,最大化有价值用户的赢利,对有潜力的用户提高出售,甚至发掘其他“有价值的用户”。
  3. 给予行销人员广告投放方向。例如:取得一个用户的本钱不可高于CLV。

数据预处理

猜测收益当然需求用户的买卖数据,所以继续继续运用《机器学习:从数据中找到用户的RFM值》中的数据。

import pandas as pd # 导入Pandas
df_sales=pd.read_csv('/Users/wanghaifeng/Documents/零基础实战机器学习/geektime-main/获客关05/易速鲜花订单记载.csv')
df_sales.head()

机器学习:怎样用模型预测用户的生命周期价值?

跟着课程中运用头三个月的R、F、M这三个数值作为特征,一年的总消费额作为标签,做一个回归模型猜测出LTV。(这个是课程作者选的,至于为啥今后再研究

数据清洗

df_sales.drop_duplicates() #删去重复的数据行
# df_sales=df_sales.loc[df_sales['数量']>0] # 清洗掉数量小于等于0的数据
# df_sales.describe()

这儿说下问题:课程里的没有清洗数量小于0的脏数据,下面运用模型猜测出来的值比较美观,可是清洗掉就不好了,这个先放置,笔者学这个课程也是先对机器学习有个感觉,太纠结就走不下去了。

加上总价

df_sales['总价'] = df_sales['数量'] * df_sales['单价']  # 核算每单的总价

收拾数据集记载的时刻规模

import numpy as np # 导入NumPy
print('日期规模: %s ~ %s' % (df_sales['消费日期'].min(), df_sales['消费日期'].max()))
df_sales['消费日期'] = pd.to_datetime(df_sales['消费日期']) #转化日期格式
print('日期规模: %s ~ %s' % (df_sales['消费日期'].min(), df_sales['消费日期'].max()))

输出:

日期规模: 1/1/2021 10:11 ~ 9/9/2020 9:20
日期规模: 2020-06-01 09:09:00 ~ 2021-06-09 12:31:00

数据会集的时刻跨度是2020-06-01到2021-06-09,咱们想要的是一年的消费总额,所以剔除:

df_sales=df_sales.loc[df_sales['消费日期'] < '2021-06-01']
print('日期规模: %s ~ %s' % (df_sales['消费日期'].min(), df_sales['消费日期'].max()))

输出:

日期规模: 2020-06-01 09:09:00 ~ 2021-05-31 17:37:00

构建特征和标签

构建特征

特征只需求前三个月的数据:

df_sales_3m=df_sales[(df_sales.消费日期 > '2020-06-01')&(df_sales.消费日期 <= '2020-08-30')]
df_sales_3m.reset_index(drop=True)

特征提取:

df_user_LTV = pd.DataFrame(df_sales['用户码'].unique()) #生成以用户码为主键的结构
df_user_LTV.columns=['用户码'] #设定字段名
df_user_LTV.head()
df_R_value=df_sales_3m.groupby('用户码').消费日期.max().reset_index() #找到每个用户的最近消费日期,构建df_R_value对象
df_R_value.columns=['用户码','最近购买日期']
df_R_value['R值']=(df_R_value['最近购买日期'].max()-df_R_value['最近购买日期']).dt.days #核算最近日期与前次消费日期的天数
df_user_LTV=pd.merge(df_user_LTV,df_R_value[['用户码','R值']],on='用户码') #把前次消费距最新日期的天数(R值)兼并至df_user_LTV
df_F_value=df_sales_3m.groupby('用户码').消费日期.count().reset_index()
df_F_value.columns=['用户码','F值']
df_user_LTV=pd.merge(df_user_LTV,df_F_value[['用户码','F值']],on='用户码')
df_M_value=df_sales_3m.groupby('用户码').总价.sum().reset_index()
df_M_value.columns=['用户码','M值']
df_user_LTV = pd.merge(df_user_LTV, df_M_value, on='用户码') #把消费总额整合至df_user结构
df_user_LTV #显示用户表结构

机器学习:怎样用模型预测用户的生命周期价值?

构建标签

df_user_ly=df_sales.groupby('用户码')['总价'].sum().reset_index() #核算每个用户整年消费总额,构建df_user_ly
df_user_ly.columns=['用户码','年度LTV']
df_user_ly.head()
df_LTV=pd.merge(df_user_LTV,df_user_ly,how='left')
df_LTV

机器学习:怎样用模型预测用户的生命周期价值?

创立特搜集和标签集

创立特搜集

X=df_LTV.drop(['用户码','年度LTV'],axis=1) #特搜集
X.head()

机器学习:怎样用模型预测用户的生命周期价值?

创立标签集

y=df_LTV['年度LTV']
y.head()

机器学习:怎样用模型预测用户的生命周期价值?

拆分练习集、验证集和测验集

from sklearn.model_selection import train_test_split
# 先拆分练习集和其它集
X_train,X_rem,y_train,y_rem=train_test_split(X,y,train_size=0.7,random_state=36)
# 再把其它集拆分红验证集和测验集
X_valid,X_test,y_valid,y_test=train_test_split(X_rem,y_rem,test_size=0.5,random_state=36)

挑选算法创立模型

机器学习:怎样用模型预测用户的生命周期价值?

课程中运用最基本的线性回归模型、决策树模型和随机森林模型。

  • 线性回归:经过梯度下降找到最优的权重和模型偏置的最基本的回归算法。里,我会用它作为一个基准模型,把其它模型的成果与其相比较,来确认优劣。
  • 决策树算法:简单地说是从样本数据的特征特点中,经过学习简单的决策规矩,也便是咱们耳熟能详的IF ELSE规矩,来猜测方针变量的值。这个算法的核心是划分点的挑选和输出值的确认。

机器学习:怎样用模型预测用户的生命周期价值?
能够看到,这种算法是依据两个特征x1和x2的值,以及标签y的取值,对二维平面上的区域进行精准切割,以确认从特征到标签的映射规矩。依据树的深度和分叉时所挑选的特征的不同,咱们能够练习出许多颗不一样的树来。

  • 随机森林:便是由多棵决策树构成的集成学习算法。它既能用于分类问题,也能用于回归问题。并且无论是哪类问题,它都是相对优秀的算法。在练习模型的过程中,随机森林会构建多个决策树,假如处理的是分类问题,那么它的输出类别是由单个树输出的类别的众数而定;假如处理的是回归问题,那么它会对多棵树的猜测成果进行均匀。随机森林纠正了决策树过度拟合其练习集的问题,在许多情况下它都能有不错的体现。这儿的“过拟合”,其实便是说模型对练习集的模仿过头了,反而不太适合验证集和测验集。
from sklearn.linear_model import LinearRegression #导入线性回归模型
from sklearn.tree import DecisionTreeRegressor #导入决策树回归模型
from sklearn.ensemble import RandomForestRegressor #导入随机森林回归模型
model_lr=LinearRegression() #创立线性回归模型
model_dtr=DecisionTreeRegressor() # 创立决策树回归模型
model_rfr=RandomForestRegressor() #创立随机森林回归模型

练习模型

model_lr.fit(X_train,y_train) # 拟合线性回归模型
model_dtr.fit(X_train,y_train) # 拟合决策树模型
model_rfr.fit(X_train,y_train) # 拟合随机森林模型

评价模型

X_valid.iloc[2] # 随便挑选一个数据

输出:

R值       1.00
F值     154.00
M值    1427.73
Name: 163, dtype: float64
print('真值:', y_valid.iloc[2])  #线性回归模型猜测值
print('线性回归猜测值:', y_valid_preds_lr[2])  #线性回归模型猜测值
print('决策树猜测值:', y_valid_preds_dtr[2])  #决策树模型猜测值
print('随机森林猜测值:', y_valid_preds_rfr[2]) #随机森林模型猜测值

输出:

真值: 4432.43
线性回归猜测值: 7474.4181424883545
决策树猜测值: 4074.57
随机森林猜测值: 4282.643300000004

咱们还要用R2R2、MSE等评价目标在验证集上做整体评价,选运用R2R2

from sklearn.metrics import r2_score,mean_absolute_error
print('验证集上的R平方-线性回归:%0.4f' % r2_score(y_valid,model_lr.predict(X_valid)))
print('验证集上的R平方分数-决策树: %0.4f' % r2_score(y_valid, model_dtr.predict(X_valid)))
print('验证集上的R平方分数-随机森林: %0.4f' % r2_score(y_valid, model_rfr.predict(X_valid)))

输出:

验证集上的R平方-线性回归:0.4410
验证集上的R平方分数-决策树: 0.1209
验证集上的R平方分数-随机森林: 0.4538

能够看出随机森林树猜测能力好点。

可是0.4几说明拟合的其实不咋样。

import matplotlib.pyplot as plt #导入Matplotlib的pyplot模块
y_test_preds_rfr = model_rfr.predict(X_test) #用模型预随机森林模型猜测验证集
plt.scatter(y_test, y_test_preds_rfr) #猜测值和实践值的散点图
plt.plot([0, max(y_test)], [0, max(y_test_preds_rfr)],   color='gray', lw=1, linestyle='--') #绘图
plt.xlabel('实践值') #X轴
plt.ylabel('猜测值') #Y轴
plt.title('实践值 vs. 猜测值') #标题

机器学习:怎样用模型预测用户的生命周期价值?

参考/来历

客户生命周期价值

07|回归剖析:怎样用模型猜测用户的生命周期价值?