目录
- 1. 作者介绍
- 2. 关于理论方面的知识介绍
- 随机森林
- 3. 实验过程
- 3.1 数据集介绍
- 3.2 实验代码
- 3.3 运行结果
- 3.3 实验总结
- 参考
1. 作者介绍
李佳敏,女,西安工程大学电子信息学院,2021级研究生
吴燕子,女,西安工程大学电子信息学院,2021级研究生,张宏伟人工智能课题组
研究方向:模式识别与人工智能
2. 关于理论方面的知识介绍
随机森林
随机森林实际上是一种特殊的bagging方法,它将决策树用作bagging中的模型。首先,用bootstrap方法生成m个训练集,然后,对于每个训练集,构造一颗决策树,在节点找特征进行分裂的时候,并不是对所有特征找到能使得指标(如信息增益)最大的,而是在特征中随机抽取一部分特征,在抽到的特征中间找到最优解,应用于节点,进行分裂。随机森林的方法由于有了bagging,也就是集成的思想在,实际上相当于对于样本和特征都进行了采样(如果把训练数据看成矩阵,就像实际中常见的那样,那么就是一个行和列都进行采样的过程),所以可以避免过拟合。
简而言之:随机森林建立了多个决策树,并将它们合并在一起以获得更准确和稳定的预测。
3. 实验过程
3.1 数据集介绍
Labeled Faces in the Wild是一个面部照片数据库,专为研究无约束人脸识别问题而设计。该数据集包含从网络收集的13,000多张面部图像。每张脸都标有图中人物的名字。图中的1680人在数据集中有两张或更多不同的照片。该数据集是在互联网上收集的著名人物的JPEG图片的集合。
>介绍数据集,准备和需要安装的软件包
代码力求有详细的注释,面向初学者群体
使用python,黑色背景的代码块
3.2 实验代码
import numpy as np
from sklearn.datasets import fetch_lfw_people
X, labels = fetch_lfw_people(return_X_y=True, min_faces_per_person=230)
print(X.shape, labels.shape)
print(len(set(labels))) # 类别数
from sklearn.decomposition import PCA
pca = PCA(n_components=200, random_state=2022) # PCA降维,10304维变100维
X = pca.fit_transform(X) # 执行降维
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, labels, random_state=2022, test_size=0.25, shuffle=True)
# 分割数据集,测试集占25%
from sklearn.ensemble import RandomForestClassifier
rf = RandomForestClassifier(n_estimators=100, n_jobs=-1,
random_state=2022,
max_depth=9) # 随机森林模型 n_estimators决策树数量 n_jobs使用所有cpu核心计算 random_state随机种子,结果可重现
rf.fit(X_train, y_train) # 训练
print("训练集准确率", rf.score(X_train, y_train))
print("测试集准确率", rf.score(X_test, y_test))
from sklearn.metrics import classification_report
from sklearn.metrics import accuracy_score, recall_score, precision_score, f1_score
pre = rf.predict(X_test) # 预测 类别
print("测试集准确率", accuracy_score(y_test, pre))
print("测试集召回率", recall_score(y_test, pre, average="weighted"))
print("测试集精确率", precision_score(y_test, pre, average="weighted"))
print("测试集f1", f1_score(y_test, pre, average="weighted"))
from sklearn.model_selection import KFold
metrics = [] # 评估指标
kf = KFold(n_splits=5, shuffle=True, random_state=2022) # n_splits折数 shuffle打乱 random_state随机种子,结果可重现
for train, test in kf.split(X):
X_train, X_test, y_train, y_test = X[train], X[test], labels[train], labels[test] # 重新划分数据集
rf = RandomForestClassifier(n_estimators=100, n_jobs=-1, random_state=2022, max_depth=9)
rf.fit(X_train, y_train)
pre = rf.predict(X_test) # 预测 类别
metrics.append([accuracy_score(y_test, pre),
recall_score(y_test, pre, average="weighted"),
precision_score(y_test, pre, average="weighted"),
f1_score(y_test, pre, average="weighted"),
])
metrics = np.mean(metrics, axis=0) # 求平均值
print("5折交叉验证 准确率、召回率、精确率和f1分别为", metrics)
3.3 运行结果
3.3 实验总结
随机森林的一个优点是它可以用于回归和分类任务,并且很容易查看模型的输入特征的相对重要性。随机森林同时也被认为是一种非常方便且易于使用的算法,因为它是默认的超参数通常会产生一个很好的预测结果。超参数的数量也不是那么多,而且它们所代表的含义直观易懂。机器学习中的一个重大问题是过拟合,但大多数情况下这对于随机森林分类器而言不会那么容易出现。因为只要森林中有足够多的树,分类器就不会过度拟合模型。
随机森林的主要限制在于使用大量的树会使算法变得很慢,并且无法做到实时预测。一般而言,这些算法训练速度很快,预测十分缓慢。越准确的预测需要越多的树,这将导致模型越慢。在大多数现实世界的应用中,随机森林算法已经足够快,但肯定会遇到实时性要求很高的情况,那就只能首选其他方法。
参考
随机森林算法原理.
随机森林算法工作原理.