机器学习中的分类:决策树、随机森林及其应用

news2024/11/13 15:34:44

💗💗💗欢迎来到我的博客,你将找到有关如何使用技术解决问题的文章,也会找到某个技术的学习路线。无论你是何种职业,我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章,也欢迎在文章下方留下你的评论和反馈。我期待着与你分享知识、互相学习和建立一个积极的社区。谢谢你的光临,让我们一起踏上这个知识之旅!
请添加图片描述

文章目录

  • 🍋数据预处理
  • 🍋决策树模型
    • 🍋构建及优缺点
    • 🍋代码
  • 🍋随机森林模型
    • 🍋构建及优缺点
    • 🍋代码
  • 🍋模型评估
    • 🍋下一步优化建议
  • 🍋总结

🍋数据预处理

这部分我们可以使用Python脚本随机生成一个csv文件

import pandas as pd
import random
import string

# 随机生成数据的数量
num_records = 1000

# 随机生成用户ID
def generate_user_id():
    return random.randint(1, 1000)

# 随机生成性别
def generate_gender():
    return random.choice(['M', 'F'])

# 随机生成年龄(假设年龄范围在18到60之间)
def generate_age():
    return random.randint(18, 60)

# 随机生成优惠券ID
def generate_coupon_id():
    return ''.join(random.choices(string.digits, k=4))

# 随机生成优惠力度(假设优惠力度范围在5%到50%之间)
def generate_discount():
    return f"{random.randint(5, 50)}%"

# 随机生成购买历史(假设每个用户的购买历史是一个整数,范围在1到20之间)
def generate_purchase_history():
    return random.randint(1, 20)

# 随机生成优惠券是否被使用(1表示使用,0表示未使用)
def generate_coupon_used():
    return random.choice([0, 1])

# 生成数据
data = []
for _ in range(num_records):
    data.append([
        generate_user_id(),
        generate_age(),
        generate_gender(),
        generate_coupon_id(),
        generate_discount(),
        generate_purchase_history(),
        generate_coupon_used()
    ])

# 创建DataFrame
columns = ['user_id', 'age', 'gender', 'coupon_id', 'discount', 'purchase_history', 'coupon_used']
df = pd.DataFrame(data, columns=columns)

# 保存为CSV文件
df.to_csv('o2o_data.csv', index=False)

print("CSV文件已生成:o2o_data.csv")

数据大概如下图
在这里插入图片描述

我们将用 pandas 处理这个数据集,生成特征,并进行标签编码

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelEncoder

# 加载数据
data = pd.read_csv('o2o_data.csv')

# 处理缺失值
data = data.dropna()  # 丢弃含有缺失值的行

# 特征选择与标签编码
features = data[['age', 'gender', 'discount', 'purchase_history']]  # 选择特征
labels = data['coupon_used']  # 目标变量

# 性别特征标签编码
le = LabelEncoder()
features['gender'] = le.fit_transform(features['gender'])

# 将折扣从百分比转化为数值
features['discount'] = features['discount'].apply(lambda x: float(x.strip('%')) / 100)

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(features, labels, test_size=0.2, random_state=42)

🍋决策树模型

决策树是一种基于树形结构的模型,通过一系列的决策规则来对数据进行分类。它从数据中提取特征信息,并基于这些特征做出决策。决策树的每个内部节点代表对某个特征的判断,每个分支代表判断结果,而每个叶子节点代表最终的类别。

🍋构建及优缺点

  1. 决策树的构建
    构建决策树的目标是通过一系列决策来最小化分类错误,常用的方法是选择最能区分数据的特征。常见的特征选择标准有:
  • 信息增益(Information Gain):基于熵(Entropy)来衡量某一特征对数据集的分类效果。
  • 基尼指数(Gini Impurity):通过计算数据集的不纯度来选择最优特征。
  1. 决策树的优缺点
  • 优点:易于理解和解释,模型透明;无需特征标准化;可以处理非线性数据。
  • 缺点:容易过拟合;对噪声数据敏感;树结构的构建和剪枝过程较为复杂。

🍋代码

接下来,我们使用决策树来进行分类。我们将用 DecisionTreeClassifier 来训练模型,并评估其性能。

from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix
import matplotlib.pyplot as plt
from sklearn.tree import plot_tree

# 初始化决策树模型
dt_model = DecisionTreeClassifier(random_state=42)

# 训练模型
dt_model.fit(X_train, y_train)

# 预测结果
y_pred_dt = dt_model.predict(X_test)

# 评估模型性能
print("决策树模型准确率:", accuracy_score(y_test, y_pred_dt))
print("\n分类报告:\n", classification_report(y_test, y_pred_dt))
print("\n混淆矩阵:\n", confusion_matrix(y_test, y_pred_dt))

# 可视化决策树
plt.figure(figsize=(12,8))
plot_tree(dt_model, filled=True, feature_names=features.columns, class_names=['Not Used', 'Used'], rounded=True)
plt.show()

下图是输出的示例
在这里插入图片描述
可视化决策树
在这里插入图片描述

🍋随机森林模型

随机森林是由多棵决策树构成的集成学习方法,它通过构建多个决策树并将各树的结果进行投票(分类问题)或平均(回归问题)来增强模型的准确性。

🍋构建及优缺点

  1. 随机森林的构建
    在构建随机森林时,主要有两种方法来提高模型的多样性:
  • 自助法(Bootstrap sampling):从原始数据集随机抽取多个子集(有放回抽样),每个子集用于训练一棵决策树。
  • 特征选择随机性:每个节点的分裂不仅基于当前最佳的特征,还从随机选择的特征子集进行选择,从而增加了树之间的差异性。
  1. 随机森林的优缺点
  • 优点:较高的准确率;较少的过拟合;适用于处理高维数据。
  • 缺点:模型较为复杂,训练和预测速度相对较慢;解释性差。

🍋代码

然后,我们用随机森林来增强模型性能。我们将使用 RandomForestClassifier 进行训练。

from sklearn.ensemble import RandomForestClassifier

# 初始化随机森林模型
rf_model = RandomForestClassifier(n_estimators=100, random_state=42)

# 训练模型
rf_model.fit(X_train, y_train)

# 预测结果
y_pred_rf = rf_model.predict(X_test)

# 评估模型性能
print("随机森林模型准确率:", accuracy_score(y_test, y_pred_rf))
print("\n分类报告:\n", classification_report(y_test, y_pred_rf))
print("\n混淆矩阵:\n", confusion_matrix(y_test, y_pred_rf))

# 可视化特征重要性
feature_importances = rf_model.feature_importances_
plt.barh(features.columns, feature_importances)
plt.xlabel('Feature Importance')
plt.title('Random Forest Feature Importance')
plt.show()

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

🍋模型评估

模型准确率精确度(类别0)准确率(类别1)召回率(类别0)召回率(类别1)F1分数(类别0)F1分数(类别1)
决策树0.4750.500.450.480.470.490.46
随机森林0.4750.500.450.500.440.500.44

总结:

  • 准确率: 两个模型的准确率相似,均为0.475,表明它们的分类性能差异不大,表现较弱。
  • 精确度和召回率: 在两个模型中,类别0的精确度和召回率均高于类别1,说明模型对类别0的识别更好。类别1的召回率较低,表示模型难以正确识别出类别1的样本。
  • F1 分数: 两个模型在类别0和类别1的F1分数上都相差不大,且都处于较低的水平,表明模型在平衡精度与召回率方面仍有优化空间。

🍋下一步优化建议

  • 数据平衡处理: 由于数据的类别分布不平衡,建议尝试采用过采样(如SMOTE)或欠采样的方法来平衡类别分布。
  • 模型调参: 可以通过调整模型的超参数(如决策树深度、随机森林的树数量)来提高模型性能。
  • 特征工程: 可以尝试更多的特征工程方法,增加更多的特征或进行特征选择,以帮助模型更好地理解数据。
  • 其他模型: 如果决策树和随机森林模型表现不理想,考虑使用其他更复杂的模型,如支持向量机(SVM)或XGBoost。

当然我们毕竟是虚假的数据,但是上面的建议还是可以参考一下的

🍋总结

决策树和随机森林是机器学习中非常强大的工具,它们不仅在分类任务中应用广泛,也在回归、预测等任务中大有作为。特别是在O2O优惠券使用预测中,利用这些模型可以为商家提供更精确的营销决策,从而提高消费者的转化率。刚兴趣的同学可以多使用几组数据集进行测试

在这里插入图片描述

挑战与创造都是很痛苦的,但是很充实。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2236731.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ETL架构怎么选?全量、增量还是实时流式?

一、 ETL : 基本定义:ETL 是将业务系统的数据经过抽取(Extract)、清洗转换(Transform)之后加载(Load)到数据仓库的过程,目的是将企业中分散、零乱、标准不统一的数据整合…

特色3D打印机stm32迷你8轴双核心主板

我自己设计的3D打印机主板 1. 这是一块迷你的8轴主板, 主板尺寸为100mm*75mm, 使用一个8cm静音风扇散热足够了2. 这是一个带有保护的板子, 驱动上的gpio具有过压保护功能, 能够直接抗住24V的冲击, 意味着一个驱动炸了, 板子不烧, 并且其他的驱动也没事, 主板支持自动关机3. 8…

【2】GD32H7xx 串口Idle + DMA接收不定长数据

目录 1. IDLE中断相关介绍2. D-Cache与DMA同时使用2.1 I-Cache与D-Cache2.2 D-Cache与DMA同时使用时的数据一致性问题2.2.1 CPU读取DMA写入到SRAM的数据2.2.2 DMA读取CPU写入到SRAM的数据 3. Uart Idle DMA收发程序4. 程序测试 1. IDLE中断相关介绍 在 GD32H7xx MCU 中&#…

证书学习(六)TSA 时间戳服务器原理 + 7 个免费时间戳服务器地址

目录 一、简介1.1 什么是时间戳服务器1.2 名词扩展1.3 用时间戳标记顺序1.4 7 个免费TSA时间戳服务器地址(亲测可用)1.5 RFC 3161 标准二、时间戳原理2.1 时间戳服务工作流程2.2 验证工作流程2.3 举个例子2.4 时间戳原理总结三、代码实现3.1 curl 命令请求时间戳3.2 java 代码…

一步一步从asp.net core mvc中访问asp.net core WebApi

"从asp.net core mvc中访问asp.net core WebApi"看到这个标题是不是觉得很绕口啊,但的确就是要讲一讲这样的访问。前面我们介绍了微信小程序访问asp.net core webapi(感兴趣的童鞋可以看看前面的博文有关WEBAPI的搭建),这里我们重点不关心如何…

信捷 XD PLC C语言 FB和FC 不同

信捷 XD PLC 的C语言下 FB和FC 的使用,如果你有困惑,本文可能会帮到你! 调用FB要带后缀_Body的,这个地方很容易忽视和出错。 不同之处FBFC可以在全局变量表中建立此类型对象可以1个,也可以多个不可以参数类型及数量有…

「Mac畅玩鸿蒙与硬件28」UI互动应用篇5 - 滑动选择器实现

本篇将带你实现一个滑动选择器应用,用户可以通过滑动条选择不同的数值,并实时查看选定的值和提示。这是一个学习如何使用 Slider 组件、状态管理和动态文本更新的良好实践。 关键词 UI互动应用Slider 组件状态管理动态数值更新用户交互 一、功能说明 在…

共享汽车管理:SpringBoot框架的高效实现

摘要 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了共享汽车管理系统的开发全过程。通过分析共享汽车管理系统管理的不足,创建了一个计算机管理共享汽车管理系统的方案。文章介绍了共享汽车管理系统的系…

艾体宝产品丨加速开发!Redis Copilot智能助手上线

我们最近发布了 Redis Copilot,旨在帮助开发者更加高效地使用 Redis 构建应用。提升应用性能,简化构建过程是我们不懈的追求。Redis Copilot 正是为此而生的人工智能助手,助力开发者迅速掌握 Redis 的使用技巧。现在您可以在 Redis Insight 中…

阿里云centos7.9服务器磁盘挂载,切换服务路径

项目背景 1、项目使用的服务器为阿里云centos7.9,默认的磁盘为vda,文件系统挂载在这个磁盘上,项目上使用的文件夹为/home/hnst/uploadPath 2、vda使用率已达到91% 3、现购置一块新的磁盘为vdb,大小为2T 目的 切换服务所使用的…

Electron + Vue3 开发桌面应用+附源码

什么是 Electron? Electron 是一个使用 JavaScript、HTML 和 CSS 构建跨平台桌面应用程序的框架。它由 GitHub 开发并维护,允许开发者使用现代 Web 技术创建原生应用程序。Electron 结合了 Chromium 渲染引擎和 Node.js 运行时环境,使得开发…

【Leecode】Leecode刷题之路第44天之通配符匹配

题目出处 44-通配符匹配-题目出处 题目描述 个人解法 思路: todo代码示例:(Java) todo复杂度分析 todo官方解法 44-通配符匹配-官方解法 前言 本题与10. 正则表达式匹配非常类似,但相比较而言,本题稍…

单元/集成测试解决方案

在项目开发的前期针对软件单元/模块功能开展单元/集成测试,可以尽早地发现软件Bug,避免将Bug带入系统测试阶段,有效地降低HIL测试的测试周期,也能有效降低开发成本。单元/集成测试旨在证明被测软件实现其单元/架构设计规范、证明被…

Linux案例:DNS服务器配置

Linux案例:DNS服务器配置 实验一:正向解析 服务端配置: [rootserver ~]# setenforce 0 [rootserver ~]# nmcli c modify ens160 ipv4.method manual ipv4.addresses 192.168.70.131/24 ipv4.gateway 192.168.70.2 ipv4.dns 114.114.114.11…

Linux常用的100个命令

掌握常用的Linux常用命令是作为码农的基本素养,无论你从事软件开发或者运维的的哪个细分领域。本文言简意赅,可作为指导书收藏。 Linux常用命令的分类: 基本文件操作权限与用户管理文件搜索与系统状态网络管理压缩与打包系统管理与维护磁盘与…

数据挖掘全景:从基础理论到经典算法的深度探索

1 绪论--1.1 数据挖掘的概念和任务 1. (单选题)目前数据分析与挖掘领域的现实情况描述不正确的是() A. 信息爆炸 B. 数据爆炸 C. 信息贫瘠 D.数据收集能力远远超过人们的分析和理解能力 2. (单选题)你认为下面哪种数据对于数据挖掘算法来说最简单最…

Qt Udp的组播(多播)、广播和单播

UDP通讯的基本概念和特点‌ UDP(User Datagram Protocol,用户数据报协议)是‌TCP/IP协议族中的一种无连接协议,主要用于那些对实时性要求较高而可靠性要求较低的应用场景。UDP的主要特点包括: ‌无连接‌:…

CSS3中动画的使用animation

1.基本使用 2.其他属性 3.复合属性

前端实现json动画(附带示例)

前端实现json动画(附带示例) 使用lottie制作动画。1.json动画2.实现效果3.git仓库4.运行5.json动画天堂6.代码7. 经常使用的方法 使用lottie制作动画。 1.json动画 废话不多说,直接看效果图2.实现效果 3.git仓库 https://gitee.com/chaiach…

Ubuntu实现双击图标运行自己的应用软件

我们知道在Ubuntu上编写程序,最后编译得到的是一个可执行文件,大致如下 然后要运行的时候在终端里输入./hello即可 但是这样的话感觉很丑很不方便,下边描述一种可以类似Windows上那种双击运行的实现方式。 我们知道Ubuntu是有一些自带的程序…