2024.10.10
实验八:随机森林算法实现与测试
一、实验目的
深入理解随机森林的算法原理,进而理解集成学习的意义,能够使用 Python 语言实现
随机森林算法的训练与测试,并且使用五折交叉验证算法进行模型训练与评估。
二、实验内容
(1)从 scikit-learn 库中加载 iris 数据集,使用留出法留出 1/3 的样本作为测试集(注
意同分布取样);
(2)使用训练集训练随机森林分类算法;
(3)使用五折交叉验证对模型性能(准确度、精度、召回率和 F1 值)进行评估和选
择;
(4)使用测试集,测试模型的性能,对测试结果进行分析,完成实验报告中实验八的
部分。
三、算法步骤、代码、及结果
1. 算法伪代码
(1). 导入必要的库
- numpy
- sklearn.datasets (load_iris)
- sklearn.model_selection (train_test_split, cross_val_score)
- sklearn.ensemble (RandomForestClassifier)
- sklearn.metrics (accuracy_score, precision_score, recall_score, f1_score, classification_report, confusion_matrix)
(2). 加载数据集
- iris = load_iris()
- X, y = iris.data, iris.target
(3). 数据集分割
- 使用train_test_split分割数据集为训练集和测试集
- 输入: X, y, test_size=0.33, random_state=42, stratify=y
- 输出: X_train, X_test, y_train, y_test
(4). 创建随机森林分类器实例
- rf_model = RandomForestClassifier(n_estimators=100, random_state=42)
(5). 训练模型
- rf_model.fit(X_train, y_train)
(6). 使用交叉验证评估模型性能
- 定义scoring字典: accuracy, precision_weighted, recall_weighted, f1_weighted
- 对于每个metric,在训练集上使用cross_val_score进行评估
(7). 打印交叉验证结果
- 输出每个metric的平均值和标准差
(8). 使用测试集评估模型性能
- y_pred = rf_model.predict(X_test
- 计算准确度、精确率、召回率及F1值
(9). 打印测试结果
- 输出测试集的各项指标
(10). 生成分类报告和混淆矩阵
- 打印classification_report和confusion_matrix
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
from sklearn.metrics import classification_report, confusion_matrix
# 1. 加载数据集
iris = load_iris()
X, y = iris.data, iris.target
# 2. 留出法分割数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=42, stratify=y)
# 3. 创建和训练随机森林分类器
rf_model = RandomForestClassifier(n_estimators=100, random_state=42)
rf_model.fit(X_train, y_train)
# 4. 使用五折交叉验证评估模型性能
scoring = {
'accuracy': 'accuracy',
'precision': 'precision_weighted',
'recall': 'recall_weighted',
'f1': 'f1_weighted'
}
# 评估模型性能
cv_results = {metric: cross_val_score(rf_model, X_train, y_train, cv=5, scoring=scoring[metric]) for metric in scoring}
# 打印结果
for metric, values in cv_results.items():
print(f"{metric}:\n 平均值: {np.mean(values):.2f}, 标准差: {np.std(values):.2f}\n")
# 5. 使用测试集评估模型性能
y_pred = rf_model.predict(X_test)
# 计算各项指标
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"测试集准确度: {accuracy:.2f}")
print(f"测试集精确率: {precision:.2f}")
print(f"测试集召回率: {recall:.2f}")
print(f"测试集F1值: {f1:.2f}")
# 生成分类报告和混淆矩阵
print("\n分类报告:")
print(classification_report(y_test, y_pred, target_names=iris.target_names))
# 计算混淆矩阵
conf_matrix = confusion_matrix(y_test, y_pred)
print("混淆矩阵:")
print(conf_matrix)
调用库方法(函数参数说明)
1.load_iris():
来源:sklearn.datasets
作用:加载Iris数据集。
2.train_test_split():
来源:sklearn.model_selection
参数:
X:特征数据。
y:目标数据。
test_size:测试集的比例。
random_state:随机数生成器的种子。
stratify:保持训练集和测试集的类别比例。
作用:将数据集划分为训练集和测试集。
3.KMeans():
来源:sklearn.cluster
参数:
n_clusters:聚类的数量。
random_state:随机数生成器的种子。
作用:创建一个K均值聚类模型实例。
4.fit():
来源:sklearn.base
参数:
X_train:训练集的特征数据。
作用:训练K均值聚类模型。
5.predict():
来源:sklearn.base
参数:
X_test:测试集的特征数据。
作用:对测试集进行聚类预测。
6.silhouette_score():
来源:sklearn.metrics
参数:
X:特征数据。
labels:聚类标签。
作用:计算轮廓系数,评估聚类性能。
7.cross_val_score():
来源:sklearn.model_selection
参数:
estimator:评估的模型。
X:特征数据。
y:目标数据。
cv:交叉验证的折数。
scoring:评分函数。
作用:使用交叉验证评估模型性能。
8.classification_report():
来源:sklearn.metrics
参数:
y_true:真实标签。
y_pred:预测标签。
target_names:类别名称。
作用:输出一个详细的分类报告。
9.confusion_matrix():
来源:sklearn.metrics
参数:
y_true:真实标签。
y_pred:预测标签。
作用:输出混淆矩阵。
3. 训练结果截图(包括:准确率、精度(查准率)、召回率(查全率)、F1)