24.12.13

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

一、实验目的

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

二、实验内容

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

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

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

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

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

   1. 算法伪代码

1. 加载数据集

   - 加载 Iris 数据集

   - 将特征数据存储在 X 中,将标签数据存储在 y 中

 

2. 数据集划分

   - 使用留出法将数据集划分为训练集和测试集

   - 训练集:2/3 的数据

   - 测试集:1/3 的数据

   - 确保划分时各类别的样本比例相同(同分布取样)

 

3. 创建并训练模型

   - 创建一个随机森林分类器(RandomForestClassifier)

   - 使用训练集数据(X_train 和 y_train)训练模型

 

4. 五折交叉验证

   - 对模型进行五折交叉验证,计算以下性能指标:

     - 准确度(accuracy)

     - 精度(precision)

     - 召回率(recall)

     - F1 值(F1 score)

 

5. 测试集性能评估

   - 使用训练好的模型对测试集进行预测

   - 计算以下测试集性能指标:

     - 准确度(accuracy)

     - 精度(precision)

     - 召回率(recall)

     - F1 值(F1 score)

 

6. 输出结果

   - 输出五折交叉验证的结果(平均准确度、精度、召回率、F1 值)

   - 输出测试集的性能评估结果(准确度、精度、召回率、F1 值)

 

   2. 算法主要代码

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

 

import numpy as np
from sklearn import datasets
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

# 1. 加载 iris 数据集
iris = datasets.load_iris()
X = iris.data  # 特征数据
y = iris.target  # 真实标签

# 2. 使用留出法分割数据集,1/3 的数据作为测试集,2/3 的数据作为训练集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=1/3, random_state=42, stratify=y)

# 3. 创建并训练随机森林分类器
rf_clf = RandomForestClassifier(random_state=42)
rf_clf.fit(X_train, y_train)

# 4. 使用五折交叉验证评估模型性能
cross_val_scores_accuracy = cross_val_score(rf_clf, X, y, cv=5, scoring='accuracy')
cross_val_scores_precision = cross_val_score(rf_clf, X, y, cv=5, scoring='precision_weighted')
cross_val_scores_recall = cross_val_score(rf_clf, X, y, cv=5, scoring='recall_weighted')
cross_val_scores_f1 = cross_val_score(rf_clf, X, y, cv=5, scoring='f1_weighted')

# 输出五折交叉验证结果
print(f"五折交叉验证准确度: {cross_val_scores_accuracy.mean():.4f}")
print(f"五折交叉验证精度: {cross_val_scores_precision.mean():.4f}")
print(f"五折交叉验证召回率: {cross_val_scores_recall.mean():.4f}")
print(f"五折交叉验证 F1 值: {cross_val_scores_f1.mean():.4f}")

# 5. 使用测试集进行预测
y_pred = rf_clf.predict(X_test)

# 6. 测试集性能评估
accuracy = accuracy_score(y_test, y_pred)
precision = precision_score(y_test, y_pred, average='weighted')
recall = recall_score(y_test, y_pred, average='weighted')
f1 = f1_score(y_test, y_pred, average='weighted')

# 输出测试集的性能评估
print(f"\n测试集准确度: {accuracy:.4f}")
print(f"测试集精度: {precision:.4f}")
print(f"测试集召回率: {recall:.4f}")
print(f"测试集 F1 值: {f1:.4f}")

 

1. sklearn.datasets.load_iris(return_X_y=False, as_frame=False)

该函数用于加载 Iris 数据集。

参数说明:

return_X_y (默认 False):

False(默认):返回包含数据集的字典格式。字典中包含 data(特征矩阵)和 target(标签向量)。

True:直接返回特征数据(X)和标签(y),而不使用字典封装。

as_frame (默认 False):

False(默认):返回一个 Bunch 类型的字典。

True:返回一个 pandas.DataFrame,使数据能够更方便地与 Pandas 进行操作。

返回值:

如果 return_X_y=False:返回一个包含 data 和 target 的 Bunch 对象。

如果 return_X_y=True:返回一个元组 (X, y),X 为特征数据,y 为标签数据。

2. train_test_split()

该函数用于将数据集分割为训练集和测试集。

sklearn.model_selection.train_test_split(*arrays, test_size=None, train_size=None, random_state=None, shuffle=True, stratify=None)

参数说明:

 

arrays:要分割的数据,可以是特征数据 X 和标签数据 y(通常为 NumPy 数组或 Pandas DataFrame)。

test_size(默认 None):

用于指定测试集的大小。如果是浮动数值(如 0.33),表示测试集占总数据集的比例。

也可以指定整数,表示测试集样本的绝对数量。

train_size(默认 None):

用于指定训练集的大小。可以是浮动数值或整数。如果不设置(默认为 None),则由 test_size 自动推断。

random_state(默认 None):

设置随机种子,确保每次分割数据时都能得到相同的结果。

shuffle(默认 True):

True:在划分数据集之前,先随机打乱数据。

False:不进行打乱操作。

stratify(默认 None):

None:不进行分层抽样。

如果设置为 y,则按照 y 中的标签分层抽样,确保每个类别在训练集和测试集中的比例相同。

返回值:

 

返回四个数组:X_train, X_test, y_train, y_test,分别是划分后的训练特征、测试特征、训练标签和测试标签。

 

3. RandomForestClassifier()

该函数用于创建一个随机森林分类器。

sklearn.ensemble.RandomForestClassifier(n_estimators=100, criterion='gini', max_depth=None, min_samples_split=2, min_samples_leaf=1, random_state=None, n_jobs=None, verbose=0)

 

参数说明:

• n_estimators(默认 100):

• 随机森林中树的数量。更多的树通常会提高模型的性能,但计算成本也更高。

• criterion(默认 'gini'):

• 用于划分的标准。可以选择:

• 'gini':基尼不纯度。

• 'entropy':信息增益。

• max_depth(默认 None):

• 树的最大深度。None 表示树会一直生长,直到叶子节点只包含一个样本。如果设置为正整数,树会在该深度时停止生长。

• min_samples_split(默认 2):

• 分裂内部节点所需的最小样本数。设置较大的值可以防止模型过拟合。

• min_samples_leaf(默认 1):

• 叶节点上的最小样本数。如果一个叶子节点包含的样本数小于这个值,它将不会分裂。

• random_state(默认 None):

• 控制随机性。用于初始化随机数生成器,确保结果可重复。

• n_jobs(默认 None):

• 控制用于计算的作业数量。None 表示使用所有可用的处理器。若设置为 -1,则使用所有CPU核心。

• verbose(默认 0):

• 控制是否输出详细信息。0 表示不输出,较大的值会输出更多调试信息。

返回值:

• 返回一个已训练的 RandomForestClassifier 对象,可以通过该对象进行预测和评估。

 

4. cross_val_score()

该函数用于通过交叉验证评估模型的性能。

sklearn.model_selection.cross_val_score(estimator, X, y=None, scoring=None, cv=None, n_jobs=None, verbose=0, fit_params=None, pre_dispatch='2*n_jobs')

参数说明:

estimator:

要评估的模型或估算器,例如 RandomForestClassifier。

X:

输入特征数据。

y(默认 None):

目标标签数据。

scoring(默认 None):

评估模型的指标。可以是:

'accuracy':准确度。

'precision':精度。

'recall':召回率。

'f1':F1 值。

或者自定义评分函数。

cv(默认 None):

交叉验证的折数。如果是整数,则为交叉验证的折数。例如 cv=5 表示五折交叉验证。也可以传入一个交叉验证生成器对象。

n_jobs(默认 None):

控制计算时并行化的作业数。None 使用所有可用的核心,-1 使用所有 CPU 核心,其他值指定使用的核心数。

verbose(默认 0):

输出日志的详细程度,0 表示没有输出,1 表示输出进度信息。

fit_params(默认 None):

模型的拟合参数。如果估算器需要额外的拟合参数,可以通过这个参数传递。

pre_dispatch(默认 '2*n_jobs'):

控制任务的提前调度。如果为 None,则立即调度;'2*n_jobs' 表示每个作业最多调度两次。

返回值:

返回一个包含交叉验证评分的数组。

 

 

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

 

 

 

四、实验结果分析

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

 

 

 

2. 对比分析

  准确度:

五折交叉验证中的准确度为 96.67%,而测试集的准确度为 90.00%。这表明在训练数据上,模型的表现更好,可能是因为训练数据的样本量和多样性较高,模型对其拟合得更好。测试集的准确度下降可能是由于模型在新数据上的泛化能力较弱。

  精度:

五折交叉验证中的精度为 97.07%,测试集精度为 90.77%。精度反映了模型预测正类的准确性,在训练集上的表现要好于测试集。这意味着在训练集上,模型能够较好地区分正负样本,但在测试集上,可能存在一定的误判。

  召回率:

五折交叉验证的召回率为 96.67%,测试集的召回率为 90.00%。召回率衡量模型正确识别正类样本的能力。五折交叉验证中的召回率较高,说明模型能较好地识别正类,但在测试集上,模型可能未能有效捕捉到所有正类样本,导致召回率下降。

  F1 值:

F1 值综合考虑了精度和召回率,五折交叉验证的 F1 值为 96.65%,而测试集为 89.92%。F1 值的下降表明测试集上的精度和召回率存在一定的权衡,模型的表现稍逊色于训练集。

 

posted on 2024-12-13 19:26  Daniel350  阅读(17)  评论(0编辑  收藏  举报