机器学习 -- 随机森林DEMO

news2024/11/28 11:43:32

场景

之前看一些歌手或者演员选取节目的时候,上面不是一个评委,少则三五个,多则几十个,当做重要决定时,大家可能都会考虑吸取多个专家而不只是一个人的意见。机器学习也是一样的,机器学习中分为两种,投票选举和再学习,其中投票选举类似于Redis集群中选举Master,在机器学习中投票选举最流行的就是 : 随机森林(random forest)。

随机森林

随机森林的船队组成:

随机森林,这是一支由许多树组成的强大舰队,每棵树都是通过观察星辰——数据的一部分,来学习并作出自己的预测。当我们需要做出最终决定时,这些树会聚在一起,通过多数投票的方式来确定最佳的行动路径。

树的数量(n_estimators):想象你有一支由许多船只组成的舰队,每艘船都可以独立探索并报告它们发现的宝藏。在随机森林中,这些船只就是决策树,而你的舰队就越大,就越有可能找到最珍贵的宝藏。

最大特征数(max_features):每艘船只通过望远镜观察大海,但为了保证探索的多样性,每次只能选择一定数量的星星来引导航向。在随机森林中,这意味着每棵树在分裂时只考虑一个随机子集的特征,这帮助提高了整个舰队的导航能力(模型的泛化能力)。

树的最大深度(max_depth):这表示你的船只能下潜多深。有时,较浅的潜水足以发现埋藏在海底的宝藏,而过深的潜水可能导致困在特定区域。在随机森林中,限制树的深度可以帮助防止模型过于复杂和过拟合。

样本的随机选择(bootstrap samples):在出航前,每艘船通过抽签决定其船员名单,即从所有海盗中随机选择一部分,有时还会重复选择某些海盗。这样做确保了每次探险的独特性和舰队的多样性。

DEMO

我们以预测泰坦尼克号乘客的生存情况为例,详细探讨随机森林算法,并逐一说明每个参数的作用及其大小对模型性能的影响。我们将从数据加载、预处理,到模型训练、参数调优,最后是模型评估和保存,贯穿整个机器学习流程。

数据加载和预处理

在这里插入图片描述
我们使用泰坦尼克号乘客数据集,这个数据集包括乘客的年龄、性别、票价等特征,以及他们是否生存的信息。

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

现在要选择特征标签

# 选择特征和标签
X = data.drop('Survived', axis=1)
y = data['Survived']
数据预处理

这里数据有两种,一种是数值,一种是类别,我们分开处理

# 预处理
numeric_features = ['Age', 'Fare']
categorical_features = ['Sex', 'Pclass', 'Embarked']

对于数值的数据,我们对于缺省的部分,我们使用SimpleImputer来处理,策略是取中值,然后每个特征去中心化并缩放到单位方差。代码应该是:

numeric_transformer = Pipeline(steps=[
    ('imputer', SimpleImputer(strategy='median')),
    ('scaler', StandardScaler())])

对于类型的数据,我们使用独热编码转换器

categorical_transformer = Pipeline(steps=[
    ('imputer', SimpleImputer(strategy='constant', fill_value='missing')),
    ('onehot', OneHotEncoder(handle_unknown='ignore'))])

组合起来处理

preprocessor = ColumnTransformer(
    transformers=[
        ('num', numeric_transformer, numeric_features),
        ('cat', categorical_transformer, categorical_features)])
X_preprocessed = preprocessor.fit_transform(X)
        
OneHotEncoder的作用

将类别特征转换为数值特征:机器学习模型通常无法直接处理文本或类别数据,OneHotEncoder通过将每个类别映射到一个独热向量来解决这个问题。独热向量长度等于类别的数量,对于每个样本,其对应类别的位置为1,其余位置为0。
避免数值类别的误导:如果简单地将类别编码为数值(比如1, 2, 3等),模型可能会误解这些数字之间存在数学上的顺序或比例关系。独热编码通过将每个类别表示为一个独立的特征,避免了这种误解。

OneHotEncoder的主要参数

handle_unknown:这个参数决定了当遇到训练集中未见过的类别时OneHotEncoder应该如何处理。如果设置为’ignore’,则在转换时忽略未知类别,如果设置为’error’(默认值),则遇到未知类别时抛出错误。

drop:可以设置为None(默认,不删除任何类别)、‘first’(删除每个特征的第一个类别,用于减少由于独热编码引入的多重共线性问题)、或者是一个数组指定哪些类别应该被删除。

Pipeline

Pipeline是scikit-learn一个类,用于封装机器学习工作流中的一系列预处理步骤和最终的估计器。在机器学习项目中,通常需要执行多个数据预处理步骤,然后再进行模型训练和预测。Pipeline允许你将这些步骤组织成一个序列,这样在训练和预测时,只需调用Pipeline的方法即可自动按顺序执行所有步骤。使用Pipeline可以有效防止数据泄露,特别是在交叉验证和网格搜索时。数据泄露通常发生在预处理步骤使用了测试集信息的情况下,这会导致过于乐观的性能估计。Pipeline确保每次交叉验证的迭代中,预处理步骤仅使用来自当前训练集的信息。Pipeline可以与GridSearchCV或RandomizedSearchCV等工具结合使用,以便在执行模型选择和超参数调优时自动应用相同的预处理步骤。这使得寻找最佳模型参数的过程既高效又一致。

HOW TO USE
#创建Pipeline时,你需要提供一个步骤列表,每个步骤由一个元组组成,元组的第一个元素是步骤的名称,第二个元素是执行该步骤的估计器或转换器对象。
from sklearn.pipeline import Pipeline
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression

pipeline = Pipeline(steps=[
    ('imputer', SimpleImputer(strategy='median')),
    ('scaler', StandardScaler()),
    ('classifier', LogisticRegression())
])

训练模型:调用fit方法进行训练。

pipeline.fit(X_train, y_train)

进行预测:使用predict方法进行预测。

y_pred = pipeline.predict(X_test)

评估模型:可以使用score方法或其他评估函数。

score = pipeline.score(X_test, y_test)

划分测评集

测试集大小:原始代码中使用test_size=0.2表示测试集占原始数据集的20%。

分割验证集:从训练集中分割出验证集时,如果我们希望验证集的大小相对于原始数据集是固定的比例,那么我们需要进行一些计算。因为在第一次分割后,训练集占了原始数据的80%,我们再从中分割出25%作为验证集,实际上验证集占原始数据集的20%(因为0.25 * 0.8 = 0.2)。这样,训练集、验证集和测试集的比例将会是64%(训练集)、16%(验证集)、20%(测试集)相对于原始数据集。

random_state参数:这个参数确保每次分割都能得到相同的结果,这对实验的可重复性很重要。

# 假设 X_preprocessed 和 y 已经是预处理后的数据
# 首先分割出训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X_preprocessed, y, test_size=0.2, random_state=42)

# 然后从训练集中分割出验证集
X_train, X_val, y_train, y_val = train_test_split(X_train, y_train, test_size=0.25, random_state=42)

模型训练

我们使用随机森林模型训练模型

model = RandomForestClassifier(n_estimators=100, max_depth=None, random_state=42)
model.fit(X_train, y_train)
参数解释和调优

n_estimators(树的数量):
作用:随机森林中决策树的数量。更多的树增加了模型的稳定性和准确性,但同时也增加了计算成本。
太大:可能导致计算时间长,但通常不会导致过拟合。
太小:可能导致模型没有充分学习数据,影响准确性。

max_depth(树的最大深度):
作用:决定树可以生长的深度。限制深度有助于防止过拟合。
太大:树可能会变得复杂,捕捉过多训练数据的噪声,导致过拟合。
太小:可能导致树没有足够的分割来理解数据,导致欠拟合。

max_features(最大特征数):
作用:决定每次分割时考虑的最大特征数量。它控制了树的随机性。
太大:树之间的差异减小,可能导致模型过于依赖某些特征,减少模型的泛化能力。
太小:增加单个树的多样性,但也
可能导致每棵树没有充分利用有用信息。

使用GridSearchCV进行参数调优

param_grid = {
    'n_estimators': [100, 200],
    'max_depth': [10, 20, None],
    'max_features': ['sqrt', 'log2', None]
}

grid_search = GridSearchCV(RandomForestClassifier(random_state=42), param_grid, cv=5)
grid_search.fit(X_train, y_train)

print("最佳参数:", grid_search.best_params_)

这个之前已经聊过了

性能测试和保存

和之前操作几乎一致了


# 使用找到的最佳参数创建新的SVM模型
best_model = grid.best_estimator_

# 首先在验证集上进行评估,验证集用于模型选择和调参,已经通过交叉验证间接使用
y_val_pred = best_model.predict(X_val)
print("性能评估(验证集):")
print(classification_report(y_val, y_val_pred))

# 现在使用测试集来评估最终模型的性能
y_test_pred = best_model.predict(X_test)
print("性能评估(测试集):")
print(classification_report(y_test, y_test_pred))
# 保存模型
model_filename = 'best_model.joblib'
dump(best_model, model_filename)

结束

随机森林是一种集成学习算法,它的核心思想是构建多个决策树并将它们的预测结果汇总得到最终结果。随机森林通过引入随机性来提升模型的准确性和鲁棒性,具体原理如下:

  1. 集成学习
    随机森林属于集成学习方法中的Bagging(自助聚合)策略。集成学习的核心思想是将多个弱学习器(模型表现稍好于随机猜测的模型)组合起来,形成一个强学习器(性能较好的模型)。在随机森林中,这些弱学习器就是决策树。

  2. 构建多个决策树
    随机森林通过在训练过程中构建多个决策树来工作。每棵树的训练数据都是通过从原始数据集中进行有放回抽样(也称为自助采样)得到的。这意味着,每棵树的训练数据集可能包含重复的样本,而有些原始数据则可能被省略。

  3. 引入随机性
    随机森林中的“随机”体现在两个方面:
    随机样本:如上所述,每棵树训练的数据是通过从原始数据集中有放回抽样得到的,使得每棵树的训练数据都有所不同。
    随机特征:在每个决策树的分裂过程中,算法随机选择一部分特征而不是所有特征,并在这些随机选出的特征中选择最佳分裂特征。这进一步增加了模型的多样性。

  4. 汇总预测结果
    随机森林的最终预测是通过汇总其所有决策树的预测结果得到的:
    分类任务:采用多数投票机制,即随机森林输出所有树中得票最多的类别作为最终预测结果。
    回归任务:计算所有树的预测结果的平均值作为最终预测结果。

  5. 优点
    准确性高:通过集成多个决策树,随机森林通常能提供高准确率的预测。
    防止过拟合:相较于单一决策树,随机森林引入的随机性帮助降低了模型过拟合的风险。
    灵活性:能够处理分类和回归任务,且能够处理特征数量大于样本数量的情况,处理缺失值,并提供特征的重要性评估。

  6. 缺点
    模型复杂度:随机森林模型包含多个决策树,可能导致模型较大,占用更多内存,预测过程较慢。
    解释性:相比于单一决策树,随机森林模型的解释性较差,因为你需要考虑多棵树的决策过程。

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

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

相关文章

“IT小百科 ”之“那些看不懂的HTTP状态码详解”

“IT小百科 ”之“那些看不懂的HTTP状态码详解” 小伙伴们应该遇到过在浏览器中打开某个网页,半天没打开,然后网页给出一个“ 提示码”,如下图所示 : 我相信看到这个提示的小伙伴普遍有点懵,这个提示码到底是什么意思…

【Frida】【Android】 07_爬虫之网络通信库HttpURLConnection

🛫 系列文章导航 【Frida】【Android】01_手把手教你环境搭建 https://blog.csdn.net/kinghzking/article/details/136986950【Frida】【Android】02_JAVA层HOOK https://blog.csdn.net/kinghzking/article/details/137008446【Frida】【Android】03_RPC https://bl…

结构体与位段的定义以及在内存中的存储

目录 结构体的声明 完全声明 不完全声明 结构体变量的定义和初始化 结构体的嵌套 结构体成员的直接访问和间接访问 结构体的自引用 typedef对结构体类型重命名 结构体内存对齐 对齐规则 练习 为什么存在内存对齐 修改默认对齐数 结构体传参 结构体实现位段 位段…

代码膨胀会破坏开发操作吗,它将如何影响编译时间?

Incredibuild 正潜心研究公司以及客户的未来发展趋势。 过去的一年举步维艰,但聪明的企业总是能够抓住机遇,将大部分业务自动化,保持敏捷度和竞争力,最佳的案例就是游戏工作室。这一年来,用户对新游戏或新版本的期待达…

Python 基础:标准库 -- math (数学函数)

1. 官方文档 math --- 数学函数 — Python 3.12.2 文档 cmath --- 关于复数的数学函数 — Python 3.12.2 文档 Python 中,可以使用内置的数学运算符,例如加法 ()、减法 (-)、除法 (/) 和乘法 (*) 进行简单的数学运算。不过,更高级的运算&a…

Python | Leetcode Python题解之第3题无重复字符的最长子串

题目: 题解: class Solution:def lengthOfLongestSubstring(self, s: str) -> int:# 哈希集合,记录每个字符是否出现过occ set()n len(s)# 右指针,初始值为 -1,相当于我们在字符串的左边界的左侧,还没…

Dubbo 原理及使用详解

嗨,亲爱的童鞋们!欢迎来到这次关于Dubbo的探险之旅。在编程的世界里,我们时常需要处理分布式系统的问题,而Dubbo作为一款开源的分布式服务框架,正是为了解决这类问题而生。本篇博客将深入浅出,带你领略Dubb…

transformers微调模型后使用pieline调用无法预测列表文本

初学transformers框架 使用trainer简单训练一个文本分类模型三个epoch后 使用piepline调用model 和tokenizer后 发现 传入列表文本后 输出就变得不正常了,为么子哇 如下图

常见的DC电源模块故障及解决方法

BOSHIDA 常见的DC电源模块故障及解决方法 DC电源模块广泛应用于各种电子设备中,为其提供稳定的直流电源。然而,由于长期使用或其他原因,DC电源模块有时会出现故障。本文将介绍一些常见的DC电源模块故障及相应的解决方法。 1. 输出电压异常&a…

如何使用免费的ChatGpt3.5

如何使用免费的ChatGpt 最近免费的gpt3.5很多都不怎么行了实在是太给力了尾声 最近免费的gpt3.5很多都不怎么行了 原因是什么呢?因为openai已经取消了免费的5刀赠送,那么这些人手上的免费的sses-key 用完后,就基本上全军覆没了,再…

探索http-vue-loader的奥秘:原理、使用方法、在Vue开发中的应用

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

SpringSecurity学习总结(三更草堂)

SpringSecurity安全框架的核心功能是认证和授权: 认证:验证当前访问系统的是不是本系统的用户,并且要确认具体是哪个用户。 授权:经过认证后判断当前用户是否具有进行某个操作的权限。 一般来说中大型的项目都是使用SpringSecurit…

无尘卷轴布:保障洁净环境的关键利器

在现代科技高度发达的今天,许多行业对于环境洁净度的要求越来越严格,比如半导体制造、医疗器械生产等。而在这些领域中,无尘卷轴布成为了一项至关重要的辅助工具,其独特的设计和材质特性,为保障洁净环境做出了突出贡献…

如何备份 Outline 导出的 Markdown 文件

前面,我撰写了两篇文章,介绍了: 《如何在本地环境安装 Outline》《使用 Outline 搭建企业、个人知识库面临的问题》 今天,我们继续这个话题。使用 Outline 搭建知识库,如何备份自己知识库内的资料。 Outline 底层使用…

【教学类-09-03】20240401细线迷宫图02(A4横版一页-2份竖版)

作品展示: 背景需求: 【教学类-09-02】20240331细线迷宫图01(A4横版一页1份横版)-CSDN博客文章浏览阅读779次,点赞28次,收藏6次。【教学类-09-02】20240331细线迷宫图01(A4横版一页1份横版&…

Sentinel入门Controller自动定义为资源

系列文章目录 文章目录 系列文章目录前言前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 以流…

【opencv】教程代码 —ShapeDescriptors

检测和显示图像的轮廓 在图像中搜索并显示轮廓边缘多边形、轮廓矩形和包围圆 获取包含检测到的轮廓的椭圆和旋转的矩形 图像轮廓检测和轮廓凸包 计算图像中的轮廓的矩(包括面积、重心等)并进行显示 创建和绘制一个多边形图像然后计算并显示图像上每个点到…

使用Vue3组件的计算属性

计算属性在Vue.js的computed选项中定义,它可以在模板上进行双向数据绑定以展示出结果或者进行其他处理。 通常用户会在模板中定义表达式,非常便利,Vue.js的设计初衷也是用于简单运算。但是在模板中放入太多的逻辑,会让模板变得臃…

项目管理中,项目延期的这些原因,你经历过几个

在项目管理过程中,项目延期是一种常见的现象,深入了解项目延期的原因,并制定相应的应对策略,对于提高项目管理的效率和成功率至关重要。 项目延期的主要原因: 1、估计不足:在项目初期,对项目…

iOS网络抓包工具大曝光:深入了解常用工具的工作原理与应用场景

摘要 本文将深入探讨iOS平台上常用的网络抓包工具,包括Charles、克魔助手、Thor和Http Catcher,以及通过SSH连接进行抓包的方法。此外,还介绍了克魔开发助手作为iOS应用开发的辅助工具,提供的全方面性能监控和调试功能。 在iOS应…