2024.12.9

机器学习实验八

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

一、实验目的

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

 

二、实验内容

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

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

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

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

 

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

   1. 算法伪代码

# Step 1: 加载数据并划分数据集

加载鸢尾花数据集 (iris)

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

 

# Step 2: 定义随机森林分类模型

初始化随机森林模型

    设置决策树数量为 100

    设置分裂标准为 "gini"(或 "entropy")

    不限制树的最大深度

    设置随机数种子以保证实验可复现

 

# Step 3: 使用五折交叉验证评估模型

使用交叉验证来评估模型的准确度

输出五折交叉验证的准确度和平均准确度

 

# Step 4: 使用训练集训练模型

在训练集上训练模型

 

# Step 5: 测试集评估

对测试集进行预测

计算测试集上的准确度、精度、召回率、F1 分数

输出模型的评估结果

 

   2. 算法主要代码

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

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

# Step 1: 加载数据并划分训练集和测试集
iris = datasets.load_iris()
X, y = iris.data, iris.target

# 使用留出法划分数据集,保证类别分布一致
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=1/3, random_state=42, stratify=y
)

# Step 2: 定义随机森林模型
#
设置随机森林的超参数
rf_model = RandomForestClassifier(
    n_estimators=100,     # 森林中决策树的数量,默认100
   
criterion="gini",     # 衡量分裂质量的指标("gini""entropy"),默认是 "gini"
   
max_depth=None,       # 决策树的最大深度,默认不限制
   
random_state=42       # 随机数种子,保证结果可重复
)

# Step 3: 使用五折交叉验证评估模型
#
交叉验证的评分指标是准确度
cv_scores = cross_val_score(rf_model, X_train, y_train, cv=5, scoring='accuracy')
print(f"五折交叉验证准确度:{cv_scores}")
print(f"平均准确度:{cv_scores.mean():.4f}")

# Step 4: 使用训练集训练模型
rf_model.fit(X_train, y_train)

# Step 5: 测试集评估
y_pred = rf_model.predict(X_test)

# 计算测试集指标
accuracy = accuracy_score(y_test, y_pred)
precision = precision_score(y_test, y_pred, average='macro')
recall = recall_score(y_test, y_pred, average='macro')
f1 = f1_score(y_test, y_pred, average='macro')

# 输出结果
print("\n测试集性能:")
print(f"Accuracy: {accuracy:.4f}")
print(f"Precision: {precision:.4f}")
print(f"Recall: {recall:.4f}")
print(f"F1 Score: {f1:.4f}")

 

  1. datasets.load_iris(): 加载鸢尾花数据集(Iris dataset),这是一个经典的多类别分类数据集。
  • o 返回数据集,包含样本数据 X 和标签 y。
  1. train_test_split(): 将数据集拆分为训练集和测试集。
  • o 参数 test_size=1/3: 训练集占 2/3,测试集占 1/3。
  • o 参数 random_state=42: 设置随机种子以确保结果可复现。
  • o 参数 stratify=y: 保证数据的类别分布一致(分层采样)。
  1. RandomForestClassifier(): 随机森林分类器,超参数如下:
  • o n_estimators=100: 随机森林中的树的数量。
  • o criterion="gini": 衡量分裂质量的标准(也可以是 "entropy")。
  • o max_depth=None: 树的最大深度,默认没有限制。
  • o random_state=42: 随机数种子。
  1. cross_val_score(): 进行交叉验证,使用 cv=5 表示五折交叉验证,scoring='accuracy' 用于计算准确度。
  2. accuracy_score(): 计算预测准确率。
  3. precision_score(): 计算精度(查准率),使用 average='macro' 计算多类别的平均精度。
  4. recall_score(): 计算召回率(查全率),使用 average='macro' 计算多类别的平均召回率。
  5. f1_score(): 计算 F1 分数(精度和召回率的调和均值)。

 

 

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

 

 

四、实验结果分析

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

 

 

2. 对比分析

准确率: 该模型的准确率为 98%,表示几乎所有测试样本都被正确分类。

精度与召回率: 精度和召回率都接近 98%,说明模型对各个类别的识别性能较好,没有出现太多假阳性(精度)或假阴性(召回率)问题。

F1 分数: F1 分数接近 1,表示精度和召回率的平衡较好,是一个综合的指标。

 

posted @ 2024-12-25 10:30  cvjj  阅读(18)  评论(0)    收藏  举报