机器学习实战3-随机森林算法

news2024/10/5 18:27:13

文章目录

    • 集成算法概述
    • sklearn中的集成算法模块
  • RandomForestClassifier
    • 重要参数&&随机森林的分类器
      • 控制基评估器的参数
      • n_estimators
      • sklearn建模流程复习
        • 交叉验证
        • 我们进行10次交叉验证,观察随机森林和决策树的效果
        • n_estimators学习曲线
      • bootstrap & oob_score
    • 随机森林回归器
    • 随机森林回归填补缺失值案例
    • 机器学习中调参的基本思想
    • 实例随机森林在乳腺癌数据上的调参
      • 随机森林调参第一步:无论如何先调n_estimators
      • 调max_depth
      • 调min_samples_leaf
      • 调min_samples_split
      • 调criterion

集成算法概述

22.png
3.png
4.png
对于随机森林这个集成算法来说,它的基评估器就是决策树,决策树长成的森林就是随机森林也就是集成评估器。

sklearn中的集成算法模块

sklearn中的集成算法模块是ensemble,写法:sklearn.ensemble
2.png

RandomForestClassifier

随机森林是非常具有代表性的Bagging集成算法,它的所有基评估器都是决策树,分类树组成的随机森林就叫做随机森林的分类器,回归树所集成的森林就叫随机森林回归器

重要参数&&随机森林的分类器

控制基评估器的参数

3.png

n_estimators

这时森林中树木的数量,就是基评估器的数量,这个参数对随机森林模型的精确性影响是单调的n_estimators越大,模型的结果往往越好,但是相应的任何模型都有决策边界,当n_estimators达到一定的数值之后,随机森林的精确性就不会再提升了

sklearn建模流程复习

#实例化
#训练集带入实例化后的模型去训练,使用的接口是fit
#使用其他接口将测试集导入我们训练好的模型去获取我希望获取的结果(score, Ytest是我们预测出来的标签)

sklearn中所有的属性和标签是分开导入的

# 实例化
clf = DecisionTreeClassifier(random_state=0)
rfc = RandomForestClassifier(random_state=0)
# 训练
clf = clf.fit(Xtrain, Ytrain)
rfc = rfc.fit(Xtrain, Ytrain)

score_c = clf.score(Xtest, Ytest)
score_r = rfc.score(Xtest, Ytest)
print(f"Single Tree score:{score_c}")
print(f"RandomForest score:{score_r}")

4.png

交叉验证

# 交叉验证
from sklearn.model_selection import cross_val_score
import matplotlib.pyplot as plt
rfc = RandomForestClassifier(n_estimators=25)
rfc_s = cross_val_score(rfc, wine.data, wine.target, cv = 10)
clf = DecisionTreeClassifier()
clf_s = cross_val_score(clf, wine.data, wine.target, cv = 10)
plt.plot(range(1, 11), rfc_s, label="随机森林", color = 'red')
plt.plot(range(1, 11), clf_s, label="决策树", color = 'blue')
plt.legend()
plt.show()

5.png

这里在画图的时候也是出现了一点小插曲,我们matplotlib不能直接在图中出现中文,这里可以下载中文字体百度解决

我们进行10次交叉验证,观察随机森林和决策树的效果

rfc_l = []
clf_l = []

for i in range(10):
    rfc = RandomForestClassifier(n_estimators=25)
    rfc_s = cross_val_score(rfc, wine.data, wine.target, cv=10).mean()
    rfc_l.append(rfc_s)
    
    clf = DecisionTreeClassifier()
    clf_s = cross_val_score(clf, wine.data, wine.target, cv=10).mean()
    clf_l.append(clf_s)

plt.plot(range(1, 11), rfc_l, color = 'red', label = "随机森林")
plt.plot(range(1, 11), clf_l, color = 'green', label = "决策树")
plt.legend()
plt.show()

6.png
从交叉验证的结果看,随机森林的效果要好于决策树
8.png
9.png

n_estimators学习曲线

superpa = []
for i in range(200):
    rfc = RandomForestClassifier(n_estimators=i+1, n_jobs=-1)
    rfc_s = cross_val_score(rfc, wine.data, wine.target, cv=10).mean()
    superpa.append(rfc_s)
print(max(superpa), superpa.index(max(superpa)))
plt.figure(figsize=[20, 5])
plt.plot(range(1,201), superpa)
plt.show()

7.png
可以从学习曲线中看到,在前期随机森林的精确度随n_estimators的增大而增大,后面随n_estimators的增大上下波动

bootstrap & oob_score

有放回抽样,自助集平均包含63%的原始数据
bootstrap参数默认为True,代表默认采用这种有放回的抽样技术

10.png
11.png
12.png
也就是说我们在使用随机森林时,可以不自己设置测试集和训练集,因为有一些数据本身就没有被装进袋中,我们可以用这些数据作为测试集,oob_score可以帮组我们查看袋外数据测试的结果

rfc = RandomForestClassifier(n_estimators=25, random_state=2, oob_score=True)
rfc = rfc.fit(wine.data, wine.target)

13.png

也就是说我们在使用随机森林的时候可以自己划分测试集和训练集进行交叉验证,当然我们也可以用袋外数据进行验证

除了有以上比较重要的参数外…feature_importances_这个属性也是有的,接口是用来得到我们输入测试集后得出来的结果的也是用来训练的
sklearn中随机森林返回的结果是每个标签返回的概率

rfc = RandomForestClassifier(n_estimators=25)
rfc = rfc.fit(Xtrain, Ytrain)
rfc.score(Xtest, Ytest)

14.png

rfc.apply(Xtest)

15.png

rfc.predict(Xtest)

16.png

rfc.predict_proba(Xtest)

17.png
这里返回的是每一个样本对应每一个标签的概率

rfc.predict_proba(Xtest).shape

18.png
有多少个样本就有多少行,有多少个标签就有多少列

随机森林回归器

相较于随机森林分类器,随机森林回归器是没有predict_proba这个接口的,因为回归问题并没有某一样本被划分到某个标签的概率
导库

from sklearn.datasets import load_diabetes
from sklearn.model_selection import cross_val_score
from sklearn.ensemble import RandomForestRegressor

建模+交叉验证

regressor = RandomForestRegressor(n_estimators=100
                                  ,random_state=0
)
diabets = load_diabetes()
cross_val_score(regressor, diabets.data, diabets.target, cv=10, scoring="neg_mean_squared_error")

随机森林回归填补缺失值案例

sklearn中有一个用于填补缺失值的类

sklearn.impute.SimpleImputer

导库

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.datasets import load_diabetes
from sklearn.impute import SimpleImputer
from sklearn.ensemble import RandomForestRegressor

导入数据

dataset = load_diabetes()
dataset.data.shape

备份数据

x_full, y_full = dataset.data, dataset.target
n_samples = x_full.shape[0]
n_features = x_full.shape[1]

添加缺省值

#为完整的数据放入缺失值
#首先确定我们希望放入的缺失数据的比例
rng = np.random.RandomState(0)
missing_rate = 0.5
n_mising_samples = int(np.floor(n_samples * n_features * missing_rate))

# 所有数据要随机遍布在数据集的各行各列中,而一个缺失值会需要一个行索引和一个列索引,所以我们就需要创造这样的数组
missing_features = rng.randint(0, n_features, n_mising_samples)
missing_samples = rng.randint(0, n_samples, n_mising_samples)
# rng.randint(下限,上限, n)的作用是在上限和下限之间取出n个整数

x_missing = x_full.copy()
y_missing = y_full.copy()
x_missing[missing_samples, missing_features] = np.nan

X_missing = pd.DataFrame(x_missing)

19.png
用平均值(mean)来填补缺失值

from sklearn.impute import SimpleImputer
imp_mean = SimpleImputer(missing_values=np.nan, strategy='mean')
X_missing_mean = imp_mean.fit_transform(X_missing)
X_missing_mean_ = pd.DataFrame(X_missing_mean)
X_missing_mean_

20.png
可以看到我们的数据集中的空缺值已经被填补完整了
我们除了通过观察判断是否还有缺失值,还可以已通过info(),或则isnull()

用0来填补缺失值

imp_0 = SimpleImputer(missing_values=np.nan, strategy="constant", fill_value=0)
x_missing_0 = imp_0.fit_transform(x_missing)
x_missing_0_ = pd.DataFrame(x_missing_0)
x_missing_0_

21.png
随机森林填补缺失值
3.png

sort和argsort的区别
4.png
5.png

for i in sortedindex:
    df = X_missing_reg
    #构建新标签
    fillc = df.iloc[:, i]
    # 构建新特征矩阵,剔除我们要预测的属性列+原始标签
    df = pd.concat([df.iloc[:, df.columns != i], pd.DataFrame(y_full)], axis = 1) # 前面是我们要连接的所有的内容,后面的参数是我们希望如何连接,按行还是按列
    # 在新特征矩阵里面缺失值用0来填补
    df_0 = SimpleImputer(missing_values=np.nan, strategy='constant', fill_value=0).fit_transform(df)
    # 找我们的训练集和测试集
    Ytrain = fillc[fillc.notnull()]
    Ytest = fillc[fillc.isnull()]
    Xtrain = df_0[Ytrain.index, :]
    Xtest = df_0[Ytest.index, :] # 我们这里不需要Ytest的值因为这些值都是空的我们需要的是Ytest的索引
    # 实例化
    rfc = RandomForestRegressor(n_estimators=100)
    rfc = rfc.fit(Xtrain, Ytrain) # 导入训练集训练
    Ypredict = rfc.predict(Xtest) # 用predict接口将Xtest导入得到预测结果
    X_missing_reg.loc[X_missing_reg.iloc[:, i].isnull(), i] = Ypredict

3.png

对填充好的数据进行建模

X = [x_full, X_missing_mean, x_missing_0, X_missing_reg]
mse = []
for x in X:
    estimator = RandomForestRegressor(n_estimators=100, random_state=0) # 实例化
    score_s = cross_val_score(estimator, x, y_full, scoring='neg_mean_squared_error', cv=5).mean()
    mse.append(score_s*(-1))

作图

X_labels = ['Full data'
            ,'Mean Imputation'
            ,'Zero Imputation'
            ,'Regressor Imputation'
           ]
colors = ['r', 'g', 'b', 'orange']
plt.figure(figsize=(12, 6)) # 画出画布
ax = plt.subplot(111) #plt.subplot画出子图
for i in range(len(mse)):
    ax.barh(i, mse[i], color = colors[i], alpha=0.6, align='center')
ax.set_title("Imputation Teachniques with diabetes Data")
ax.set_xlim(left=np.min(mse) * 0.9, right=np.max(mse)*1.1)
ax.set_yticks(np.arange(len(mse)))
ax.set_xlabel('MSE')
ax.set_yticklabels(X_labels)
plt.show()

不同方式填补缺失值的效果图
4.png

机器学习中调参的基本思想

5.png
6.png
7.png
树模型天生比较复杂学习能力比较好很容易过拟合,我们一般都是向模型复杂度低的方向调节

实例随机森林在乳腺癌数据上的调参

导库

from sklearn.datasets import load_breast_cancer
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import GridSearchCV
from sklearn.model_selection import cross_val_score
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

导入数据集

data = load_breast_cancer()
data.data.shape

8.png
9.png
建模

rfc = RandomForestClassifier(n_estimators=100, random_state=90)
score_pre = cross_val_score(rfc, data.data, data.target, cv=10).mean()
score_pre

10.png

随机森林调参第一步:无论如何先调n_estimators

11.png

scorel = []
for i in range(0, 200, 10):
    rfc = RandomForestClassifier(n_estimators=i+1
                                 ,n_jobs=-1
                                 ,random_state=90
    )
    score = cross_val_score(rfc, data.data, data.target, cv=10).mean()
    scorel.append(score)

画图

print(max(scorel), scorel.index(max(scorel)) * 10 + 1)
plt.figure(figsize=[20, 5])
plt.plot(range(1, 201, 10), scorel, label='n_estimators学习曲线')
plt.legend()
plt.show()

12.png
这一步我们只能大致确定一个范围,接下来我们要进一步细化我们的学习曲线

scorel = []
for i in range(65, 75, 1):
    rfc = RandomForestClassifier(n_estimators=i+1
                                 ,n_jobs=-1
                                 ,random_state=90
    )
    score = cross_val_score(rfc, data.data, data.target, cv=10).mean()
    scorel.append(score)

print(max(scorel), [*range(65,75)][scorel.index(max(scorel))])
plt.figure(figsize=[20, 5])
plt.plot(range(65, 75, 1), scorel, label='n_estimators学习曲线')
plt.legend()
plt.show()

13.png
14.png

调max_depth

# 调整max_features
param_grid = {'max_features' : np.arange(5, 30, 1)}

rfc = RandomForestClassifier(n_estimators=72
                            ,random_state=90
                            )
GS = GridSearchCV(rfc, param_grid, cv=10)
GS.fit(data.data, data.target)

15.png
可以看到经过调整我们的得分有上升了

调min_samples_leaf

#调整min_samples_leaf
param_grid={'min_samples_leaf':np.arange(1, 1+10, 1)}
#对于min_samples_split和min_samples_leaf,一般是从他们的最小值开始向上增加10或20
#面对高维度高样本量数据,如果不放心,也可以直接+50,对于大型数据,可能需要200~300的范围
#如果调整的时候发现准确率无论如何都上不来,那可以放心大胆调一个很大的数据,大力限制模型的复杂度
rfc = RandomForestClassifier(n_estimators=39
                             ,random_state=90
                           )
GS = GridSearchCV(rfc,param_grid,cv=10)
GS.fit(data.data,data.target)

16.png
可以看到我们的得分下降了,说明我们的模型复杂度已经在泛化误差最低点的左边了

调min_samples_split

#调整min_samples_split
param_grid={'min_samples_split':np.arange(2, 2+20, 1)}
rfc = RandomForestClassifier(n_estimators=39
                             ,random_state=90
                           )
GS = GridSearchCV(rfc,param_grid,cv=10)
GS.fit(data.data,data.target)

17.png
可以看到我们的得分下降了,说明我们的模型复杂度已经在泛化误差最低点的左边了

上面两个参数都是降低随机森林模型复杂度的两个参数,当我们调节他们无法使模型的精确度提高时说明模型复杂度已经在泛化误差最低点的左边了

调criterion

#调整Criterion
param_grid = {'criterion':['gini', 'entropy']}
rfc = RandomForestClassifier(n_estimators=39
                             ,random_state=90
                           )
GS = GridSearchCV(rfc,param_grid,cv=10)
GS.fit(data.data,data.target)

18.png
去.png

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

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

相关文章

Spring Boot | 使用mkcert本地生成SSL证书配置后端接口为HTTPS协议

Tips:本篇博客是 Windows 版本的使用教程,cmd 中执行的命令前缀是下载的软件名称,需要改成自己下载软件的名称! 下载软件 首先去 GitHub 仓库中下载软件,下载完成后将文件保存在英文路径下的文件夹,之后以…

Pytorch源码搜索与分析

PyTorch的的代码主要由C10、ATen、torch三大部分组成的。其中: C10 C10,来自于Caffe Tensor Library的缩写。这里存放的都是最基础的Tensor库的代码,可以运行在服务端和移动端。PyTorch目前正在将代码从ATen/core目录下迁移到C10中。C10的代…

unity新输入系统的简单使用(New InputSystem)

1、在包管理器 unity注册表中下载安装InputSystem 2、给玩家添加组件PlayerInput,点击CreatAction,创建一个InputAct InputAct,这是玩家的输入文件,在里面可以设置玩家输入 3、使用 例如玩家控制角色移动 在InputAct中,默认已经设置好了移…

5.1 web浏览安全

数据参考:CISP官方 目录 Web应用基础浏览器所面临的安全威胁养成良好的Web浏览安全意识如何安全使用浏览器 一、Web应用基础 1、Web应用的基本概念 Web ( World wide Web) 也称为万维网 脱离单机Web应用在互联网上占据了及其重要的地位Web应用的发展&#xf…

使用next.js编写TodoList(连接了数据库)(提供源码)

准备 安装next可以查看nextjs入门使用_姚*鸿的博客的博客-CSDN博客 安装Prisma可以查看 使用Prisma访问数据库_姚*鸿的博客的博客-CSDN博客 确保你前面两个步骤做完。 再提醒以下记得修改数据库的信息: 源码地址 next-todolist: nextjs的todolist例子 效果演示 开始…

生信豆芽菜——箱线图+小提琴图使用说明

网站:http://www.sxdyc.com/diffBoxViolin 三、使用方法 1.打开网址(http://www.sxdyc.com/singleCollectionTool?href-diff),选择“箱线图小提琴图” 准备数据,数据格式用为txt文本,以制表符分割 第一个文件为特征…

VS Code 使用cnpm下载包失败

一、 问题如下: 网上找到的解决方法是要在powershell中执行: Set-ExecutionPolicy RemoteSigned进行更改策略。 首先我们解释下这个Set-ExecutionPolicy RemoteSigned,Set-ExecutionPolicy 是一个 PowerShell 命令,用于控制脚本…

基于ipad协议的gewe框架进行微信群组管理(二)

友情链接 geweapi.com 点击访问即可。 获取群组详情 小提示: 该接口可以一次查询20个群组查询出来的信息是不带公告的 请求URL: http://域名地址/api/group/detail 请求方式: POST 请求头: Content-Type:applica…

AI模型公司如何定位 ?

AI模型公司如何定位 ? 企业与消费者? 和 多用途与利基市场? 文本将分解每个象限。 消费类和多用途 最有价值的象限并引发了人工智能热潮。 顶级公司: Open AI - 通过 ChatGPT 为消费者构建,并通过其旗舰 GPT 模型为企…

【数据结构】反转链表、链表的中间节点、链表的回文结构(单链表OJ题)

正如标题所说,本文会图文详细解析三道单链表OJ题,分别为: 反转链表 (简单) 链表的中间节点 (简单) 链表的回文结构 (较难) 把他们放在一起讲的原因是: 反转链…

vray渲染如何设置?最佳 VRay 渲染设置

什么是 VRay 渲染设置? 让我们从基础开始吧。V-Ray 设置使您可以完全控制用于更改和调整渲染过程的参数。您可以通过“设置”选项卡中的“资源编辑器”找到它们,并且如您所见,它们组织在两个面板中。主面板显示场景设置的默认选项。 如果默认…

微软杀入Web3:打造基于区块链的AI产品

作者:秦晋 2023年1月,微软向 ChatGPT 创建者 OpenAI 投资 100 亿美元,在AI业界引发格外关注。此举也让微软在AI的战略探索上提前取得有利位置。 2023年3月,微软软件工程师 Albacore 披露微软正在为Edge 浏览器测试内置的非托管加密…

LVS/DR+Keepalived负载均衡实战(一)

引言 负载均衡这个概念对于一个IT老鸟来说再也熟悉不过了,当听到此概念的第一反应是想到举世闻名的nginx,但殊不知还有一个大名鼎鼎的负载均衡方案可能被忽略了,因为对于一般系统来说,很多应用场合中采用nginx基本已经满足需求&a…

已解决 RuntimeError: There is no current event loop in thread ‘Thread-1‘.

作者主页:爱笑的男孩。的博客_CSDN博客-深度学习,活动,python领域博主爱笑的男孩。擅长深度学习,活动,python,等方面的知识,爱笑的男孩。关注算法,python,计算机视觉,图像处理,深度学习,pytorch,神经网络,opencv领域.https://blog.csdn.net/Code_and516?typeblog个…

tp5中的事务处理

使用事务首先要数据库支持事务; 如下MySQL数据库user表开启事务支持,即设计表->引擎设置为InnoDB->保存 事务处理 1. 数据库的表引擎需要是 InnoDB 才可以使用,如果不是调整即可; 2. 事务处理,需要执行多个 SQ…

k8s之StorageClass(NFS)

一、前言 1、环境 k8s v1.23.5 ,服务器是centos7.9 192.168.164.20 k8s-master1 192.168.164.30 k8s-node1 192.168.164.40 k8s-node2 2、貌似storageClass在kubernetes v1.20就被砍了。 因为它比较慢,而且耗资源,但可以通过不同的实现镜…

3.1 Spring MVC概述

1. MVC概念 MVC是一种编程思想,它将应用分为模型(Model)、视图(View)、控制器(Controller)三个层次,这三部分以最低的耦合进行协同工作,从而提高应用的可扩展性及可维护…

深入探索:解读创意的力量——idea的下载、初步使用

目录 ​编辑 1.IDEA的简介 2.IDEA的下载 2.1下载路径https://www.jetbrains.com/zh-cn/idea/download/?sectionwindows​编辑​ 2.2下载的步骤 3 idea的初步使用 3.1新建一个简单的Java项目 3.1.1首先需要创建一个新的工程 3.1.2创建一个新的项目(模块&am…

39、传输层的任务和协议

从本节内容开始,我们学习TCP/IP模型的传输层的知识。传输层是TCP/IP模型中的重要组成部分,如果没有传输层的处理,那么源主机发送的IP数据包到达目的主机之后,目的主机将不知道这个数据是哪个应用程序的数据,就不能很好…

RTT(RT-Thread)线程间同步(保姆级)

目录 线程间同步 信号量 信号量结构体 信号量的使用和管理 动态创建信号量 实例 静态创建信号量 初始化和脱离信号量 获取信号量 信号量的互斥操作 获取信号量函数 释放信号量 信号量同步实例 互斥量(互斥锁) 互斥量的使用和管理 动态创…