机器学习 -- 随机森林DEMO

场景

之前看一些歌手或者演员选取节目的时候,上面不是一个评委,少则三五个,多则几十个,当做重要决定时,大家可能都会考虑吸取多个专家而不只是一个人的意见。机器学习也是一样的,机器学习中分为两种,投票选举和再学习,其中投票选举类似于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. 缺点
    模型复杂度:随机森林模型包含多个决策树,可能导致模型较大,占用更多内存,预测过程较慢。
    解释性:相比于单一决策树,随机森林模型的解释性较差,因为你需要考虑多棵树的决策过程。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

开源AI引擎:自然语言处理技术在人岗匹配中的应用

一、应用场景介绍 如何从海量的求职者中精准地匹配到合适的候选人,是每个人力资源部门都需要解决的问题。自然语言处理(NLP)技术的发展为人岗匹配提供了新的解决方案。通过信息抽取和文本分类技术,企业可以更高效地分析职位描述和…

数据结构堆

前言: 在前面我们已经学习了数据结构的基础操作:顺序表和链表及其相关内容,今天我们来学一点有些难度的知识——数据结构中的二叉树,今天我们先来学习二叉树中堆的知识,这部分内容还是非常有意思的,下面我们…

苹果App上架指南

苹果上架要求是苹果公司对于提交应用程序到苹果商店上架的要求和规定。这些要求主要是为了保证用户体验、应用程序的质量和安全性。以下是苹果上架要求的详细介绍:1. 应用程序的内容和功能必须符合苹果公司的规 苹果上架要求是苹果公司对于提交应用程序到苹果商店上…

APS54083 大功率深度调光降压恒流驱动IC PWM 线性调光 车灯IC

特点 ◆ 宽输入电压范围:5V~100V ◆ 可设定电流范围:10mA~2000mA ◆ 固定关断时间控制 ◆ 内置抖频电路,降低对其他设备的 EMI 干扰 ◆ 过温保护 ◆ 调光功能:线性调光/PWM 调光 ◆ PWM 调光深度小于…

机器学习——卷积的变种

机器学习——卷积的变种 卷积神经网络(Convolutional Neural Networks, CNNs)是深度学习领域中最重要的技术之一,它在图像处理、语音识别、自然语言处理等领域取得了巨大成功。在CNN中,卷积层是最核心的组成部分之一,…

【解决方案】荣耀系统Android8.0 system目录Read-only file system

本来以为直接把Charles证书改成系统证书格式,然后通过mt管理器root之后移动到系统证书目录就行了,结果访问baidu仍然显示网络错误,折腾一晚上。安装为用户证书,又与系统证书冲突。 手机型号:荣耀v10 EMUI&#xff1a…

ALPHA开发板上的PHY芯片驱动:LAN8720驱动

一. 简介 前面文章了解到,Linux内核是有提供 PHY通用驱动的。 本文来简单了解一下ALPHA开发板上的 PHY网络芯片LAN8720的驱动。是 LAN8720芯片的公司提供的 PHY驱动。 二. ALPHA开发板上的PHY芯片驱动:LAN8720驱动 我 们 来 看 一 下 LAN8720A 的 …

Linux系统下安装ElasticSearch

一、228环境ES使用安装 1、检验ES服务是否安装成功的方法 (1)查看Elasticsearch进程是否成功 ps -ef|grep elasticsearch (2)linux elasticsearch下访问(curl带认证访问) curl --user elastic:Zhes.13…

基于ssm的企业台账管理平台(java项目+文档+源码)

风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于ssm的企业台账管理平台。项目源码以及部署相关请联系风歌,文末附上联系信息 。 项目简介: 管理员:首页、个人…

使用argocd作为cd流程

一、前言 讲述关于argocd在cicd流程中的使用,ci这里使用gitlabjenkins流水线的方式,jenkins用于拉代码打包、构建镜像、变更yaml文件的镜像、推送变更的yaml文件到gitlab的gitops仓库中,最后再有argocd实现cd流程, 二、使用 关于…

抢占AI算力头筹,宁畅发布全局智算新战略AI算力栈

1、在以大模型为焦点的新一轮AI竞赛中,智能计算作为推动产业发展的关键引擎,已经不再局限于算力性能这一单一竞争要素。 2、算法协同优化、数据处理能力、模型可解释性以及与特定行业应用的融合度,都成为了智能计算能否成功推动技术创新和实际…

用可视化案例讲Rust编程5.用泛型和特性实现自适配绘制和颜色设置

上一节我们讲了用泛型实现返回结果,这一节我们来讲讲在函数签名里面使用泛型来对输入参数进行自适配。 先看UML设计图: 好吧,看起来有点复杂,我们一个个来解释。 首先定义的是一个生成绘图元素需要的参数结构,并且定义个特性&am…

紫外线吸收剂为光稳定剂代表产品 塑料及化妆品领域为其主要需求端

紫外线吸收剂为光稳定剂代表产品 塑料及化妆品领域为其主要需求端 紫外线吸收剂指能吸收阳光及荧光光源中的紫外线部分的一种光稳定剂。紫外线吸收剂具有热稳定性好、可吸收紫外线、化学稳定性好、能增强目标物色泽稳定性、毒性低等优势,在塑料、化妆品、纺织品、涂…

大厂级别交互设计秘籍:一篇读懂

交互式设计属于UI设计之一,也是当今流行的设计之一。许多大型工厂非常需要交互式设计人才,这一趋势也引起了许多毕业生和UI设计爱好者的广泛关注,那么你知道大型工厂设计师必要的交互式设计是什么吗?这篇文章将带你了解。 什么是…

【PFA树脂交换柱】实验室高纯PFA材质过滤柱耐受电子级氢氟酸含氟树脂层析柱

PFA离子交换柱,也叫PFA层析柱、PFA过滤柱等,其原理是利用吸附剂对不同化合物有不同吸附作用和不同化合物在溶剂中的不同溶解度,用适应溶剂使混合物在填有吸附剂的柱内通过,使复杂的混合物达到分离和提纯的目的。 柱体为透明PFA材…

再生式收音机填坑记

年前踩坑再生式收音机,还是得找机会把坑填上,最终选定了K8TND的方案,其实与Mr. Kitchen的也基本差不多。电路图如下: 实物图如下: 实际接收效果还不错,但是感觉频段上哪哪都是中国之声,对这种…

牛仔裤什么牌子的好?国产质量最好牛仔裤大汇总

现在的裤子款式多到可以每天不重样,但大家总是买不到合适。现在虽然裤子款式非常多,但是大部分的裤子版型设计有很多问题,甚至还有一些商家为了利润而不断压缩成本,采用劣质面料,导致出现各种问题。 今天我就结合我的专…

openGauss 6.0.0-RC1 版本正式发布!

openGauss 6.0.0-RC1版本正式上线! openGauss 6.0.0-RC1是社区最新发布的创新版本,版本生命周期为0.5年。(创新版本命名:由原方案 XX.1.0 Preview (例:5.1.0 preview),调整为现方案 XX.0.0-RCx&…

scRNA+bulk+MR:动脉粥样硬化五个GEO数据集+GWAS,工作量十分到位

今天给大家分享一篇JCR一区,单细胞bulkMR的文章:An integrative analysis of single-cell and bulk transcriptome and bidirectional mendelian randomization analysis identified C1Q as a novel stimulated risk gene for Atherosclerosis 标题&…

营业执照印章检测识别技术落地项目

项目效果演示: 输入图片,对电子版和拍摄版都具体良好的效果 示例一: 印章识别 示例二: 拍摄版本,清晰度差 识别结果 训练模型样本数量:一万张印章样本训练 样本上准确率99% 印章文字识别率100% 印章文…