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

文章目录

    • 集成算法概述
    • 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.nanX_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.hqwc.cn/news/62793.html

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

相关文章

C++中的typeid

2023年8月10日,周四下午 目录 概述typeid的用法用法1用法2用法3举例说明 概述 typeid是 C 中的运算符,用于获取表达式或类型的运行时类型信息。 它返回一个std::type_info对象,该对象包含有关类型的信息,例如类型的名称。 type…

聊一下互联网开源变现

(点击即可收听) 互联网开源变现其实是指通过开源软件或者开放源代码的方式,实现收益或盈利。这种方式越来越被广泛应用于互联网行业 在互联网开源变现的模式中,最常见的方式是通过捐款、广告、付费支持或者授权等方式获利。 例如,有些开源软件…

stm32项目(8)——基于stm32的智能家居设计

目录 一.功能设计 二.演示视频 三.硬件选择 1.单片机 2.红外遥控 3.红外探测模块 4.光敏电阻模块 5.温湿度检测模块 6.风扇模块 7.舵机 8.WIFI模块 9.LED和蜂鸣器 10.火焰传感器 11.气体传感器 四.程序设计 1.连线方式 2.注意事项 3.主程序代码 五.课题意义…

pytest fixture 用于teardown工作

fixture通过scope参数控制setup级别,setup作为用例之前前的操作,用例执行完之后那肯定也有teardown操作。这里用到fixture的teardown操作并不是独立的函数,用yield关键字呼唤teardown操作。 举个例子: 输出: 说明&…

.NET SqlSuger 简单介绍,超快开发数据库

文章目录 前言SqlSugar使用我的环境Nuget 安装新建连接串DB First 和 Code First使用增删改查 总结 前言 我之前介绍过EFCore 怎么使用Nuget快速创建数据库,我之后发现SqlSugar更快。这里简单再说一下SqlSugar如何使用 .NET Core 数据库DB First自动生成&#xff0…

Java【算法 04】HTTP的认证方式之DIGEST认证详细流程说明及举例

HTTP的认证方式之DIGEST 1.是什么2.认值流程2.1 客户端发送请求2.2 服务器返回质询信息2.2.1 质询参数2.2.2 质询举例 2.3 客户端生成响应2.4 服务器验证响应2.5 服务器返回响应 3.算法3.1 SHA-2563.1.1 Response3.1.2 A13.1.3 A2 3.2 MD53.2.1 Request-Digest3.2.2 A13.2.3 A2…

vue手写多对多关联图,连线用leader-line

效果如图 鼠标滑动效果 关联性效果 <template ><div class"main" ref"predecessor"><div class"search"><div class"search-item"><div class"search-item-label">部门</div><Trees…

dinput8.dll导致游戏打不开的解决方法,快速修复dinput8.dll文件

当你尝试启动某个游戏时&#xff0c;如果遇到dinput8.dll文件缺失或损坏的错误提示&#xff0c;可能会导致游戏无法正常运行。dinput8.dll是DirectInput API的一部分&#xff0c;它提供了游戏手柄、键盘和鼠标等输入设备的支持。本文将详细介绍dinput8.dll的作用、导致游戏无法…

2023下半年软考改成机考,对考生有哪些影响?

软考改革成无纸化考试已经实锤。根据陕西软考办官网的消息&#xff0c;从2023年11月起&#xff0c;软考的所有科目都将改为机器考试形式。详情请参阅&#xff1a; 那么软考考试改为机考后&#xff0c;对我们会有哪些影响呢&#xff1f;我来简单概括一下。 1、复习的方法可以根…

AMD高保真超分算法1.0解密

FSR 1.0是空间滤波算法&#xff0c;分成EASU和RCAS两部分。EASU是边缘适配的空间上采样(Edge Adaptive Spatial Upsampling)&#xff0c;RCAS是健壮对比度适配锐化(Robust Contrast Adaptive Sharpening)&#xff0c;从CAS发展而来。 Lanczos 采样及多项式拟合 FSR 1.0 使用了 …

Nginx的优化和防盗链(面试高频!!!)

Nginx的优化和防盗链 全篇高能&#xff01;&#xff01;&#xff01;&#xff01;干货较多&#xff01;&#xff01;&#xff01;&#xff01;本篇含面试高频题&#xff1a; 修改配置文件时&#xff0c;先备份&#xff01;&#xff01;&#xff01;以便回滚&#xff01;&…

Oracle数据迁移

问题描述&#xff1a; oracle数据库的所有表结构、数据、索引等需要需从测试库迁移到正式库。 解决步骤&#xff1a; oracle数据库迁移&#xff0c;主要通过expdp从测试库所在的源服务器将指定的数据表或数据源导出为一个或多个数据文件&#xff08;.dmp文件&#xff09;&…