2024/11/7

实验八:随机森林算法实现与测试

一、实验目的

       深入理解随机森林的算法原理,进而理解集成学习的意义,能够使用 Python 语言实现 随机森林算法的训练与测试,并且使用五折交叉验证算法进行模型训练与评估。

二、实验内容

(1)从 scikit-learn 库中加载 iris 数据集,使用留出法留出 1/3 的样本作为测试集(注 意同分布取样);

(2)使用训练集训练随机森林分类算法;

(3)使用五折交叉验证对模型性能(准确度、精度、召回率和 F1 值)进行评估和选 择;

(4)使用测试集,测试模型的性能,对测试结果进行分析,完成实验报告中实验八的 部分。

三、算法步骤、代码、及结果

   1. 算法伪代码

1. 加载 iris 数据集

2. 将数据集分为特征 X 和标签 y

3. 使用留出法将数据集分为训练集和测试集,测试集大小为 1/3

4. 初始化随机森林分类器,设置随机种子为 42

5. 使用训练集训练随机森林分类器

6. 初始化五折交叉验证

7. 对训练集进行交叉验证,计算准确度、精度、召回率和 F1 值

8. 打印交叉验证结果

9. 使用测试集测试模型性能

10. 计算测试集的准确度、精度、召回率和 F1 值

11. 打印测试集性能指标

12. 计算并打印混淆矩阵

   2. 算法主要代码

完整源代码\调用库方法(函数参数说明)

from sklearn import datasets
from sklearn.model_selection import train_test_split, cross_val_score, StratifiedKFold
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, confusion_matrix

# (1)加载 iris 数据集,并留出 1/3 的样本作为测试集
iris = datasets.load_iris()
X = iris.data
y = iris.target

# 使用留出法,留出 1/3 的样本作为测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=1/3, stratify=y, random_state=42)

# (2)使用训练集训练随机森林分类算法
rf_classifier = RandomForestClassifier(random_state=42)
rf_classifier.fit(X_train, y_train)

# (3)使用五折交叉验证对模型性能进行评估
cv = StratifiedKFold(n_splits=5)
cv_scores = cross_val_score(rf_classifier, X_train, y_train, cv=cv, scoring='accuracy')
precision = cross_val_score(rf_classifier, X_train, y_train, cv=cv, scoring='precision_macro')
recall = cross_val_score(rf_classifier, X_train, y_train, cv=cv, scoring='recall_macro')
f1 = cross_val_score(rf_classifier, X_train, y_train, cv=cv, scoring='f1_macro')

# 打印交叉验证结果
print(f"交叉验证的平均准确度: {cv_scores.mean():.2f}")
print(f"交叉验证的平均精度: {precision.mean():.2f}")
print(f"交叉验证的平均召回率: {recall.mean():.2f}")
print(f"交叉验证的平均F1值: {f1.mean():.2f}")

# (4)使用测试集测试模型的性能
y_pred = rf_classifier.predict(X_test)

# 计算测试集的性能指标
test_accuracy = accuracy_score(y_test, y_pred)
test_precision = precision_score(y_test, y_pred, average='macro')
test_recall = recall_score(y_test, y_pred, average='macro')
test_f1 = f1_score(y_test, y_pred, average='macro')

# 打印测试集的性能指标
print(f"测试集的准确度: {test_accuracy:.2f}")
print(f"测试集的精度: {test_precision:.2f}")
print(f"测试集的召回率: {test_recall:.2f}")
print(f"测试集的F1值: {test_f1:.2f}")

# 分析测试结果
conf_matrix = confusion_matrix(y_test, y_pred)
print("混淆矩阵:")
print(conf_matrix)

  1. RandomForestClassifier(random_state=42)
  • o random_state: 随机数种子,用于控制随机性,确保结果可复现。
  1. fit(X_train, y_train)
  • o X_train: 训练集特征数据。
  • o y_train: 训练集标签数据。
  1. cross_val_score(estimator, X, y, cv, scoring)
  • o estimator: 要评估的模型。
  • o X: 特征数据。
  • o y: 标签数据。
  • o cv: 交叉验证策略。
  • o scoring: 评估标准,如 'accuracy', 'precision_macro', 'recall_macro', 'f1_macro'。
  1. StratifiedKFold(n_splits=5)
  • o n_splits: 交叉验证中折(fold)的数量。
  1. accuracy_score(y_true, y_pred)
  • o y_true: 真实的标签。
  • o y_pred: 预测的标签。
  1. precision_score(y_true, y_pred, average='macro')
  • o y_true: 真实的标签。
  • o y_pred: 预测的标签。
  • o average: 精度的平均方式,'macro' 表示对每个类别的精度进行平均,不考虑类别的支持度。
  1. recall_score(y_true, y_pred, average='macro')
  • o 同上,用于计算召回率。
  1. f1_score(y_true, y_pred, average='macro')
  • o 同上,用于计算 F1 值。
  1. confusion_matrix(y_true, y_pred)
  • o y_true: 真实的标签。
  • o y_pred: 预测的标签。
  • o 返回混淆矩阵,用于详细分析分类结果。

   3. 训练结果截图(包括:准确率、精度(查准率)、召回率(查全率)、F1)

 

四、实验结果分析

1. 测试结果截图(包括:准确率、精度(查准率)、召回率(查全率)、F1)

 

 

2. 对比分析

模型在交叉验证中的表现非常优秀,所有指标都接近或超过95%。

测试集上的表现略有下降,但仍然保持在高水平,说明模型具有良好的泛化能力。

混淆矩阵显示模型在大多数情况下能够正确分类,但在类别1和类别2之间存在一些混淆,特别是类别2有部分样本被错误分类为类别1。

可能需要进一步分析类别1和类别2的特征,以减少这种混淆。此外,可以考虑使用更多的数据或调整模型参数来进一步提高性能。

 

posted @ 2024-11-07 22:52  Hbro  阅读(49)  评论(0)    收藏  举报