当前位置: 首页 > news >正文

Python从0到100(五十八):机器学习-随机森林及对复杂数据集分类

随机森林通过构建多个决策树来完成分类或回归任务。随机森林的核⼼思想是通过多个弱学习器(决策树)的集成来构建⼀个强学习器,从⽽提⾼模型的泛化能⼒和稳定性。

1.基本原理

随机森林的基本原理如下:

  1. 从训练集中随机抽取⼀定数量的样本(有放回抽样),构建⼀个决策树(称为⾃助采样法或bootstrap采样)。
  2. 在每个决策树的节点上,随机选择⼀部分特征进⾏划分。
  3. 对每棵树进⾏训练,直到达到指定的树的数量。
  4. 对于分类问题,采⽤投票法来确定最终的分类结果;对于回归问题,采⽤平均法来确定最终的回归结果。

2.如何选择适当的超参数构建随机森林

选择适当的超参数来构建随机森林模型⾮常重要,因为它们可以显著影响模型的性能和泛化能⼒。
下⾯是⼀些常⻅的随机森林超参数以及如何选择它们的⼀些建议⽅法:
1、树的数量(n_estimators):
这是随机森林中包含的决策树的数量。
选择⽅法:通常情况下,增加树的数量可以提⾼模型的性能,但也会增加计算成本。您可以使⽤交叉验证或验证集的性能来选择适当数量的树。当性能趋于稳定时,不再增加树的数量。
2、树的深度(max_depth):
这是每棵决策树的最⼤深度,控制了树的复杂性。
选择⽅法:可以通过绘制学习曲线来选择最⼤深度。学习曲线显示了训练误差和验证误差随最⼤深度的变化情况。通常,最⼤深度不宜过⼤,以防⽌过拟合。
3、特征数量的选择(max_features):
这是每个节点⽤于分裂的特征的最⼤数量。
选择⽅法:通常,max_features设置为"auto"(等于总特征数的平⽅根)是⼀个不错的起点。您也可以尝试其他值,如"log2"或⼀个特定的整数值。通过交叉验证或验证集来确定最佳值。
4、最⼩叶⼦节点样本数(min_samples_leaf):
这是叶⼦节点上所需的最⼩样本数,⽤于控制树的⽣⻓。
选择⽅法:增加此参数可以防⽌树在训练数据上过拟合。通常情况下,设置⼀个较⼩的值,如1,以允许树⽣⻓到较⼩的叶⼦节点。然后,通过交叉验证或验证集来选择最佳值。
5、最⼩分裂节点样本数(min_samples_split):
这是⼀个节点分裂所需的最⼩样本数。
选择⽅法:类似于min_samples_leaf,增加此参数可以防⽌过拟合。通常,可以选择⼀个适中的值,然后通过交叉验证或验证集来调整。
6、随机种⼦(random_state):
这是⽤于控制模型的随机性的种⼦值。
选择⽅法:为了可重复性,通常建议设置⼀个固定的随机种⼦。这可以确保多次运⾏模型时得到相同的结果。

超参数的选择通常需要进⾏实验和调整,可以使⽤交叉验证来评估不同超参数组合的性能,然后选择最佳组合。Grid Search和Random Search等⾃动调参技术也可⽤于更全⾯地搜索超参数空间。最终的选择应基于具体问题和
数据集的性质来决定。

3.优缺点

优点:

  1. ⾼准确性:随机森林能够取得较⾼的准确性,在许多数据集上都有良好的表现。
  2. 抗过拟合能⼒强:随机森林能够有效地降低过拟合的⻛险,因为它对多个决策树的预测结果进⾏了集成。
  3. 能够处理⾼维数据:随机森林能够处理⾼维数据和⼤规模数据集,并且不需要进⾏特征选择。

缺点:

  1. 模型解释性较差:由于随机森林是⼀个集成模型,因此难以解释单个决策树的预测过程。
  2. 训练时间较⻓:由于需要构建多棵决策树并集成它们的结果,随机森林的训练时间较⻓。
  3. 对噪声敏感:随机森林对噪声和异常值⽐较敏感,可能会影响模型的性能。

4.适用场景

随机森林适⽤于以下场景:

  1. 分类和回归问题:随机森林适⽤于分类和回归问题,并且在许多不同类型的数据集上都有良好的表现。
  2. ⼤规模数据集:随机森林能够处理⼤规模数据集,并且不需要进⾏特征选择,因此适⽤于处理⾼维数据和⼤
    规模数据集。
  3. 数据特征具有复杂交互关系:随机森林能够有效地处理数据特征之间的复杂交互关系,因此适⽤于处理特征
    之间存在较强关联性的问题。

总之,随机森林是⼀种强⼤的集成学习算法,具有⾼准确性和抗过拟合能⼒强的优点,适⽤于处理多种类型的分类和回归问题。然⽽,在解释模型结果和训练时间⽅⾯可能存在⼀些挑战。

5.对复杂数据集分类

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score
from matplotlib.colors import ListedColormap
# 加载鸢尾花数据集
iris = load_iris()
X = iris.data[:, [2, 3]] # 取特征的后两个维度
y = iris.target
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 构建随机森林模型
rf_clf = RandomForestClassifier(n_estimators=100, random_state=42)
rf_clf.fit(X_train, y_train)
# 在测试集上进⾏预测
y_pred = rf_clf.predict(X_test)
# 计算模型准确率
accuracy = accuracy_score(y_test, y_pred)
print("Accuracy:", accuracy)
# 可视化决策边界
def plot_decision_regions(X, y, classifier, test_idx=None, resolution=0.02):markers = ('s', 'x', 'o', '^', 'v')colors = ('red', 'blue', 'lightgreen', 'gray', 'cyan')cmap = ListedColormap(colors[:len(np.unique(y))])x1_min, x1_max = X[:, 0].min() - 1, X[:, 0].max() + 1x2_min, x2_max = X[:, 1].min() - 1, X[:, 1].max() + 1xx1, xx2 = np.meshgrid(np.arange(x1_min, x1_max, resolution), np.arange(x2_min, x2_max,resolution))Z = classifier.predict(np.array([xx1.ravel(), xx2.ravel()]).T)Z = Z.reshape(xx1.shape)plt.contourf(xx1, xx2, Z, alpha=0.4, cmap=cmap)plt.xlim(xx1.min(), xx1.max())plt.ylim(xx2.min(), xx2.max())for idx, cl in enumerate(np.unique(y)):plt.scatter(x=X[y == cl, 0], y=X[y == cl, 1], alpha=0.8, c=[cmap(idx)],marker=markers[idx], label=cl, edgecolor='black')if test_idx:X_test, y_test = X[test_idx, :], y[test_idx]plt.scatter(X_test[:, 0], X_test[:, 1], c='', edgecolor='black', alpha=1.0,linewidth=1, marker='o', s=100, label='Test Set')
plot_decision_regions(X_train, y_train, classifier=rf_clf)
plt.title('Random Forest Classifier - Decision Boundary (Training Set)')
plt.xlabel('Petal Length (cm)')
plt.ylabel('Petal Width (cm)')
plt.legend(loc='upper left')
plt.show()

在这里插入图片描述
⾸先加载了鸢尾花数据集,并将特征选取为后两个维度以便在⼆维平⾯上可视化。然后构建了⼀个随机森林分类器,并在训练集上训练模型。接着,使⽤ plot_decision_regions 函数绘制了训练集的决策边界,其中不同颜⾊的区域表示不同类别的决策区域。

6.获取随机森林特征分数

Scikit-Learn中,可以使⽤ feature_importances_ 属性来获取随机森林模型中特征的重要性分数:

from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_iris
import matplotlib.pyplot as plt
# 加载数据集
iris = load_iris()
X, y = iris.data, iris.target
# 创建随机森林分类器
rf_classifier = RandomForestClassifier(n_estimators=100, random_state=42)
# 训练模型
rf_classifier.fit(X, y)
# 获取特征重要性分数
feature_importance_scores = rf_classifier.feature_importances_
# 可视化特征重要性
plt.figure(figsize=(13, 6))
plt.barh(range(len(feature_importance_scores)), feature_importance_scores,
tick_label=iris.feature_names)
plt.xlabel('Feature Importance Score')
plt.ylabel('Features')
plt.title('Feature Importance in Random Forest')
plt.show()

使⽤了鸢尾花数据集,创建了⼀个包含100棵树的随机森林分类器,并训练了模型。然后,通过feature_importances_ 属性获取了每个特征的重要性分数,并使⽤matplotlib库绘制了特征重要性的条形图:在这里插入图片描述

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【Redis入门到精通二】Redis核心数据类型(String,Hash)详解
  • 负载均衡是什么意思?盘点常见的三种方式
  • 彻底掌握Android中的ViewModel
  • 14张图深度解密大厂秒杀系统库存设计,不是所有的库存都能支持高并发!
  • 口语训练材料
  • OpenCV特征检测(5)检测图像中的角点函数cornerMinEigenVal()的使用
  • Debezium日常分享系列之:将容器镜像移至 quay.io
  • LPDDR4芯片学习(一)——基础知识与引脚定义
  • ONNX那些事
  • 豆包 MarsCode 代码练习体验
  • vue-baidu-map的基本使用
  • 快速构建串口调试工具
  • PyTorch使用------自动微分模块
  • kotlin—— withTimeoutOrNull的介绍和使用场景
  • js中正则表达式中【exec】用法深度解读
  • 自己简单写的 事件订阅机制
  • Angular6错误 Service: No provider for Renderer2
  • canvas 高仿 Apple Watch 表盘
  • CentOS 7 防火墙操作
  • ES6核心特性
  • ES学习笔记(12)--Symbol
  • Gradle 5.0 正式版发布
  • JavaScript-Array类型
  • Java反射-动态类加载和重新加载
  • k8s如何管理Pod
  • Logstash 参考指南(目录)
  • python学习笔记-类对象的信息
  • React中的“虫洞”——Context
  • 基于Vue2全家桶的移动端AppDEMO实现
  • 前端每日实战:61# 视频演示如何用纯 CSS 创作一只咖啡壶
  • 区块链将重新定义世界
  • 如何学习JavaEE,项目又该如何做?
  • 问题之ssh中Host key verification failed的解决
  • 详解移动APP与web APP的区别
  • ​​​​​​​ubuntu16.04 fastreid训练过程
  • ​iOS安全加固方法及实现
  • ​如何使用ArcGIS Pro制作渐变河流效果
  • (1)bark-ml
  • (C语言)字符分类函数
  • (Demo分享)利用原生JavaScript-随机数-实现做一个烟花案例
  • (Java入门)抽象类,接口,内部类
  • (Matlab)使用竞争神经网络实现数据聚类
  • (超简单)构建高可用网络应用:使用Nginx进行负载均衡与健康检查
  • (第27天)Oracle 数据泵转换分区表
  • (读书笔记)Javascript高级程序设计---ECMAScript基础
  • (二)Linux——Linux常用指令
  • (二)斐波那契Fabonacci函数
  • (附源码)计算机毕业设计SSM疫情社区管理系统
  • (九)信息融合方式简介
  • (一)kafka实战——kafka源码编译启动
  • (原+转)Ubuntu16.04软件中心闪退及wifi消失
  • (自适应手机端)行业协会机构网站模板
  • *(长期更新)软考网络工程师学习笔记——Section 22 无线局域网
  • .babyk勒索病毒解析:恶意更新如何威胁您的数据安全
  • .NET Core Web APi类库如何内嵌运行?