随机森林及应用

学习了B站视频《随机森林及应用》,记录一下学习笔记啦,原视频链接:Python机器学习算法实践Ⅲ-随机森林及应用。
一、随机森林属于集成学习,所以首先了解集成学习。在集成学习中,主要分为Bagging算法和Boosting算法。
Bagging(套袋法):从原始样本集中使用Bootstraping方法(一种有放回的抽样方法)随机抽取n个训练样本,共进行k轮抽取,得到k个训练集,训练k个模型。对于分类问题,由投票表决产生分类结果(所有模型的重要性相同)。
Boosting(提升法):对训练集中的每个样本建立权值,表示对样本的关注度。当某个样本被误分类的概率很高时,需要加大该样本的权值。进行迭代的过程中,每一步迭代都是一个弱分类器,用某种策略将其组合作为最终模型。(如AdaBoost给每个弱分类器一个权值,将其线性组合作为最终分类器。误差越小的弱分类器,权值越大。)
Bagging和Boosting的主要区别:

BaggingBoosting
样本选择Bootstrap随机有放回抽样。每一轮训练集不变,改变的是每一个样本的权重。
样本权重每个样本权重相等。根据错误率调整样本权重,错误率越大的样本权重越大。
预测函数所有预测函数的权重相等。误差越小的预测函数权重越大。
并行计算各个预测函数可以并行生成。各个预测函数必须按顺序迭代生成。

Bagging+决策树=随机森林,随机森林属于集成学习中的Bagging算法,不同的数据集可以生成不同的决策树,多棵树解决了决策树泛化能力弱的缺点。
同时,随机森林在bagging的基础上更进一步:
1、样本的随机:从样本集中用Bootstrap随机选取n个样本。
2、特征的随机:从所有属性中随机选取K个属性(K小于总属性个数),选择最佳分割属性作为节点建立CART决策树(也可以是其他类型分类器,如SVM、Logistics)。
3、重复以上两步m次,即建立了m棵CART决策树。
4、m个CART形成随机森林,通过投票表决决定数据属于哪一类(投票机制有一票否决制、少数服从多数、加权多数)。
生成树时没有用到的样本点所对应的类别可由生成树估计,与其真实类别比较即可得到袋外预测误差,无法获得验证集时,这是随机森林的一大优势。
二、以Kaggle上的比赛泰坦尼克号数据练习实践,使用随机森林对乘客遇难或者幸存进行预测分类。原始数据集各特征含义如下:
在这里插入图片描述
在正式应用算法进行预测分类前,首先需要初步了解数据,分析各特征之间的关系以及与预测目标特征的关系,方便后续数据缺失和异常值的处理,以及模型特征选取。本文只是初步实践随机森林,就不具体详述啦,参考内容:kaggle(一):随机森林与泰坦尼克,文章里有具体的数据分析及建模的整个过程叙述,总结块也有很多相关文章可以进一步了解。
查看数据概况如下,了解各特征类型,同时注意到部分特征存在缺失值,在输入模型前首先需要处理数据。
在这里插入图片描述
数据处理相关代码如下,将PassengerId、Name、Ticket、Cabin等特征删除,其中Name、Ticket、Cabin等特征在优化模型效果时,可以进一步处理作为特征输入。对于缺失的Age数据,根据相关性分析发现其与SibSp、Parch、Pclass这些特征相关性高,于是利用这三个特征将数据分成不同集合,用缺失数据所在集合的Age平均值填充,结果验证填充后Age数据分布与填充前基本一致,说明方法可行。Embarked特征缺失数据只有2个,直接用出现频率最高的值进行填充。Fare特征存在偏态分布情况,利用Log转换调整分布。离散型特征Embarked、Sex将特征值类别映射为数字表示。

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import learning_curve
from sklearn.model_selection import GridSearchCVtrain = pd.read_csv('train.csv')    #读取训练数据集
#print(train.info())	#输出数据信息train.drop(['PassengerId', 'Name','Ticket', 'Cabin'],axis=1,inplace=True)   #删除部分特征,inplace=True表示直接对原dataFrame进行操作#补全缺失的年龄数据,根据Age和SibSp、Parch、Pclass相关性高,利用这三个特征将数据分为不同的集合,用缺失数据所在集合的平均值进行填充
index = list(train[train['Age'].isnull()].index)    #获得缺失年龄的样本索引
Age_mean = np.mean(train[train['Age'].notnull()]['Age'])    #计算所有年龄数据的平均值
copy_data = train.copy()    #复制数据集方便后边集合参照,并且可以直接在原数据上填充
for i in index:filling_age = np.mean(copy_data[(copy_data['Pclass'] == copy_data.iloc[i]['Pclass'])& (copy_data['SibSp'] == copy_data.iloc[i]['SibSp'])& (copy_data['Parch'] == copy_data.iloc[i]['Parch'])]['Age']) #与缺失样本相同SibSp、Parch、Pclass的集合的年龄平均值进行填充if not np.isnan(filling_age):   #同一集合所有样本年龄缺失时,集合年龄均值为空,填充所有年龄数据的平均值train['Age'].iloc[i] = filling_ageelse:train['Age'].iloc[i] = Age_mean#使用频率最高的值来填充Embarked特征缺失值
most_fre = train[train['Embarked'].notnull()]['Embarked'].value_counts().index[0]   #获得频率最高的值
train['Embarked'].fillna(most_fre, inplace=True)    #填充缺失值
train['Embarked'] = train['Embarked'].map({'S': 0,'C': 1,'Q': 2}).astype(int)   #将三个特征值映射为三个数字表示#Log转换调整Fare的分布
train['Fare'] = train['Fare'].map(lambda i: np.log(i) if i > 0 else 0)#对性别进行0、1编码
train['Sex'].replace('male', 0, inplace=True)
train['Sex'].replace('female', 1, inplace=True)
#print(train.info())

训练评估模型的相关代码如下:

#绘制学习曲线分析算法性能
def plot_learning_curve(estimator,title,X,y):plt.figure()    #初始化图像plt.title(title)    #设置标题plt.xlabel('Training examples') #设置坐标轴名称plt.ylabel('Score')train_sizes, train_scores, test_scores = learning_curve(estimator, X, y, cv=10, train_sizes=np.linspace(.1, 1.0, 5))    #调用learning_curve函数绘制学习曲线,cv使用10折交叉验证train_scores_mean = np.mean(train_scores, axis=1)   #训练样本分数平均值train_scores_std = np.std(train_scores, axis=1) #训练样本分数标准差test_scores_mean = np.mean(test_scores, axis=1) #测试样本分数平均值test_scores_std = np.std(test_scores, axis=1)   #测试样本分数标准差plt.grid()  #设置网格plt.fill_between(train_sizes,train_scores_mean - train_scores_std,train_scores_mean + train_scores_std,alpha=0.1,color='g')   #填充距离均值上下一个标准差的区域,alpha设置透明度plt.fill_between(train_sizes,test_scores_mean - test_scores_std,test_scores_mean + test_scores_std,alpha=0.1,color='r')plt.plot(train_sizes,train_scores_mean,'o-',color='g',label='training score')   #绘制学习曲线plt.plot(train_sizes,test_scores_mean,'o-',color='r',label='testing score')plt.legend(loc='best')  #设置图例return plty = train['Survived']   #分离数据特征集和结果集
X = train.drop(['Survived'], axis=1).values
classifier=RandomForestClassifier(oob_score=True)	#初始化随机森林模型
classifier.fit(X,y) #对特征集进行分类预测
print(classifier.oob_score_)    #袋外估计得分
g = plot_learning_curve(classifier, 'RFC', X, y)    #绘制学习曲线
plt.show()

运行发现模型的袋外估计得分为0.807,效果表现良好。其学习曲线如下,训练误差接近0,相比之下测试误差较大,模型存在过拟合问题,需要调整参数进行改善。
在这里插入图片描述
利用网格搜索调参的相关代码如下,调整了n_estimators、max_depth、min_samples_leaf这三个影响较大的参数。

#调整n_estimators
param_test={'n_estimators':range(10,101,10)}   #设置参数范围
gsearch = GridSearchCV(estimator=RandomForestClassifier(), param_grid=param_test, cv=5, scoring='accuracy') #利用网格搜索调参,cv设置交叉验证参数,用准确率作为评价标准
gsearch.fit(X,y)
print(gsearch.best_params_,gsearch.best_score_)  #输出最佳结果的参数,以及参数对应的分数#调整max_depth
param_test={'max_depth':range(2,12,2)}   #设置参数范围
gsearch = GridSearchCV(estimator=RandomForestClassifier(n_estimators=50), param_grid=param_test, cv=5, scoring='accuracy') #利用网格搜索调参,cv设置交叉验证参数,用准确率作为评价标准
gsearch.fit(X,y)
print(gsearch.best_params_,gsearch.best_score_)	#输出最佳结果的参数,以及参数对应的分数#调整min_samples_leaf
param_test={'min_samples_leaf':range(2,8,1)}   #设置参数范围
gsearch = GridSearchCV(estimator=RandomForestClassifier(n_estimators=50,max_depth=8), param_grid=param_test, cv=5, scoring='accuracy') #利用网格搜索调参,cv设置交叉验证参数,用准确率作为评价标准
gsearch.fit(X,y)
print(gsearch.best_params_,gsearch.best_score_)  #输出最佳结果的参数,以及参数对应的分数

调参过程中各参数最佳结果如下:
{‘n_estimators’: 50} 0.8137216747222397
{‘max_depth’: 8} 0.8305567760969179
{‘min_samples_leaf’: 2} 0.8249576297784195
将模型参数设置为以上三个数值,重新训练模型,发现袋外估计得分为0.819,有一点点提升。此时学习曲线如下,可以看到过拟合得到一定程度缓解。
在这里插入图片描述
将调参后的模型对Kaggle上的test.csv进行预测,得分是0.7799,后来尝试处理了一开始删除的Name、Ticket、Cabin等特征,对特征进行选择再训练模型,经过多次尝试,Kaggle提交最高历史得分也就0.78229,还是需要努力。

(结语个人日记:前段时间给自己放了一周的假期,每天什么都不学,什么都不想,就只是从早到晚边看视频教程边钩织,新手成功钩出了一只小猫,自己看着倒是挺可爱的哈哈哈。用QQ的频率越来越低了,偶然间打开,算是告别了,过去感到孤独时的思想寄托的告别,小心翼翼隐藏自己但经常关注对方动态的告别,不知道是没有结果的双向关注还是只是自己一个人的独角戏的告别。四年的时间改变了很多,也改变了以后的轨迹,只希望自己可以更加勇敢。)

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

随机森林(Random Forests)介绍

1.决策树(Decision Tree) 决策树是一种树形结构,其中每个内部节点表示一个属性上的测试,每个分支代表一个测试输出,每个叶节点代表一种类别。常见的决策树算法有C4.5、ID3和CART。ID3算法用的是信息增益,C…

使用随机森林进行特征选择

绘制随机森林每棵树的决策边界 首先导入必要的库函数: from sklearn.ensemble import RandomForestClassifier from sklearn.datasets import make_moons from sklearn.model_selection import train_test_split import matplotlib.pyplot as plt import numpy as…

python实现随机森林

定义: 随机森林指的是利用多棵决策树对样本进行训练并预测的一种分类器。可回归可分类。 所以随机森林是基于多颗决策树的一种集成学习算法,常见的决策树算法主要有以下几种: 1. ID3:使用信息增益g(D,A)进行特征选择 2. C4.5&…

教你体验目前最火AI - 在craft AI assistant 使用chatGPT

atGPT大火之后,很多人都想体验一把,今天为大家推荐一种免费方式,体验chatGPT同款内核的AI助手。 craft AI assistant Craft 推出的 AI 助手产品 Craft AI Assistant,并且现在就可以使用。根据 Craft 官方介绍,Craft …

【ChatGPT+AI】持续更新

ChatGPT的缘分 ChatGPT的缘分 一、小白必知1.1ChatGPT是什么?1.2ChatGPT怎么用?1.3ChatGPT登录注意事项 二、ChatGPT实战2.1什么Prompt?2.2ChatGPT怎么发图片2.3ChatGPT快速制作PPT 三、其他AI与免费镜像网站四、星球介绍 ChatGPT的缘分 大家…

DetectGPT VS ChatGPT:AI反击战?

1.背景 随着 ChatGPT 的持续火爆,现在无论哪个行业,几乎是人尽皆知。同时,利用 ChatGPT 进行造假作弊的情况也是层出不穷,尤其是在教育和传媒行业。在美国的一项千人调查中,有89%的学生表示在家庭作业中使用了 ChatGP…

多国拟发ChatGPT禁令 关“野兽”的笼子要来了?

“人工智能想越狱“、”AI产生自我意识”、“AI终将杀死人类”、“硅基生命的进化”.......曾经只在在赛博朋克等科技幻想中出现的剧情,在今年走向现实,生成式自然语言模型正在遭受前所未有的质疑。 聚光灯下最瞩目的那个是ChatGPT,3月底到4…

ChatGPT从入门到精通,深入认识Prompt

ChatGPT从入门到精通,一站式掌握办公自动化/爬虫/数据分析和可视化图表制作 全面AI时代就在转角 道路已经铺好了 “局外人”or“先行者” 就在此刻 等你决定 让ChatGPT帮你高效实现职场办公!行动起来吧。欢迎关注专栏 。。。。。 还有更多。。。。&…

【Prompting】ChatGPT Prompt Engineering开发指南(1)

ChatGPT Prompt Engineering开发指南1 Prompting指南设置 提示原则策略1:使用分隔符清楚地指示输入的不同部分策略2:要求结构化输出策略3:让模型检查条件是否满足策略4: “Few-shot”提示 原则2:给模型时间“思考”策略1&#xff…

【ChatGPT】Prompt Engineering入门

Prompt Engineering入门 一、什么是 Prompt Engineering?二、我们还需要学习 PE 吗?三、Prompt基础原则 一、什么是 Prompt Engineering? 简单的理解它是给 AI 模型的指令。它可以是一个问题、一段文字描述,甚至可以是带有一堆参数…

大型语言模型LLM的基础应用

ChatGPT是由人工智能研究实验室OpenAI在2022年11月30日发布的全新聊天机器人模型,一款人工智能技术驱动的自然语言处理工具。它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,真正像人类一样来聊天交流,甚…

【ChatGPT】怎样计算文本token数量?

ChatGPT 按 token 计费,当你把一段长文本发送给它时,你如何计算该文本消耗了多少 token? 在非流式访问的情况下,ChatGPT 的回复信息中包含有 token 消耗数量。但是在流式访问的情况下,回复信息里没有 token 数量&…

微软用 ChatGPT 改写 Bing、Edge,市值一夜飙涨 5450 亿元!

整理 | 屠敏 出品 | CSDN(ID:CSDNnews) 已经没有什么能够阻挡科技巨头追逐 ChatGPT 的步伐,前有 Google CEO 桑达尔皮查伊亲自下场官宣 Bard AI 对话式系统的到来,后有微软更快一步地推出了应用 ChatGPT 的 Bing 搜索引…

ChatGPT和DALLE-2级联后,输出效果震撼了…

源|机器之心 文|张倩、袁铭怿 生成式 AI 正在变革内容的生产方式。 在过去的一周,相信大家都被 ChatGPT 刷了屏。这个强大的对话 AI 仅用 5 天时间用户量就突破了 100 万。大家用各种方式测试着它的能力上限,其中一种测试方式就是…

ChatGPT 的能力上限将被突破

最近,一篇名为《Scaling Transformr to 1M tokens and beyond with RMT》的论文在 AI 界引起了广泛热议。 该论文提出一种名为 RMT 的新技术,如果能够成功应用,那将把 Transformer 的 Token 上限扩展至 100 万,甚至更多。 GitHub…

ChatGPT 的 10 种集成模式:从开源 AI 体验平台 ClickPrompt 中受到的启发

和国内外的很多公司一样,在 Open AI 公司开放了 ChatGPT API 接口之后,我们也在探索如何去结合到业务中。而在探索的过程中,我们发现了一个问题,大部分的业务人员并不了解 AI 的能力,所以我们开源构建了 ClickPrompt&a…

聊天新纪元:通过和ChatGPT聊天就能开发自己的Chrome插件

文章目录 1. 前言1.1 ChatGPT是什么1.2 ChatGPT能干什么1.3 我要让ChatGPT干什么 2. 环境准备3. 交互过程3.1 发送需求3.2 询问执行3.3 继续提问3.4 加载代码3.5 执行插件3.6 执行插件 4. 生成的代码4.1 manifest.json4.2 popup.css4.3 popup.js4.4 popup.html 5. 总结 1. 前言…

学术科研专用ChatGPT来了!

点击上方“小白学视觉”,选择加"星标"或“置顶” 重磅干货,第一时间送达 【导读】最近,一位开发者在GitHub上开源的「科研工作专用ChatGPT」项目大受好评。论文润色、语法检查、中英互译、代码解释等等一键搞定。 自从ChatGPT发布之…

今天,小呆呆第一次尝新ChatGPT,并小火了一把

前言 你盼世界,我盼望你无bug。Hello 大家好!我是霖呆呆。 当我们遇到技术难题或生活困惑时,往往会寻求专业人士的帮助或者在网络上搜索相关问题。但你是否曾想过,如果有一种AI程序能够帮你解决问题,理解人类语言的含义…

ChatGPT真的有那么牛吗?

ChatGPT真的有那么牛吗?ChatGPT真的有那么牛吗? 作为一款大型语言模型,ChatGPT确实具有很高的自然语言处理和生成能力,可以生成流畅、准确和有逻辑性的语言,而且能够理解和回答广泛的问题。 它是目前最先进和最强大的…