购买转化预测_逻辑回归,网格搜索与交叉验证

ops/2024/9/24 7:49:07/

数据入口:在线书店A/B测试数据集 - Heywhale.com

数据说明

字段说明
Theme显示主题,dark(深色);light(浅色)
Click Through Rate点击率:用户点击网站上链接或按钮的比例
Conversion Rate转化率:首次访问后在平台上注册的用户百分比
Bounce Rate弹出率:访问单个页面后没有进一步互动就离开的用户百分比
Scroll Depth滚动深度:用户滚动浏览网页页面的深度
Age用户年龄
Location用户位置
Session Duration用户在网站上的会话持续时间
Purchases用户是否购买了书籍(是/否)
Added_to_Cart用户是否将书籍添加到购物车(是/否)

一家在线书店正在优化其网站设计,为用户提供了两种主题:浅色主题和深色主题。本数据集包含了使用不同主题的用户交互、参与度等相关数据。可以通过进一步的数据分析确定哪个主题能带来更好的用户参与度和更高的图书购买转化率,以及通过构建机器学习模型来预测用户是否购买了书籍。

一:主题因素分析

python">import pandas as pddata = pd.read_csv("website_ab_test.csv")
theme_counts = data['Theme'].value_counts()theme_counts

在Theme列中,Light Theme有514行,Dark Theme有486行。

python">statistics = ['Click Through Rate', 'Conversion Rate', 'Bounce Rate', 'Scroll_Depth', 'Session_Duration']
theme_stats = data.groupby('Theme')[statistics].agg(['mean', 'std'])theme_stats

对于“Click Through Rate”、“Conversion Rate”、“Bounce Rate”、“Scroll_Depth”和“Session_Duration”,我们得到了每个主题(Dark ThemeLight Theme)的均值和标准差,如下所示:

  • Click Through Rate:

    • Dark Theme: 均值 = 0.2645, 标准差 = 0.1408
    • Light Theme: 均值 = 0.2471, 标准差 = 0.1372
  • Conversion Rate:

    • Dark Theme: 均值 = 0.2513, 标准差 = 0.1409
    • Light Theme: 均值 = 0.2555, 标准差 = 0.1372
  • Bounce Rate:

    • Dark Theme: 均值 = 0.5121, 标准差 = 0.1748
    • Light Theme: 均值 = 0.4990, 标准差 = 0.1693
  • Scroll Depth:

    • Dark Theme: 均值 = 49.93, 标准差 = 16.80
    • Light Theme: 均值 = 50.74, 标准差 = 17.00
  • Session Duration:

    • Dark Theme: 均值 = 919.48, 标准差 = 510.29
    • Light Theme: 均值 = 930.83, 标准差 = 506.51

对于“Purchases”列,因为它是一个分类变量(包含’Yes’和’No’),我们将计算每个主题的购买比例:

python">purchase_proportion = data.groupby('Theme')['Purchases'].apply(lambda x: x.value_counts(normalize=True)).unstack().fillna(0)purchase_proportion

对于“Purchases”列,我们得到了每个主题的购买比例,如下所示:

  • Dark Theme:

    • 购买比例(Yes)= 50.39%
    • 未购买比例(No)= 49.61%
  • Light Theme:

    • 购买比例(Yes)= 53.09%
    • 未购买比例(No)= 46.91%

可以初步得出结论亮色主题的购买比例较大。

二:购买转化预测

1:逻辑回归模型建立

python">from sklearn.preprocessing import LabelEncoder, OneHotEncoder
from sklearn.compose import ColumnTransformer
from sklearn.pipeline import Pipeline
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, classification_report
from sklearn.model_selection import train_test_split
import numpy as npdata = data.drop('Added_to_Cart', axis=1)
label_encoder = LabelEncoder()
data['Purchases'] = label_encoder.fit_transform(data['Purchases'])categorical_features = ['Theme', 'Location']
one_hot_encoder = OneHotEncoder(sparse_output=False)
transformer = ColumnTransformer(transformers=[('one_hot_encoder', one_hot_encoder, categorical_features)], remainder='passthrough')
data = transformer.fit_transform(data)X = data[:, :-1].astype(float)  
y = data[:, -1]X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)logistic_regression_model = LogisticRegression()logistic_regression_model.fit(X_train, y_train)y_pred = logistic_regression_model.predict(X_test)accuracy = accuracy_score(y_test, y_pred)classification_report_str = classification_report(y_test, y_pred)accuracy, classification_report_str

这里创建了一个LabelEncoder对象,并将其应用于数据集中的’Purchases’列,将类别标签转换为整数。同时这里定义了要独热编码的特征列表categorical_features,然后创建了一个OneHotEncoder对象和一个ColumnTransformer对象。ColumnTransformer用于将独热编码应用于指定的特征。这里将数据集分为特征矩阵X和目标变量yX包含了除最后一列(‘Purchases’)之外的所有列,并且转换为浮点数类型。然后使用train_test_split函数将数据集分为训练集和测试集,其中测试集占总数据的20%,最后这里创建了一个LogisticRegression对象,并使用训练集数据对其进行训练。

逻辑回归模型的准确率为56%,以下是详细的分类报告:

  • 对于类别"No":
    • 精确度 (precision): 0.61
    • 召回率 (recall): 0.38
    • F1分数 (f1-score): 0.47
  • 对于类别"Yes":
    • 精确度 (precision): 0.54
    • 召回率 (recall): 0.74
    • F1分数 (f1-score): 0.62

总体准确率 (accuracy): 0.56

这个模型的表现是基本的,但我们可以尝试其他模型或调整模型参数来提高性能。

2:网格搜索调参

调整模型参数通常涉及以下步骤:

参数选择

首先,需要确定要调整的参数。对于逻辑回归模型,常见的参数包括:正则化强度 (C):控制正则化强度的逆。较小的值会增加正则化惩罚,而较大的值会减少正则化惩罚。正则化类型(penalty):可以是l1(Lasso正则化)或l2(Ridge正则化)。最大迭代次数 (max_iter)算法收敛前最大的迭代次数。解算器 (solver):用于优化问题的算法,例如liblinearsagsaga等。

参数调整方法

网格搜索 (Grid Search):在指定的参数范围内,系统地遍历所有可能的参数组合。随机搜索 (Random Search):在指定的参数分布中随机选择参数组合。贝叶斯优化 (Bayesian Optimization):使用贝叶斯方法来优化参数,通常比网格搜索和随机搜索更高效。

让我们使用网格搜索来进行参数调整,并查看性能是否有所提高。我们将调整Cpenalty参数。

python">from sklearn.model_selection import GridSearchCVparam_grid = {'C': [0.001, 0.01, 0.1, 1, 10, 100],'penalty': ['l1', 'l2'],'solver': ['liblinear']  
}logistic_regression_model = LogisticRegression()grid_search = GridSearchCV(logistic_regression_model, param_grid, cv=5, scoring='accuracy')grid_search.fit(X_train, y_train)best_params = grid_search.best_params_
best_estimator = grid_search.best_estimator_y_pred_best = best_estimator.predict(X_test)accuracy_best = accuracy_score(y_test, y_pred_best)best_params, accuracy_best

使用网格搜索,我们找到了以下最佳参数:

  • C: 0.01
  • penalty: ‘l1’(Lasso正则化)
  • solver: ‘liblinear’

使用这些最佳参数,逻辑回归模型在测试集上的准确率为49%。可以看出模型预测的准确率相对降低

3:交叉验证

交叉验证是一种评估机器学习模型性能的方法,通过将数据集分成若干份,轮流使用其中一份作为验证集,其余作为训练集,多次训练和评估模型来得到一个更稳健的性能指标。为了利用新得到的参数进行交叉验证,我们可以使用KFoldStratifiedKFold类从sklearn.model_selection模块创建一个交叉验证器,然后使用逻辑回归模型和最佳参数进行训练和评估。

以下是使用新得到的参数进行交叉验证的步骤:

  1. 初始化逻辑回归模型并设置最佳参数。
  2. 使用KFoldStratifiedKFold创建交叉验证器。
  3. 使用交叉验证器进行模型训练和评估。
  4. 计算交叉验证的平均准确率。
python">from sklearn.model_selection import KFoldlogistic_regression_model_best = LogisticRegression(**best_params)kf = KFold(n_splits=5, shuffle=True, random_state=42)accuracies = []
for train_index, test_index in kf.split(X):X_train_cv, X_test_cv = X[train_index], X[test_index]y_train_cv, y_test_cv = y[train_index], y[test_index]logistic_regression_model_best.fit(X_train_cv, y_train_cv)y_pred_cv = logistic_regression_model_best.predict(X_test_cv)accuracies.append(accuracy_score(y_test_cv, y_pred_cv))average_accuracy = sum(accuracies) / len(accuracies)
average_accuracy

使用新得到的参数进行交叉验证后,我们得到平均准确率为51%。这比我们在之前步骤中使用最佳参数在测试集上得到的结果较好。

想要探索多元化的分析视角,可以关注之前发布的内容。


http://www.ppmy.cn/ops/115190.html

相关文章

spring 的启动过程

Spring 框架的启动过程涉及各种模块的初始化、依赖注入、AOP 配置等,以下是 Spring 容器启动的一般过程。 加载配置文件。首先读取配置文件(如 XML 配置文件、Java Config 类等)。实例化容器。根据配置文件中的信息创建容器 ApplicationCont…

Python 中的 HTTP 编程入门,如何使用 Requests 请求网络

Python 中的 HTTP 编程入门 HTTP(超文本传输协议)是现代网络通信的基础,几乎所有的网络应用都依赖于 HTTP 协议进行数据交换。在 Python 中,处理 HTTP 请求和响应非常简单,可以通过内置的 http 模块或第三方库如 requ…

【网站架构部署与优化】源码编译安装LAMP

文章目录 LAMP架构概述各组件的主要作用构建LAMP平台的安装顺序 编译安装Apache httpd服务指南1. 准备工作1.1 关闭防火墙并传输软件包1.2 安装环境依赖包 2. 配置软件模块2.1 解压软件包2.2 移动apr组件包2.3 配置httpd 3. 编译及安装4. 优化配置4.1 配置文件路径4.2 添加http…

asp.net core web api 使用apollo配置更改回调监听

安装依赖包 > Com.Ctrip.Framework.Apollo 2.10.0 2.10.0> Com.Ctrip.Framework.Apollo.ConfigAdapter.Yaml 2.9.0 2.9.0 > Com.Ctrip.Framework.Apollo.Configuration 2.10.2 2.10.2> Com.Ctrip.Framework.Apollo.…

patch 命令:补丁的应用

一、命令简介 ​diff​ 和 patch​ 是传统的文件比较和应用差异的工具,而 git​ 是一个更现代、功能更全面的版本控制系统,它内置了 diff​ 和 patch​ 的功能,并且提供了更多用于代码管理和协作的高级特性。 diff, patch 和 git 之间的关系…

冒泡排序bubble sort

冒泡排序(bubble sort)通过连续地比较与交换相邻元素实现排序。这个过程就像气泡从底部升到顶部一样,因此得名冒泡排序。 算法流程 def bubble_sort(nums: list[int]):"""冒泡排序"""n len(nums)# 外循环&…

ubuntu、linux安装redis(使用tar包的方式)

目录 1、准备redis的tar包 2、执行make 3、执行make install 4、运行redis 5、总结 1、准备redis的tar包 去官网或者github上下载对应的tar包,我下载的是 redis-6.2.14.tar.gz 上传到ubuntu后,使用指令进行解压: tar -xvf redis-6.2.14.t…

【软件造价咨询】软件每年运维费用取开发费用百分之几合适

应用软件的运维费用相对于系统开发建设费用的占比因项目而异,但可以通过一些行业标准和基准数据来进行估算。根据北京软件造价评估联盟2020至2023年发布的《中国软件行业基准数据》CSBMK文件,在这项文件中用百分位数统计列出了“应用软件运维费用占比”的…