11.13

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

一、实验目的

深入理解随机森林的算法原理,进而理解集成学习的意义,能够使用 Python 语言实现

随机森林算法的训练与测试,并且使用五折交叉验证算法进行模型训练与评估。

 

二、实验内容

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

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

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

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

 

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

   1. 算法伪代码

随机森林训练与预测伪代码:

 

1. 输入训练集数据 X_train 和对应的标签 y_train,测试集数据 X_test,树的数量 n_trees,特征子集大小 m

2. 创建空列表 forest 用于存储决策树模型

3. 对于 i = 1 n_trees:

    - 从训练集 X_train 中采用有放回抽样,得到自助采样样本集 X_bootstrap

    - 从特征集中随机选择 m 个特征,得到特征子集 X_bootstrap_features

    - 使用 X_bootstrap 和对应的标签 y_train(只包含在自助采样集中的样本标签)训练一棵决策树模型 tree,决策树训练算法可以使用 CART

    - tree 添加到 forest 列表中

4. 对于测试集中的每个样本 x in X_test:

    - 初始化预测结果列表 y_preds = []

    - 对于 forest 中的每棵决策树 tree:

        - 使用 tree x 进行预测,得到预测结果 y_pred

        - y_pred 添加到 y_preds 列表中

    - 通过投票法(多数表决)确定最终的预测结果 y_final_pred(例如,统计 y_preds 中出现次数最多的类别作为最终预测类别)

5. 返回测试集的预测结果 y_final_pred

   2. 算法主要代码

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

import numpy as np
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, classification_report

# (1)  scikit-learn 库中加载 iris 数据集,使用留出法留出 1/3 的样本作为测试集
iris = load_iris()
X = iris.data
y = iris.target

# 使用留出法分割数据集,33% 为测试集,保持同分布
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=1/3, random_state=42, stratify=y)
print("训练集大小:", X_train.shape)
print("测试集大小:", X_test.shape)

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

# (3) 使用五折交叉验证评估模型性能(准确度、精度、召回率和 F1 值)
# 定义评估指标
accuracies = cross_val_score(rf_classifier, X_train, y_train, cv=5, scoring='accuracy')
precisions = cross_val_score(rf_classifier, X_train, y_train, cv=5, scoring='precision_macro')
recalls = cross_val_score(rf_classifier, X_train, y_train, cv=5, scoring='recall_macro')
f1_scores = cross_val_score(rf_classifier, X_train, y_train, cv=5, scoring='f1_macro')

# 输出评估结果
print("\n五折交叉验证结果:")
print("准确度均值:", np.mean(accuracies))
print("精度均值:", np.mean(precisions))
print("召回率均值:", np.mean(recalls))
print("F1 值均值:", np.mean(f1_scores))

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

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

print("\n测试集的性能指标:")
print("准确度:", test_accuracy)
print("精度:", test_precision)
print("召回率:", test_recall)
print("F1 值:", test_f1)

# 打印测试集的分类报告
print("\n测试集分类报告:")
print(classification_report(y_test, y_test_pred, target_names=iris.target_names))

# 进一步分析预测结果
print("\n测试集样本预测与真实标签对比:")
for i in range(len(y_test)):
    print(f"真实标签: {iris.target_names[y_test[i]]}, 预测标签: {iris.target_names[y_test_pred[i]]}")

 

调用库方法

 

1. load_iris

加载 Iris 数据集。

from sklearn.datasets import load_iris  

 

参数:

return_X_y: 如果为 True,返回特征和目标。如果为 False,返回一个包含数据的对象(默认值为 False

返回值:

返回一个包含特征和目标的对象,通常通过 iris.data iris.target 获取。

 

2. train_test_split

将数据随机划分为训练集和测试集。

from sklearn.model_selection import train_test_split  

 

参数:

test_size: 测试集占比(0-1之间的小数,或具体数目)。

random_state: 随机种子(确保划分可重现)。

stratify: 按类别比例划分(确保训练集和测试集类别分布一致)。

 

返回值:

返回划分后的训练数据和测试数据。

 

3. fit

用法: clf.fit(X_train, y_train)

作用: 训练模型。

 

4. cross_val_score

 

用法: cross_val_score(estimator, X, y, cv, scoring)

 

参数:

estimator: 需要评估的模型。

X: 特征数据。

y: 类别标签。

cv: 交叉验证的折数。

scoring: 评估指标(如准确率、精确率)。

 

5.RandomForestClassifier

模型训练

from sklearn.ensemble import RandomForestClassifier

     

      

 

用法:RandomForestClassifier(random_state=42): 创建一个随机森林分类器实例。

 

 

6. accuracy_score

计算模型在给定数据上的准确度。

from sklearn.metrics import accuracy_score  

 

参数:

y_true: 真实标签。

y_pred: 预测标签。

 

返回值:

返回预测准确率(在 0 1 之间的小数)。

 

  1. 评价指标函数

准确率:

from sklearn.metrics import accuracy_score  

accuracy_score(y_true, y_pred)  

 

精确率:

from sklearn.metrics import precision_score  

precision_score(y_true, y_pred, average='macro')  

 

召回率:

from sklearn.metrics import recall_score  

recall_score(y_true, y_pred, average='macro')  

 

F1 分数:

from sklearn.metrics import f1_score  

f1_score(y_true, y_pred, average='macro')  

 

参数:

y_true: 真实标签。

y_pred: 预测标签。

average: 计算多类别的评估方法('macro'表示对每个类别计算得分,然后取平均)。

 

 

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

 

 

四、实验结果分析

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

 

 

2. 对比分析

根据模型训练和测试结果的分析,分类模型表现良好。训练集中,模型的五折交叉验证结果显示出高准确度(0.95)、精度(0.96)、召回率(0.95)和F1值(0.95),表明模型在识别不同类别的鸢尾花时非常有效。然而,在测试集上,性能略有下降,准确度为0.90,精度为0.91,召回率为0.90F1值为0.90,尽管如此,这仍然表明模型具有良好的泛化能力。

分类报告显示,模型在识别Setosa类别时表现完美,精度和召回率均为1.00。但在VersicolorVirginica类别的表现上存在一定差距,尤其是Virginica的召回率较低(0.76),说明模型在这方面的识别能力有待提升。尽管模型整体性能令人满意,但未来可以通过更复杂的模型、超参数调优或数据增强等方法,进一步提高在较难分类样本上的表现。

 

 

 

五、心得体会

 

通过本次实验,我深入理解了随机森林的算法原理和集成学习的意义。随机森林通过构建多个决策树并进行集成,提高了模型的稳定性和泛化能力。

在实验过程中,我掌握了如何使用 scikit-learn 库中的 RandomForestClassifier 进行随机森林分类器的训练和测试。同时,我也学会了如何使用五折交叉验证对模型性能进行评估,并计算了准确度、精度、召回率和 F1 值等指标。

通过对比五折交叉验证的结果和测试集的结果,我发现随机森林模型在 iris 数据集上表现良好,具有较高的准确度和泛化能力。这也验证了随机森林算法的有效性和稳定性。

总的来说,这次实验不仅提高了我的编程能力,还加深了我对随机森林算法和集成学习的理解。我认识到,在实际应用中,除了算法本身外,数据预处理、特征选择和模型评估等方面也同样重要。通过不断尝试和优化,我们可以构建出更加准确和可靠的机器学习模型。

 

posted @   The-rich  阅读(52)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
点击右上角即可分享
微信分享提示