分类预测:会员回购预测

2024-01-31 06:59
文章标签 分类 会员 预测 回购

本文主要是介绍分类预测:会员回购预测,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

项目说明

数据集来自阿里天池:会员回购预测
目的是为了判断顾客是否会响应活动从而回购,也就是一个是否响应活动的二分类模型

数据说明

train&test
在这里插入图片描述
target:“0”代表不回购,“1”代表回购

transactions
在这里插入图片描述
代码

import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from imblearn.over_sampling import SMOTE
from sklearn.svm import SVC
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.metrics import roc_auc_score, average_precision_score, confusion_matrix, classification_report# 读取数据
filename = r'C:\Users\liuhao\Desktop\新建文件夹\会员回购\train.csv'
filename1 = r'C:\Users\liuhao\Desktop\新建文件夹\会员回购\test.csv'
data = pd.read_csv(filename)
data1 = pd.read_csv(filename1)
train = data.copy()
test = data1.copy()# 数据处理和特征构造
train['first_active_month'] = pd.to_datetime(train['first_active_month'],format='%Y-%m-%d')
day = pd.to_datetime('2018-02-02')# 表中最大日期的后一个月,以此为基准
train['month_lag'] = day - train['first_active_month']
train['month_lag'] = train['month_lag'].apply(lambda x:x.days//30)
train.drop(train[train['month_lag'] == 244].index,inplace=True)# 去除一个异常值
train['year'] = train['first_active_month'].dt.year
train['month'] = train['first_active_month'].dt.month
yearlist = sorted(train['year'].unique())
train['year'] = train['year'].apply(lambda x:yearlist.index(x))# 将年份值缩小
x = train.iloc[:,3:]
x = pd.get_dummies(x,columns=['feature_1','feature_2','feature_3']).values# one-hot编码
y = train['target'].valuestest['first_active_month'] = pd.to_datetime(test['first_active_month'],format='%Y-%m-%d')
test['month_lag'] = day - test['first_active_month']
test['month_lag'] = test['month_lag'].apply(lambda x:x.days//30)
test['year'] = test['first_active_month'].dt.year
test['month'] = test['first_active_month'].dt.month
test['year'] = test['year'].apply(lambda x:yearlist.index(x))
test_x = test.iloc[:,3:]
test_x = pd.get_dummies(test_x,columns=['feature_1','feature_2','feature_3']).values
test_y = test['target'].values# 样本分布不均衡,采用过采样处理平衡数据
model_smote = SMOTE()
x_smote, y_smote = model_smote.fit_sample(x, y)
X_train, X_test, y_train, y_test = train_test_split(x_smote, y_smote,random_state=1)# LogisticRegression
lgr = LogisticRegression()
lgr.fit(X_train, y_train)print(lgr.score(X_test, y_test))
print(lgr.score(X_train, y_train))# 逻辑回归模型评估
print("LGR-test数据集")
print(lgr.score(test_x,test_y))
print("混淆矩阵")
print(confusion_matrix(test_y,lgr.predict(test_x)))
print('分类报告')
print(classification_report(test_y,lgr.predict(test_x)))
print("平均准确率:",average_precision_score(test_y,lgr.predict_proba(test_x)[:, 1]))
print("AUC:",roc_auc_score(test_y,lgr.predict_proba(test_x)[:, 1]))# SVM
svm = SVC(C=100)
svm.fit(X_train, y_train)print(svm.score(X_test, y_test))
print(svm.score(X_train,y_train))# SVM模型评估
print("SVM-test数据集")
print(svm.score(test_x, test_y))
print("混淆矩阵")
print(confusion_matrix(test_y,svm.predict(test_x)))
print('分类报告')
print(classification_report(test_y,svm.predict(test_x)))
print("平均准确率:",average_precision_score(test_y,svm.decision_function(test_x)))
print("AUC:",roc_auc_score(test_y,svm.decision_function(test_x)))# GradientBoostingClassifier
gbc = GradientBoostingClassifier(learning_rate=0.15,max_depth=4,random_state=0)
gbc.fit(X_train, y_train)print(gbc.score(X_train, y_train))
print(gbc.score(X_test, y_test))# GBC模型评估
print("GBC-test数据集")
print(gbc.score(test_x, test_y))
print("混淆矩阵")
print(confusion_matrix(test_y,gbc.predict(test_x)))
print('分类报告')
print(classification_report(test_y,gbc.predict(test_x)))
print("平均准确率:",average_precision_score(test_y,gbc.decision_function(test_x)))
print("AUC:",roc_auc_score(test_y,gbc.decision_function(test_x)))

结论

从精度和平均准确率上的表现来看,GBC远大于后两者,后两者的表现差不多。但模型最终还是服务于业务,从实际问题出发,最终目的是要更精准的唤醒休眠用户进行回购。所以更改评估指标,追求对目标的召回率和准确率,最终采用 SVM 模型。
SVM 模型评估结果

SVC-测试集
0.5258001306335728
混淆矩阵
[[1107 1166][ 286  503]]
分类报告precision    recall  f1-score   support0       0.79      0.49      0.60      22731       0.30      0.64      0.41       789accuracy                           0.53      3062macro avg       0.55      0.56      0.51      3062
weighted avg       0.67      0.53      0.55      3062平均准确率: 0.30681997055555077
AUC: 0.5767292462293625

在测试集中样本的分布并不均衡,尤其是目标样本数量较少,调整 SVM 模型决策函数的阈值会得到更好的结果。

# 
y_pred_lower_threshold_svc_test = svm.decision_function(test_x) > -.8y_pred_lower_threshold_svc_test = svm.decision_function(test_x) > -.8
print(classification_report(test_y, y_pred_lower_threshold_svc_test))
print(confusion_matrix(test_y, y_pred_lower_threshold_svc_test))
print("平均准确率:",average_precision_score(test_y,y_pred_lower_threshold_svc_test))
print("AUC:",roc_auc_score(test_y,y_pred_lower_threshold_svc_test))SVC调整阈值precision    recall  f1-score   support0       0.82      0.18      0.29      22731       0.27      0.88      0.42       789accuracy                           0.36      3062macro avg       0.54      0.53      0.36      3062
weighted avg       0.68      0.36      0.33      3062[[ 408 1865][  91  698]]
平均准确率: 0.27064600633385816
AUC: 0.5320812959985993

说明

  • 数据处理部分,train 和 test 可以先拼接再一起处理的。另外在实际过程中有对数据做过缩放,可能是因为数据的量纲相差不大,对模型结果没啥影响,也就去掉了。
  • 开始并未使用 SMOTE 对数据过抽样处理,模型的精度会更好一点,在0.7-0.8之间。但是在目标的召回率 - 准确率上表现极差,所以采用过抽样和欠抽样处理。只是欠抽样处理结果不如过抽样。另外也用了 SVC(class_weight='balanced') 调节权重,结果不是很好。
  • 有简单尝试根据stacking思路将几个模型的结果整合后再训练一个新模型,但结果也不是很好。
  • 在 transactions 数据集中有用户的交易数据,曾想套用 RFM 模型多构造几个特征,构造完连接两个数据集发现两边独立用户并不一样。有想过计算 RFM 得分然后用算法回归填充。
  • 进一步优化思路可以尝试集成算法或者调参

最后贴上 RFM 实现代码

import pandas as pd
import numpy as npfilename1 = r'C:\Users\liuhao\Desktop\新建文件夹\会员回购\train.csv'
filename2 = r'C:\Users\liuhao\Desktop\新建文件夹\会员回购\transactions.csv'
data1 = pd.read_csv(filename1)
data2 = pd.read_csv(filename2)train = data1.copy()
transactions = data2.copy()transactions['purchase_date'] = transactions['purchase_date'].apply(lambda x:x.split(" ")[0])
transactions['purchase_date'] = pd.to_datetime(transactions['purchase_date'],format = "%Y-%m-%d")rfm = pd.pivot_table(transactions,index=['card_id'],values=['purchase_date','month_lag','purchase_amount'],aggfunc={'purchase_date':'max','month_lag':'count',"purchase_amount":lambda x:abs(x).sum()})
inner_concat = pd.merge(train,rfm,how='inner',on='card_id')inner_concat['first_active_month'] = pd.to_datetime(inner_concat['first_active_month'],format='%Y-%m-%d %H:%M:%S')
inner_concat['lifetime'] = (inner_concat['purchase_date'] - inner_concat['first_active_month'])
inner_concat['lifetime'] = inner_concat['lifetime'].apply(lambda x:x.days//30)
RFM = pd.DataFrame()
RFM['card_id']  =inner_concat['card_id']
RFM['R'] = inner_concat['lifetime']
RFM['F'] = inner_concat['month_lag']
RFM['M'] = inner_concat['purchase_amount'].round(2)
RFM.drop_duplicates(subset=['card_id'],inplace=True)

在这里插入图片描述

这篇关于分类预测:会员回购预测的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/662926

相关文章

时序预测 | MATLAB实现LSTM时间序列未来多步预测-递归预测

时序预测 | MATLAB实现LSTM时间序列未来多步预测-递归预测 目录 时序预测 | MATLAB实现LSTM时间序列未来多步预测-递归预测基本介绍程序设计参考资料 基本介绍 MATLAB实现LSTM时间序列未来多步预测-递归预测。LSTM是一种含有LSTM区块(blocks)或其他的一种类神经网络,文献或其他资料中LSTM区块可能被描述成智能网络单元,因为

雨量传感器的分类和选型建议

物理原理分类 机械降雨量计(雨量桶):最早使用的降雨量传感器,通过漏斗收集雨水并记录。主要用于长期降雨统计,故障率较低。电容式降雨量传感器:基于两个电极之间的电容变化来计算降雨量。当降雨时,水滴堵住电极空间,改变电容值,从而计算降雨量。超声波式降雨量传感器:利用超声波的反射来计算降雨量。适用于大降雨量的场合。激光雷达式降雨量传感器:利用激光技术测量雨滴的速度、大小和形状等参数,并计算降雨量。主

气象站的种类和应用范围可以根据不同的分类标准进行详细的划分和描述

气象站的种类和应用范围可以根据不同的分类标准进行详细的划分和描述。以下是从不同角度对气象站的种类和应用范围的介绍: 一、气象站的种类 根据用途和安装环境分类: 农业气象站:专为农业生产服务,监测土壤温度、湿度等参数,为农业生产提供科学依据。交通气象站:用于公路、铁路、机场等交通场所的气象监测,提供实时气象数据以支持交通运营和调度。林业气象站:监测林区风速、湿度、温度等气象要素,为林区保护和

多态的分类

多态分为两种:通用的多态和特定的多态。两者的区别是前者对工作的类型不加限制,允许对不同类型的值执行相同的代码;后者只对有限数量的类型有效,而且对不同类型的值可能要执行不同的代码。 1,通用的多态又分为参数多态(parametric)和包含多态(inclusion); (1)参数多态:采用参数化模板,通过给出不同的类型参数,使得一个结构有多种类型。 例如:泛型   (2)包含多

【论文精读】分类扩散模型:重振密度比估计(Revitalizing Density Ratio Estimation)

文章目录 一、文章概览(一)问题的提出(二)文章工作 二、理论背景(一)密度比估计DRE(二)去噪扩散模型 三、方法(一)推导分类和去噪之间的关系(二)组合训练方法(三)一步精确的似然计算 四、实验(一)使用两种损失对于实现最佳分类器的重要性(二)去噪结果、图像质量和负对数似然 论文:Classification Diffusion Models: Revitalizing

第T2周:彩色图片分类

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 👉 要求: 学习如何编写一个完整的深度学习程序了解分类彩色图片会灰度图片有什么区别测试集accuracy到达72% 🦾我的环境: 语言环境:Python3.8编译器:Jupyter Lab深度学习环境: TensorFlow2 一、 前期准备 1.1. 设置GPU 如果设备上支持GPU就

【Android逆向】小白也能学会的一个小时破解某猫社区VIP会员

第二步:使用 dex2jar 将 classes.dex 转成 jar 文件 cmd到dex2jar文件夹目录,执行 d2j-dex2jar D://xxx/xxx/classes.dex 得到 jar 文件 静态分析 拿到源码后,首先我们需要找到应用的限制点,绕过App里面的判断。 然后分析源码,该从哪里开始入手呢? 我们都知道,一个完整Android应用,可能会存在各

机器学习回归预测方法介绍:优缺点及适用情况

机器学习中的回归任务是预测连续变量的值,这在金融、医疗、市场分析等领域有着广泛的应用。本文将介绍几种常见的机器学习回归方法,探讨它们的基本原理、优缺点及适用情况。 目录 1. 线性回归(Linear Regression) 2. 多项式回归(Polynomial Regression) 3. 决策树回归(Decision Tree Regression) 4. 随机森林回

细粒度图像分类论文阅读笔记

细粒度图像分类论文阅读笔记 摘要Abstract1. 用于细粒度图像分类的聚合注意力模块1.1 文献摘要1.2 研究背景1.3 本文创新点1.4 计算机视觉中的注意力机制1.5 模型方法1.5.1 聚合注意力模块1.5.2 通道注意力模块通道注意力代码实现 1.5.3 空间注意力模块空间注意力代码实现 1.5.4 CBAM注意力机制CBAM注意力代码实现 1.5.5 本文模型整体架构 1.6

Flask中制作博客首页的分类功能(二)

在Flask中制作博客首页的分类功能(一)的基础上,继续下面的教程。 发布文章的时候会为文章添加一些标签(tag),这些tag需要和数据库中Category表的tag进行比较,如果已经存在该tag,那么需要将新发表文章的tag与已存在的表格进行对应,如果不存在则要新建一个category表。 首先在python shell中执行操作。 from sql_test import db, Pos