使用python创建RFM模型2—预测及推荐

本篇是使用python创建RFM模型的第二篇文章,在前一篇文章中我们根据用户的R表示最近一次消费(Recency),F表示消费频率(Frequency),M表示消费金额(Monetary)三个指标进行聚类建立了RFM模型,并对每个用户所属的类型进行了标记。本篇文章我们将在此基础上使用决策树模型对现有的RFM模型进行学习,并对新用户数据类别进行预测。同时还将通过计算同一类型中不同用户的相似度指数来为新用户进行内容推荐。下面开始本篇文章的内容。

oh
1. 使用决策树建模及预测

本部分的代码是上一篇文章的延续,因此不再重复导入库文件。具体操作请参考上一篇文章《使用python创建RFM模型》中的内容。

首先将RFM模型中的数据设置特征及目标,这里用户的R表示最近一次消费(Recency),F表示消费频率(Frequency),M表示消费金额(Monetary)为特征,当然为了后续的预测工作最好还能匹配上这些用户的个人属性,如性别,年龄,城市等,在App中的浏览行为,以及前端的广告及媒体数据。将聚类的结果也就是用户类别标签作为目标。这样的好处是可以尽早在新用户首次完成购买前完成对用户分类的预测和识别。

#设置特征及目标
X=np.array(rfm[['age','client_type']])
Y=np.array(rfm['label'])

将FRM模型中的数据划分为训练集和测试集。

#划分训练集和测试集
X_train,X_test,y_train,y_test=cross_validation.train_test_split(X,Y,test_size=0.2,random_state=seed)

使用训练集数据对决策树模型进行拟合。

#训练模型
clf = DecisionTreeClassifier(max_depth=5)
clf=clf.fit(X_train,y_train)

查看模型的准确率数据。

#模型准确率
clf.score(X_test,y_test)
0.77094972067039103

使用模型对新用户的数据进行模拟预测。

#对新数据进行分类预测
clf.predict(['42','3'])
array([0])

固化现有模型并保存。

#模型持久化
joblib.dump(clf, 'rfm1.pkl') 
['rfm1.pkl']

重新加载刚才的模型并进行预测。

#加载模型
clf_1 = joblib.load('rfm1.pkl')
 
#使用模型进行分类预测
clf_1.predict(['52','2'])
array([0])

到此为止,我们完成了基于历史RFM模型数据的预测模型。下面使用协同过滤算法计算不同用户间的相似度指数。

 

2. 使用协同过滤进行推荐

计算相似度之前需要先将之前的DF转化为dict格式。下面是具体的代码。我们依次将两个DF转化为dict格式。

#筛选label等于0的DF转dict
category1=rfm.loc[(rfm['label'] == 0),['user_id','age','acct_bal','amount']]
category1=category1.set_index('user_id')
dataset_1=category1.to_dict(orient='index')
#查看dict
dataset_1

查看dict_1

#DF转dict
category2=rfm.loc[(rfm['label'] == 1),['user_id','age','acct_bal','amount']]
category2=category2.set_index('user_id')
dataset_2=category2.to_dict(orient='index')
#查看dict
dataset_2

查看dict_2

#提取字典中的值
dataset_2['881149913794870']
{'acct_bal': Decimal('1000.00'), 'age': 28, 'amount': Decimal('1000.00')}

在数据库中创建一个空表用来存放计算后的相似度指数表。

#打开数据库连接
db = pymysql.connect(host="10.30.1.6",user="root",port=3306,db="shuju_test" )
# 使用 cursor() 方法创建一个游标对象 cursor
cursor = db.cursor()

#在mysql中创建一个表
sql1 = "CREATE TABLE eclidean_1(dataset_1 varchar(255), dataset_2 varchar(255), distance varchar(255))"

# 使用 execute() 方法执行 SQL 查询 
cursor.execute(sql1)

将计算后的相似度数据直接写入数据库中进行保存。

#计算相似度并直接写入mysql
for i in dataset_1:
for x in dataset_2:
eclidean_distance =1/(1+sqrt((pow(dataset_1[i]['age'] - dataset_2[x]['age'],2) + pow(dataset_1[i]['acct_bal'] - dataset_2[x]['acct_bal'],2) + pow(dataset_1[i]['amount'] - dataset_2[x]['amount'],2))))
print(i,x,eclidean_distance)
sql="INSERT INTO `eclidean_1`(`dataset_1`, `dataset_2`, `distance`)VALUES ( %s, %s, %s);"
values=(i,x,eclidean_distance)
cursor.execute(sql,values)
db.commit()

计算相似度并直接写入mysql
到这里我们计算出了11152条相似度数据并保存在数据库中。为了查看的方便我们再降数据提取到python进行透视和导出。

# 使用 execute() 方法执行 SQL 查询 
cursor.execute("SELECT * FROM eclidean_1;")
11152

将11152条相似度数据提取出来并命名为similarity

# 使用 fetchone() 方法获取单条数据.
similarity = cursor.fetchall()

#查看相似度数据
print(similarity)

查看相似度数据

将相似度数据改为DF格式。

#创建相似度列表
columnlist=['dataset_1','dataset_2','distance']
similarity_table=pd.DataFrame.from_records(list(similarity),columns=columnlist)
#查看相似度列表
similarity_table.head()

查看相似度列表

对DF进行透视,查看用户间两两的相似度指数。

#对相似度列表进行透视
similarity_pivot=pd.pivot_table(similarity_table,index=["dataset_1"],columns=["dataset_2"],values=["distance"],aggfunc=np.sum)
#查看相似度透视表
similarity_pivot

查看相似度透视表

#查看相似度透视表维度
similarity_pivot.shape
(656, 17)

最后,也可以直接将相似度数据表导出。具体代码如下。

#导出所有数据
similarity_pivot.to_csv('similarity_pivot.csv')
similarity_table.to_csv('similarity_table.csv')
rfm.to_csv('rfm.csv')

使用python创建RFM模型系列文章到此结束,过程有些粗糙。如有问题欢迎朋友们指正及留言。

—【所有文章及图片版权归 蓝鲸(王彦平)所有。欢迎转载,但请注明转自“蓝鲸网站分析博客”。】—

Speak Your Mind

*