当前位置: 首页 > article >正文

【52 机器学习 | 基于KNN近邻和随机森林模型对用户转化进行分析与预测】

文章目录

  • 🏳️‍🌈 1. 导入模块
  • 🏳️‍🌈 2. Pandas数据处理
    • 2.1 读取数据
    • 2.2 查看数据信息
    • 2.3 字段说明
    • 2.4 删除重复值
    • 2.5 删除空值
  • 🏳️‍🌈 3. 数据分析-特征分析
    • 3.1 年龄及转化率分析
    • 3.2 各营销渠道人数及转化率分析
    • 3.3 各营销类型人数及转化率分析
    • 3.4 营销花费分析
    • 3.5 网站点击率分析
    • 3.6 客户访问网站总次数与转化率分析
    • 3.7 客户每次访问网站时间与转化率分析
  • 🏳️‍🌈 4. 模型分析
    • 4.1 各特征相关性热图
    • 4.2 KNN近邻算法
      • 4.2.1 找到高精度的k值
      • 4.2.2 模型准确性
      • 4.2.3 混淆矩阵
      • 4.2.4 ROC曲线
    • 4.3 随机森林
      • 4.3.1 模型准确性
      • 4.3.2 混淆矩阵
      • 4.3.3 ROC曲线
      • 4.3.4 ROC曲线-置信区间
    • 4.4 特征重要性
  • 🏳️‍🌈 5. 总结
  • 🏳️‍🌈 6. 可视化项目源码+数据

大家好,我是 👉 【Python当打之年(点击跳转)】

本期将利用KNN近邻算法和随机森林模型对用户转化率进行分析与预测 ,看看两个模型更适合对此类问题进行预测,以及哪些特征量对用户转化率影响比较大,希望对大家有所帮助,如有疑问或者需要改进的地方可以联系小编。

涉及到的库:

  • Pandas — 数据处理
  • Matplotlib/Seaborn — 数据可视化
  • Sklearn — 机器学习

🏳️‍🌈 1. 导入模块

import seaborn as sns
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings('ignore')
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

🏳️‍🌈 2. Pandas数据处理

2.1 读取数据

df1 = pd.read_csv('./用户转化预测数据集.csv')

在这里插入图片描述

2.2 查看数据信息

df.info()

在这里插入图片描述

2.3 字段说明

在这里插入图片描述

2.4 删除重复值

df = df.drop_duplicates()

2.5 删除空值

df = df.drop_duplicates()

🏳️‍🌈 3. 数据分析-特征分析

3.1 年龄及转化率分析

def get_Age_analyze1():
    fig = plt.figure(figsize=(12, 6), dpi=80)
    axis1 = fig.add_axes((0.1, 0.1, 0.8, 0.8))
    axis1.set_xlabel('年龄(岁)', color=color1, fontsize=size)
    axis1.set_ylabel('人数', color=color1, fontsize=size)
    axis1.tick_params('both', colors=color1, labelsize=size)
    sns.histplot(df['Age'], kde=True, bins=10)
    axis1.grid(True, which='both', linestyle='--', linewidth=0.5)
    plt.title('年龄分布',size=16) 

在这里插入图片描述

def get_Age_analyze2():
    fig = plt.figure(figsize=(12, 6), dpi=80)
    axis1 = fig.add_axes((0.1, 0.1, 0.8, 0.8))
    axis2 = axis1.twinx()

    # 绘制bar
    axis1.bar(labels, y_data1, label='人数',color=color1, alpha=0.8)
    axis1.set_ylim(0, 2500)
    axis1.set_ylabel('人数', color=color1, fontsize=size)
    axis1.tick_params('both', colors=color1, labelsize=size)

    for i, (xt, yt) in enumerate(zip(labels, y_data1)):
        axis1.text(xt, yt + 50, f'{yt:.2f}',size=size,ha='center', va='bottom', color=color1)

    # 绘制plot
    axis2.plot(labels, y_data2,label='转化率', color=range_color[-1], marker="o", linewidth=2)
    axis2.set_ylabel('转化率(%)', color=color2,fontsize=size)
    axis2.tick_params('y', colors=color2, labelsize=size)
    axis2.set_ylim(80, 90)
    for i, (xt, yt) in enumerate(zip(labels, y_data2)):
        axis2.text(xt, yt + 0.3, f'{yt:.2f}',size=size,ha='center', va='bottom', color=color2)

    axis1.legend(loc=(0.88, 0.92))
    axis2.legend(loc=(0.88, 0.87))
    plt.gca().spines["left"].set_color(range_color[0])
    plt.gca().spines["right"].set_color(range_color[-1])
    plt.gca().spines["left"].set_linewidth(2)
    plt.gca().spines["right"].set_linewidth(2)
    plt.title("各年龄人数及转化率分布",size=16)

在这里插入图片描述

  • 客户年龄集中分布在10-70岁之间
  • 不同年龄段的客户转化率波动不大,所以年龄对客户是否转化没有太大影响

3.2 各营销渠道人数及转化率分析

def get_CampaignChannel_analyze():
    fig = plt.figure(figsize=(12, 6), dpi=80)
    axis1 = fig.add_axes((0.1, 0.1, 0.8, 0.8))# (left, bottom, width, height)
    axis2 = axis1.twinx()

    # 绘制bar
    axis1.bar(x_data, y_data1, label='人数',color=range_color[2], alpha=0.8)
    axis1.set_ylim(0, 2500)
    axis1.set_ylabel('人数', color=color1, fontsize=size)
    axis1.tick_params('both', colors=color1, labelsize=size)

    for i, (xt, yt) in enumerate(zip(x_data, y_data1)):
        axis1.text(xt, yt + 50, f'{yt:.2f}',size=size,ha='center', va='bottom', color=range_color[2])

    # 绘制plot
    axis2.plot(x_data, y_data2,label='转化率', color=color2, marker="o", linewidth=2)
    axis2.set_ylabel('转化率(%)', color=color2,fontsize=size)
    axis2.tick_params('y', colors=color2, labelsize=size)
    axis2.set_ylim(80, 90)
    for i, (xt, yt) in enumerate(zip(x_data, y_data2)):
        axis2.text(xt, yt + 0.3, f'{yt:.2f}',size=size,ha='center', va='bottom', color=color2)

    axis1.legend(loc=(0.88, 0.92))
    axis2.legend(loc=(0.88, 0.87))
    plt.gca().spines["left"].set_color(range_color[2])
    plt.gca().spines["right"].set_color(range_color[-1])
    plt.gca().spines["left"].set_linewidth(2)
    plt.gca().spines["right"].set_linewidth(2)
    plt.title("各渠道人数及转化率分布",size=16)

在这里插入图片描述

  • 五个不同营销渠道的用户转化率波动在2%以内,所以营销渠道对客户是否转化没有太大影响

3.3 各营销类型人数及转化率分析

在这里插入图片描述

  • 不同营销类型的用户转化率波动最大接近10%,所以营销类型对客户是否转化有一定的影响

3.4 营销花费分析

def get_AdSpend_analyze1():
    fig = plt.figure(figsize=(12, 6), dpi=80)
    axis1 = fig.add_axes((0.1, 0.1, 0.8, 0.8))
    axis1.set_xlabel('营销花费(美元)', color=color1, fontsize=size)
    axis1.set_ylabel('人数', color=color1, fontsize=size)
    axis1.tick_params('both', colors=color1, labelsize=size)
    sns.histplot(df['AdSpend'], kde=True, bins=10)
    axis1.grid(True, which='both', linestyle='--', linewidth=0.5)
    plt.title('营销花费分布',size=16)

在这里插入图片描述
在这里插入图片描述

  • 不同营销花费的用户转化率波动比较明显,最大超过了10%,所以营销花费对客户是否转化有明显的影响

3.5 网站点击率分析

def get_ClickThroughRate_analyze1():
    fig = plt.figure(figsize=(12, 6), dpi=80)
    axis1 = fig.add_axes((0.1, 0.1, 0.8, 0.8))
    axis1.set_xlabel('网站点击率(%)', color=color1, fontsize=size)
    axis1.set_ylabel('人数', color=color1, fontsize=size)
    axis1.tick_params('both', colors=color1, labelsize=size)
    sns.histplot(df['ClickThroughRate'], kde=True, bins=10)
    axis1.grid(True, which='both', linestyle='--', linewidth=0.5)
    plt.title('网站点击率分布',size=16)

在这里插入图片描述
在这里插入图片描述

  • 不同点击率的用户转化率波动同样比较明显,最大超过了10%,所以点击率对客户是否转化也有明显的影响

3.6 客户访问网站总次数与转化率分析

def get_WebsiteVisits_analyze1():
    fig = plt.figure(figsize=(12, 6), dpi=80)
    axis1 = fig.add_axes((0.1, 0.1, 0.8, 0.8))
    axis1.set_xlabel('访问网站总次数', color=color1, fontsize=size)
    axis1.set_ylabel('人数', color=color1, fontsize=size)
    axis1.tick_params('both', colors=color1, labelsize=size)
    sns.histplot(df['WebsiteVisits'], kde=True, bins=10)
    axis1.grid(True, which='both', linestyle='--', linewidth=0.5)
    plt.title('访问网站总次数分布',size=16)

在这里插入图片描述
在这里插入图片描述

  • 不同客户访问网站总次数的用户转化率波动比较明显,最大超过了10%,所以客户访问网站总次数对客户是否转化有明显的影响

3.7 客户每次访问网站时间与转化率分析

def get_TimeOnSite_analyze1():
    fig = plt.figure(figsize=(12, 6), dpi=80)
    axis1 = fig.add_axes((0.1, 0.1, 0.8, 0.8))
    axis1.set_xlabel('每次访问平均时间', color=color1, fontsize=size)
    axis1.set_ylabel('人数', color=color1, fontsize=size)
    axis1.tick_params('both', colors=color1, labelsize=size)
    sns.histplot(df['TimeOnSite'], kde=True, bins=10)
    axis1.grid(True, which='both', linestyle='--', linewidth=0.5)
    plt.title('每次访问平均时间分布',size=16)

在这里插入图片描述
在这里插入图片描述

  • 不同客户每次访问网站时间的用户转化率波动比较明显,所以客户每次访问网站时间对客户是否转化有明显的影响。

🏳️‍🌈 4. 模型分析

from sklearn.preprocessing import LabelEncoder
from sklearn.neighbors import KNeighborsClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.utils import resample
from scipy.interpolate import interp1d
from sklearn.metrics import confusion_matrix, roc_auc_score, roc_curve, auc
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

4.1 各特征相关性热图

def get_model_analyze(): 
    corrdf = data.corr()
    plt.figure(figsize=(12, 12), dpi=80)
    sns.heatmap(corrdf, annot=True,cmap="rainbow", linewidths=0.05,square=True,annot_kws={"size":8}, cbar_kws={'shrink': 0.8})
    plt.title("各特征相关性热图",size=16)

在这里插入图片描述

  • 通过各特征相关性热图可以看出:AdSpend、ClickThroughRate、ConversionRate、WebsiteVisits、PagesPerVisit、TimeOnSite、EmailOpens、EmailClicks、PreviousPurchases、LoyaltyPoints等特征量相较于其他特征量对用户是否转化有较明显的影响

4.2 KNN近邻算法

4.2.1 找到高精度的k值

k_values = range(1, 21)
accuracies = []
for k in k_values:
    model = KNeighborsClassifier(n_neighbors=k)
    model.fit(x_train, y_train)
    y_pred = model.predict(x_test.values)
    accuracy = accuracy_score(y_test, y_pred)
    accuracies.append(accuracy)

在这里插入图片描述

  • k = 15 时,模型的精度最高,达到 0.88625

4.2.2 模型准确性

model = KNeighborsClassifier(n_neighbors=best_k)
model.fit(x_train, y_train)
train_accuracy = accuracy_score(y_train, model.predict(x_train.values))
test_accuracy = accuracy_score(y_test, model.predict(x_test.values))

y_pred = model.predict(x_test.values)
accuracy = accuracy_score(y_test, y_pred)
conf_matrix = confusion_matrix(y_test, y_pred)

4.2.3 混淆矩阵

在这里插入图片描述

4.2.4 ROC曲线

def get_model_roc1():
    y_probs = model.predict_proba(x_test.values)[:, 1]
    fpr, tpr, thresholds = roc_curve(y_test, y_probs)
    auc = roc_auc_score(y_test, y_probs)
    
    fig = plt.figure(figsize=(12, 6), dpi=80)
    axis1 = fig.add_axes((0.1, 0.1, 0.8, 0.8))
    axis1.tick_params('both', colors=color1, labelsize=size)
    axis1.plot(fpr, tpr, color='blue', lw=2, label=f'AUC = {auc:.2f}')
    axis1.plot([0, 1], [0, 1], color='gray', linestyle='--')
    plt.xlim([0.0, 1.0])
    plt.ylim([0.0, 1.05])
    plt.xlabel('假正率',color=color1, fontsize=size)
    plt.ylabel('召回率',color=color1, fontsize=size)
    plt.title(f'ROC曲线 - {type(model).__name__}',size=16)
    plt.legend(loc="lower right",fontsize=size)

在这里插入图片描述

  • AUC = 0.57
  • AUC = 1,是完美分类器,采用这个预测模型时,存在至少一个阈值能得出完美预测
  • 0.5 < AUC < 1,优于随机猜测。这个分类器妥善设定阈值的话,能有预测价值
  • AUC = 0.5,跟随机猜测一样(例:抛硬币),模型没有预测价值
  • AUC < 0.5,比随机猜测还差

4.3 随机森林

4.3.1 模型准确性

x_data = data.drop(columns=['Conversion'])
y = data['Conversion']
x_train, x_test, y_train, y_test = train_test_split(x_data, y, test_size=0.2, random_state=7)
model = RandomForestClassifier(random_state=15)
model.fit(x_train, y_train)

y_pred = model.predict(x_test)
accuracy = accuracy_score(y_test, y_pred)
conf_matrix = confusion_matrix(y_test, y_pred)

4.3.2 混淆矩阵

在这里插入图片描述

4.3.3 ROC曲线

在这里插入图片描述

  • AUC = 0.83,效果比KNN更好

4.3.4 ROC曲线-置信区间

def get_model_roc3():
    # 计算原始ROC曲线的FPR, TPR, 和thresholds
    fpr_orig, tpr_orig, thresholds_orig = roc_curve(y_test, y_probs)

    # 计算多个ROC曲线
    for i in range(n_bootstraps):
        x_resample, y_resample = resample(x_test, y_test)
        y_probs_resample = model.predict_proba(x_resample)[:, 1]
        fpr_resample, tpr_resample, _ = roc_curve(y_resample, y_probs_resample)
        # 线性插值
        fpr_interp = interp1d(np.linspace(0, 1, len(fpr_resample)), fpr_resample, fill_value="extrapolate")(np.linspace(0, 1, len(fpr_orig)))
        tpr_interp = interp1d(np.linspace(0, 1, len(tpr_resample)), tpr_resample, fill_value="extrapolate")(np.linspace(0, 1, len(tpr_orig)))
        fpr_bootstraps[i] = fpr_interp
        tpr_bootstraps[i] = tpr_interp

    # 计算置信区间
    tpr_ci = np.percentile(tpr_bootstraps, [2.5, 97.5], axis=0)

    # 绘制ROC曲线和置信区间
    plt.figure(figsize=(12, 6), dpi=80)
    plt.plot(fpr_orig, tpr_orig, color='blue', lw=2, label=f'AUC = {auc:.2f}')
    plt.fill_between(fpr_orig, tpr_ci[0], tpr_ci[1], color='blue', alpha=0.2, label='95%置信区间')
    plt.plot([0, 1], [0, 1], color='gray', linestyle='--') # 随机猜测线
    plt.xlim([0.0, 1.0])
    plt.ylim([0.0, 1.05])
    plt.xlabel('假正率',color=color1, fontsize=size)
    plt.ylabel('召回率',color=color1, fontsize=size)
    plt.title('ROC曲线 - 95%置信区间')

在这里插入图片描述

4.4 特征重要性

def get_feature_importances():
    x_data = features_rf['特征'].tolist()
    y_data = features_rf['重要度'].tolist()
    fig = plt.figure(figsize=(12, 6), dpi=80)
    ax = fig.add_axes((0.1, 0.1, 0.8, 0.8))
    ax.set_xlim(0, 0.1)
    ax.tick_params('both', colors=color1, labelsize=size)
    bars = ax.barh(x_data, y_data, color=range_color[1])
    for bar in bars:
        w = bar.get_width()
        ax.text(w+0.001, bar.get_y()+bar.get_height()/2, '%.4f'%w, ha='left', va='center')
        
    plt.xlabel('重要度',color=color1, fontsize=size)
    plt.ylabel('特征',color=color1, fontsize=size)
    plt.title('随机森林特征重要性',size=16)
    plt.grid(True, which='both', linestyle='--', linewidth=0.5)
    plt.tight_layout()
    plt.show()

在这里插入图片描述

  • 点击转化率、每次访问平均在网站上花费的时间、点击率、每次访问网站总页数、营销花费、忠诚度积分、访问网站总次数、电子邮件被打开次数等特征对用户是否转化有显著性影响。

🏳️‍🌈 5. 总结

  • 通过对特征量进行分析,可以看出,年龄、营销活动传递渠道、营销类型等特征对用户是否转化没有显著的影响,营销花费、点击率、点击转化率、访问网站总次数、每次访问平均在网站上花费的时间等特征对用户是否转化有显著的影响。
  • 通过KNN和随机森林模型的预测对比,随机森林的模型准确性、AUC数值方面要优于KNN近邻模型,可以通过该模型去预测用户北转化的概率。
  • 从特征重要性图中可以看出,点击转化率、每次访问平均在网站上花费的时间、点击率、每次访问网站总页数、营销花费、忠诚度积分、访问网站总次数、电子邮件被打开次数等特征对用户是否转化有显著性影响,后期营销策略应着重优化这些方面,以提高用户的转化率。

🏳️‍🌈 6. 可视化项目源码+数据

点击跳转:【全部可视化项目源码+数据】


以上就是本期为大家整理的全部内容了,赶快练习起来吧,原创不易,喜欢的朋友可以点赞、收藏也可以分享注明出处)让更多人知道。


http://www.kler.cn/a/371565.html

相关文章:

  • MySQL中,如何定位慢查询?定位到的慢SQL如何分析?
  • 大语言模型及LangChain介绍
  • GPT-Sovits-1-数据处理
  • C++中如何获取时间并格式化为字符串?
  • SpringMVC实战:构建高效表述层框架
  • 交叉编译 perl-5.40.0(riscv64)
  • 1、两数之和
  • 油猴脚本-GPT问题导航侧边栏增强版
  • ip地址分为几大类-IP和子网掩码对照表
  • 【React】React 的核心设计思想
  • 经验总结:typescript 和 axios 项目中大量接口该如何管理和组织
  • 牛客算法简单题(JS版)
  • R语言在机器学习中的应用
  • unity中的材质(material)贴图(texture)着色器(shader)介绍
  • C++设计模式创建型模式———生成器模式
  • 【jvm】什么是TLAB
  • Ubuntu 22.04系统启动时自动运行ROS2节点
  • 【机器学习】Softmax 函数
  • GraphQL系列 - 第1讲 GraphQL语法入门
  • 计算机毕业设计——ssm基于HTML5的互动游戏新闻网站的设计与实现录像演示2021
  • R_机器学习——常用函数方法汇总
  • Java进阶篇设计模式之四 -----适配器模式和桥接模式
  • 会议录音转文字怎么转?有这6款视频语音转文字工具就够了!
  • 微信小程序时间弹窗——年月日时分
  • G2 基于生成对抗网络(GAN)人脸图像生成
  • Pytorch学习--神经网络--非线性激活