【机器学习算法基础】(基础机器学习课程)-08-决策树和随机森林-笔记

news2024/9/21 4:39:35

一、决策树之信息论基础

        决策树是一种用来做决策的工具,就像我们生活中的选择树。例如,你在选择今天穿什么衣服时,会根据天气情况、出行活动等进行判断。决策树的构建过程涉及一些信息论的概念,用来衡量和选择最好的“分叉点”来进行决策。

1. 熵(Entropy)

        熵可以理解为混乱程度或不确定性。一个班级如果只有男生或只有女生,那么这个班级的熵是最低的(最纯)。如果男生女生各占一半,那么熵是最高的(最混乱)。计算公式有点像统计学里的“平均不确定性”。

        例子:假设我们有一个班级,有60%的男生和40%的女生。班级的熵计算如下: H=−(0.6log⁡20.6+0.4log⁡20.4)H = - (0.6 \log_2 0.6 + 0.4 \log_2 0.4)H=−(0.6log2​0.6+0.4log2​0.4)

2. 条件熵(Conditional Entropy)

        条件熵是在知道某个特征的情况下,数据集的混乱程度。比如在班级中,如果我们按年级(比如一年级和二年级)来分,计算每个年级内部的熵,然后加权平均。

        例子:假设一年级有70%的男生,二年级有50%的男生。 H(班级∣年级)=一年级人数总人数H(一年级)+二年级人数总人数H(二年级)H(班级|年级) = \frac{一年级人数}{总人数} H(一年级) + \frac{二年级人数}{总人数} H(二年级)H(班级∣年级)=总人数一年级人数​H(一年级)+总人数二年级人数​H(二年级)

3. 信息增益(Information Gain)

        信息增益是通过某个特征来减少熵的程度。选择信息增益最大的特征,意味着这个特征可以最好地划分数据。

例子:假设我们通过年级来划分班级后,发现熵减少了很多,那么年级就是一个很好的划分特征。

4. 增益率(Gain Ratio)

        增益率是为了修正信息增益的偏差。信息增益可能会偏向于取值较多的特征。增益率考虑了特征取值的多样性。

        例子:假设我们有一个特征是学生的生日,这个特征的取值很多,可能会有较高的信息增益,但实际上并不适合做划分。增益率会修正这个问题。

5. 基尼指数(Gini Index)

基尼指数是另一种衡量数据纯度的方法,越低表示越纯。它类似于熵,但计算更简单,常用于分类树。

        例子:假设我们有两个班级,一个班级男生占90%,另一个班级男生占50%。基尼指数会更倾向于选择男生占90%的班级为纯度更高的班级。

总结

        决策树通过选择能够最大化信息增益或最小化基尼指数的特征来进行数据的划分。最终,我们得到的树结构可以帮助我们做出分类或回归的决策。

例子总结

假设我们要根据天气情况(晴天、阴天、雨天)和温度(高、中、低)来决定是否去公园。

  1. :初始情况下,不知道天气和温度时,去公园和不去公园的比例是50/50,熵较高。
  2. 条件熵:根据天气情况,发现晴天去公园的比例很高,雨天去公园的比例很低。
  3. 信息增益:选择天气作为第一个划分特征,因为它能最大程度减少熵。
  4. 增益率:如果温度有很多不同的取值,而天气只有三种取值,增益率会帮助我们避免偏向温度这个特征。
  5. 基尼指数:在不同特征间选择时,可能会用基尼指数来找到最纯的划分方式。

 

 

 

 

 

二、决策树的划分以及案例

 

 

 

 

 

 

 

 

 

 

       决策树是一种常用的机器学习算法,广泛应用于分类和回归问题。它通过递归地将数据集划分成更小的子集,从而形成一个树状结构。每个节点代表一个特征,每个分支代表这个特征的一个可能值,最终的叶节点代表一个决策结果。

        决策树的划分

决策树的划分基于对数据集的某些特征进行选择和分割。常见的划分准则有:

  1. 信息增益(Information Gain):衡量通过某个特征进行划分后信息的不确定性减少的程度。信息增益越大,表示这个特征越能有效地将数据集分类。
  2. 基尼不纯度(Gini Impurity):衡量数据集的不纯度程度。基尼不纯度越小,表示数据集越纯净,越容易分类。
  3. 增益率(Gain Ratio):对信息增益进行规范化,避免选择取值较多的特征。
  4. 卡方检验(Chi-Square Test):用于评估特征与目标变量之间的独立性。

决策树构建过程

  1. 选择最佳划分特征:根据划分准则,选择一个能够最有效地将数据分类的特征。
  2. 创建节点和分支:用选择的特征创建一个节点,并根据特征的不同取值创建分支。
  3. 递归划分子集:对子集递归进行上述步骤,直到满足停止条件(如达到最大深度、叶节点纯度足够高或数据集无法进一步划分)。
  4. 生成叶节点:当无法继续划分时,将当前节点设置为叶节点,叶节点代表决策结果。

        案例分析

案例:贷款申请审批

假设我们有一个银行贷款审批的数据集,其中包含以下特征:

  • 收入(Income)
  • 信用评分(Credit Score)
  • 是否有担保人(Has Guarantor)
  • 贷款金额(Loan Amount)

目标是决定是否批准贷款申请(Approve)。

数据样本
收入(Income)信用评分(Credit Score)是否有担保人(Has Guarantor)贷款金额(Loan Amount)批准贷款(Approve)
决策树构建
  1. 选择最佳划分特征:假设通过计算信息增益,发现“收入”是最佳划分特征。
  2. 创建节点和分支:以“收入”为根节点,根据收入的高、中、低创建分支。
  3. 递归划分子集
    • 收入=高:继续划分子集,选择“信用评分”作为下一个最佳特征。
    • 收入=中:继续划分子集,选择“信用评分”作为下一个最佳特征。
    • 收入=低:继续划分子集,选择“是否有担保人”作为下一个最佳特征。

通俗表达

想象你是一位银行经理,需要决定是否批准贷款申请。你会根据申请人的收入、信用评分和是否有担保人来做决定。首先,你会问申请人的收入情况。如果收入高,那么你会进一步查看信用评分;如果收入中等,你也会看信用评分;如果收入低,那么你会查看是否有担保人。根据这些条件一步步筛选,最终做出批准或拒绝的决定。这就是决策树的基本思想:根据一系列条件逐步进行决策,直到得出最终结果。

总结

决策树是一种直观且易于理解的分类和回归算法,通过不断地将数据集划分成更小的子集来形成一个树状结构,最终得出决策结果。它的构建过程包括选择最佳划分特征、创建节点和分支、递归划分子集以及生成叶节点。了解和应用决策树有助于解决许多实际问题,如贷款审批、疾病诊断等。

三、决策树的保存结果分析

 

 

决策树的保存

使用 joblib 保存决策树模型
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
import joblib

# 加载数据集
iris = load_iris()
X = iris.data
y = iris.target

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 训练决策树模型
clf = DecisionTreeClassifier()
clf.fit(X_train, y_train)

# 保存模型
joblib.dump(clf, 'decision_tree_model.pkl')

加载和使用保存的模型

# 加载模型
clf = joblib.load('decision_tree_model.pkl')

# 使用模型进行预测
y_pred = clf.predict(X_test)

模型评估

评估模型的性能可以使用各种指标,如准确率、混淆矩阵、精确率、召回率和 F1 分数。以下是一些常用的评估方法:

from sklearn.metrics import accuracy_score, confusion_matrix, classification_report

# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print(f"Accuracy: {accuracy}")

# 打印混淆矩阵
conf_matrix = confusion_matrix(y_test, y_pred)
print("Confusion Matrix:")
print(conf_matrix)

# 打印分类报告
class_report = classification_report(y_test, y_pred)
print("Classification Report:")
print(class_report)
解释评估指标
  • 准确率(Accuracy):模型预测正确的样本数占总样本数的比例。
  • 混淆矩阵(Confusion Matrix):显示真实标签与预测标签的匹配情况,帮助识别模型在哪些类别上表现较好或较差。
  • 分类报告(Classification Report):包括精确率(Precision)、召回率(Recall)和 F1 分数等指标,全面评估模型性能。

特征重要性

决策树的一个重要优势是能够提供特征的重要性评分。这些评分表示每个特征在决策树中对最终决策的重要程度。

import numpy as np
import matplotlib.pyplot as plt

# 获取特征重要性
feature_importances = clf.feature_importances_

# 可视化特征重要性
features = iris.feature_names
indices = np.argsort(feature_importances)[::-1]

plt.figure()
plt.title("Feature Importances")
plt.bar(range(X.shape[1]), feature_importances[indices], align="center")
plt.xticks(range(X.shape[1]), [features[i] for i in indices], rotation=90)
plt.xlim([-1, X.shape[1]])
plt.show()

通俗解释

  1. 模型训练和保存:训练一个决策树模型并将其保存,就像你写了一篇文章并保存到电脑里,以便以后可以再次查看或修改。

  2. 模型加载和预测:随时加载保存的模型,并使用它对新数据进行预测,就像打开之前保存的文章进行阅读或修改。

  3. 模型评估:使用各种指标来评估模型的性能,了解模型在不同情况下的表现,就像你在考试后查看分数和错题分析,了解自己在哪些方面做得好或需要改进。

  4. 特征重要性:决策树可以告诉我们哪些特征对最终决策影响最大,就像你在考试复习时,知道哪些章节是重点内容,需要特别注意。

总结

通过保存和分析决策树模型,我们不仅可以随时使用模型进行预测,还可以通过评估和特征重要性分析来了解模型的性能和决策依据。这些步骤帮助我们更好地理解和利用决策树模型来解决实际问题。例如,在贷款审批中,决策树可以帮助我们根据申请人的收入、信用评分和是否有担保人来决定是否批准贷款。通过评估模型的性能,我们可以确定模型的可靠性;通过分析特征重要性,我们可以知道哪些因素对决策最重要。

四、随机森林的原理以及案例调优

 

 

 

 

 

        随机森林(Random Forest)是一种集成学习方法,通过结合多个决策树的预测结果来提高分类或回归任务的准确性和稳定性。它的基本原理和调优方法如下:

随机森林的原理

  1. 集成学习:随机森林是通过集成多棵决策树来进行预测的。每棵树独立地进行训练和预测,最终的结果是这些树的预测结果的平均值(回归)或多数投票(分类)。

  2. 随机性

    • 样本随机性(Bootstrap Sampling):从训练集中有放回地随机抽取样本来训练每棵树。这种方法称为自助法(Bootstrap)。
    • 特征随机性(Random Feature Selection):在每个节点分裂时,随机选择部分特征来决定最佳分裂。这增加了模型的多样性。
  3. 减少过拟合:通过结合多棵决策树的结果,随机森林能够有效减少过拟合,提升模型的泛化能力。

案例调优

我们将使用 Python 中的 scikit-learn 库来演示随机森林的调优。以下是具体步骤:

数据准备
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split

# 加载数据集
iris = load_iris()
X = iris.data
y = iris.target

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

训练基本随机森林模型

from sklearn.ensemble import RandomForestClassifier

# 创建随机森林分类器
rf = RandomForestClassifier(random_state=42)
rf.fit(X_train, y_train)

# 预测
y_pred = rf.predict(X_test)

# 评估
from sklearn.metrics import accuracy_score, confusion_matrix, classification_report

print(f"Accuracy: {accuracy_score(y_test, y_pred)}")
print("Confusion Matrix:")
print(confusion_matrix(y_test, y_pred))
print("Classification Report:")
print(classification_report(y_test, y_pred))
超参数调优

随机森林有许多超参数可以调优,以下是一些常用的超参数和调优方法:

  1. n_estimators:森林中树的数量。一般来说,树的数量越多,模型的效果越好,但训练时间也会增加。

  2. max_features:每个分裂考虑的最大特征数。可以设置为auto(sqrt(n_features))、log2或具体的数值。

  3. max_depth:树的最大深度。防止树变得太深而导致过拟合。

  4. min_samples_split:一个内部节点再划分所需的最小样本数。

  5. min_samples_leaf:叶节点所需的最小样本数。

我们可以使用网格搜索(Grid Search)来自动调优这些超参数:

from sklearn.model_selection import GridSearchCV

# 定义参数网格
param_grid = {
    'n_estimators': [100, 200, 300],
    'max_features': ['auto', 'sqrt', 'log2'],
    'max_depth': [4, 6, 8, 10],
    'min_samples_split': [2, 5, 10],
    'min_samples_leaf': [1, 2, 4]
}

# 创建网格搜索对象
grid_search = GridSearchCV(estimator=rf, param_grid=param_grid, cv=5, n_jobs=-1, verbose=2)
grid_search.fit(X_train, y_train)

# 输出最佳参数
print("Best Parameters:", grid_search.best_params_)

# 使用最佳参数进行预测
best_rf = grid_search.best_estimator_
y_pred_best = best_rf.predict(X_test)

# 评估
print(f"Best Accuracy: {accuracy_score(y_test, y_pred_best)}")
print("Best Confusion Matrix:")
print(confusion_matrix(y_test, y_pred_best))
print("Best Classification Report:")
print(classification_report(y_test, y_pred_best))

特征重要性

随机森林模型可以评估每个特征的重要性,有助于我们理解模型的决策依据。

import numpy as np
import matplotlib.pyplot as plt

# 获取特征重要性
importances = best_rf.feature_importances_
indices = np.argsort(importances)[::-1]

# 可视化特征重要性
plt.figure()
plt.title("Feature Importances")
plt.bar(range(X.shape[1]), importances[indices], align="center")
plt.xticks(range(X.shape[1]), [iris.feature_names[i] for i in indices], rotation=90)
plt.xlim([-1, X.shape[1]])
plt.show()

通俗解释

  1. 集成多棵树:随机森林通过组合多棵决策树的结果来做出预测,减少了单一决策树过拟合的风险。就像一个人做决策可能有偏见,但如果我们听取一群人的意见,得到的结果会更公正。

  2. 随机性:通过随机选择训练样本和特征,随机森林增加了模型的多样性和稳健性,防止某些特征主导模型。就像一个团队中每个人有不同的背景和观点,能够提出更多元化的解决方案。

  3. 调优和评估:通过调整超参数,我们可以找到性能最好的模型配置,确保模型在新数据上的表现最佳。就像调节收音机的频率以获得最清晰的信号。

总结

        随机森林是一种强大的集成学习方法,通过组合多棵决策树的预测结果,提升了模型的准确性和稳健性。通过调优超参数,我们可以进一步优化模型的性能。特征重要性分析帮助我们理解哪些特征在决策中最重要。总体来说,随机森林在处理复杂数据和防止过拟合方面非常有效。

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

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

相关文章

Unity打包设置

1.Resolution and Presentation (分辨率和显示) Fullscreen Window (全屏窗口): 应用程序将以全屏窗口模式运行,但不会独占屏幕。适用于想要全屏显示但仍需访问其他窗口的情况。 Resizable Window (可调整大小的窗口): 允许用户调整应用程序窗口的大小。适用于窗口…

Action通信 实践案例

Action通信 Server端实现 创建服务端功能包(注意目录层级): ros2 pkg create my_exer05_action_server --build-type ament_cmake --node-name nav_server --dependencies rclcpp rclcpp_action my_exer_interfaces nav_msgs /*需求&#x…

【vim】ubuntu20-server 安装配置 vim 最新最详细

在编程的艺术世界里,代码和灵感需要寻找到最佳的交融点,才能打造出令人为之惊叹的作品。而在这座秋知叶i博客的殿堂里,我们将共同追寻这种完美结合,为未来的世界留下属于我们的独特印记。【vim】ubuntu20-server 安装配置 vim 最新最详细 开发环境一、vim github二、安装必…

基于SpringBoot实现验证码功能

目录 一 实现思路 二 代码实现 三 代码汇总 现在的登录都需要输入验证码用来检测是否是真人登录,所以验证码功能在现在是非常普遍的,那么接下来我们就基于springboot来实现验证码功能。 一 实现思路 今天我们介绍的是两种主流的验证码,一…

IP地址专用SSL/https证书——10分钟签发

一般常用的SSL证书多为域名型SSL证书,即需要提供准确的域名。如果不能提供域名,只能提供IP地址,则需要一种特殊的SSL证书——IP地址证书。下面是IP地址证书的申请教程 IP地址专用SSL证书获取链接https://www.joyssl.com/certificate/select/…

SQL中的LEFT JOIN、RIGHT JOIN和INNER JOIN

在SQL中,JOIN操作是连接两个或多个数据库表,并根据两个表之间的共同列(通常是主键和外键)返回数据的重要方法。其中,LEFT JOIN(左连接)、RIGHT JOIN(右连接)和INNER JOIN…

Open3D 将点云投影到球面

目录 一、概述 二、代码实现 2.1关键函数 2.2完整代码 三、实现效果 3.1原始点云 3.2投影后点云 前期试读,后续会将博客加入下列链接的专栏,欢迎订阅 Open3D点云算法与点云深度学习案例汇总(长期更新)-CSDN博客 一、概述…

【表单组件】地址组件新增精简模式

07/17 主要更新模块概览 快速筛选 精简模式 触发条件 自定义域名 01 表单管理 1.1 【表单组件】-数据关联组件新增快速筛选功能 说明: 数据关联组件新增快速筛选功能,用户在数据关联组件选择数据时,可以通过快速筛选功能&#xff0…

黑马头条Day07-app端文章搜索

一、今日内容介绍 1. App端搜索效果图 2. 今日内容 (1)文章搜索 Elasticsearch环境搭建索引库创建文章搜索多条件复合查询索引数据同步 (2)搜索历史记录 MongoDB环境搭建异步保存搜索历史查看搜索历史列表删除搜索历史 &…

Linux源码安装的Redis如何配置systemd管理并设置开机启动

文章目录 实验前提实验 实验前提 已完成源码安装并能正常启动redis /usr/local/bin/redis-server能正常启动redis 实验 vim /etc/systemd/system/redis.service内容如下: [unit] Descriptionredis-server Afternetwork.target[Service] Typeforking ExecStart/…

从零开始创建vue3项目——包含项目初始化、element-plus、eslint、axios、router、pinia、echarts

项目启动 初始化vue3项目 这里建议先下载pnpm,下载速度更快,如果还没下载可以使用 npm install -g pnpm 如果遇到报错问题,如下 可以在命令行输入下面的指令以切换到淘宝镜像源 npm config set registry https://registry.npm.taobao.org…

Facebook云手机引流运营方法

Facebook,作为全球用户数达到30亿的最大社交媒体平台,汇聚了各类客户群体,蕴藏着巨大的商业潜力。对于外贸电商而言,Facebook是不可或缺的营销平台。一方面,我们可以在Facebook上发布产品信息,寻找并筛选目…

linux系统进程占cpu 100%解决步骤

1.查找进程 ps aux 查看指定进程: ps aux | grep process_name2.根据进程查找对应的主进程 pstree -p | grep process_name 3.查看主进程目录并删除 ps -axu | grep process_name rm -rf /usr/bin/2cbbb

PDF-Extract-Kit

文章目录 一、关于 PDF-Extract-Kit整体介绍效果展示 二、评测指标1、布局检测2、公式检测3、公式识别 三、安装四、模型下载1、安装 Git LFS2、从 Hugging Face 下载模型3、从 ModelScope 下载模型SDK 下载Git 下载 五、运行提取脚本六、其它待办事项协议致谢 一、关于 PDF-Ex…

Spark实时(三):Structured Streaming入门案例

文章目录 Structured Streaming入门案例 一、Scala代码如下 二、Java 代码如下 三、以上代码注意点如下 Structured Streaming入门案例 我们使用Structured Streaming来监控socket数据统计WordCount。这里我们使用Spark版本为3.4.3版本,首先在Maven pom文件中导…

Delphi 11.2 配置Android SDK 环境

打开 Delphi 11 点击 Tools–Options… 然后点击 Deployment–SDK Manager–Add… 这里如果配置64位就选 Android 64-bit,如果配置32位就选 Android 32-bit 点击 Select an SDK version–Add New… 有警告图标的就是有问题的项,需要手动更新一下&#xf…

NO.1 Hadoop概述

1.1 Hadoop是什么 1.2 Hadoop优势 1.3 Hadoop组成 1.3.1 HDFS架构概述 1.3.2 YARN架构概述 1.3.3 MapReduce架构概述 1.3.4 HDFS、YARN、MapReduce三者关系 1.4 大数据技术生态体系 1.5 推荐系统框架图

【UE5】可反射的射线检测

目录 效果 步骤 一、准备射线 二、生成第一次反射后的射线 三、多次反射 四、通过循环进行多次反射 效果 步骤 一、准备射线 1. 新建一个工程,添加一个俯视角游戏资源包 2. 双击打开俯视角游戏地图 删除大纲中的后期处理体积使得地图可以正常显示 3. 添加一…

【JavaEE初阶】线程的概念及创建

目录 📕 前言 📕 认识线程(Thread) 🚩 概念 😊线程是什么 🙂 为啥要有线程 😭 进程和线程的区别(面试题重点) 🤭 Java的线程和操作系统线程…

黑马JavaWeb企业级开发(知识清单)01——前端介绍,HTML实现标题:排版

文章目录 前言一、认识web前端、HTML、CSS二、VS Code开发工具&#xff08;插件弃用问题&#xff09;三、HTML结构标签介绍1. 标签页标题< title >2. 图片标签< img >1) 常见属性2) src路径书写方式 3. 标题标签< h >4. 水平分页线标签< hr > 四、用Vs…