11.8
实验一:数据准备与模型评估
一、实验目的
熟悉 Python 的基本操作,掌握对数据集的读写实现、对模型性能的评估实现的能力;
加深对训练集、测试集、N 折交叉验证、模型评估标准的理解。
二、实验内容
(1)利用 pandas 库从本地读取 iris 数据集;
(2)从 scikit-learn 库中直接加载 iris 数据集;
(3)实现五折交叉验证进行模型训练;
(4)计算并输出模型的准确度、精度、召回率和 F1 值。
三、算法步骤、代码、及结果
1. 算法伪代码
初始化:
1. 定义模型:实现一个简单的决策树分类算法
2. 设置五折交叉验证
3. 定义评估指标
算法步骤:
1. 数据加载:
- 从 `scikit-learn` 加载 Iris 数据集
- 提取特征和标签
2. 五折交叉验证:
- 将数据分成五个子集
- 在每一折:
- 使用其余四折训练模型,保留一折用于测试
- 用测试集计算该折的准确率、精度、召回率和 F1 值
- 计算五折的平均值,作为模型的总体评估
3. 输出分类结果
- 输出每一折的准确率、精度、召回率和 F1 值
- 输出总体的准确率、精度、召回率和 F1 值
2. 算法主要代码
(1)完整源代码
# 导入所需库
import pandas as pd
import numpy as np
from sklearn.datasets import load_iris
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import cross_val_score, KFold, cross_val_predict
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, classification_report
# 1. 从本地读取 iris 数据集(假设路径为 './data/iris.csv')
# 如果没有 iris.csv 文件,可以忽略此步骤
try:
iris_data_local = pd.read_csv('D:/pythonproject/JIQIStudy/data/iris.csv')
print("本地 Iris 数据集(前 5 行):\n", iris_data_local.head())
except FileNotFoundError:
print("未找到本地的 iris.csv 文件,跳过本地数据加载步骤。")
# 2. 从 scikit-learn 加载 iris 数据集
iris_data = load_iris()
X, y = iris_data.data, iris_data.target # 特征和标签
print(f"特征示例(前 5 行):\n{X[:5]}\n")
print(f"标签示例(前 5 个): {y[:5]}\n")
# 3. 使用五折交叉验证进行模型训练,选择随机森林分类器
# 初始化随机森林分类器
rf_classifier = RandomForestClassifier(n_estimators=100)
kf = KFold(n_splits=5, shuffle=True, random_state=42)
# 使用交叉验证来计算准确度
accuracy_scores = cross_val_score(rf_classifier, X, y, cv=kf, scoring='accuracy')
print(f"五折交叉验证的准确率: {accuracy_scores}")
print(f"平均准确率: {accuracy_scores.mean()}\n")
# 4. 使用交叉验证预测并计算精度、召回率和 F1 值
# cross_val_predict 用于获取交叉验证中的预测结果
y_pred = cross_val_predict(rf_classifier, X, y, cv=kf)
# 输出分类性能报告
print("分类性能报告:\n", classification_report(y, y_pred, target_names=iris_data.target_names))
print(f"总体准确率: {accuracy_score(y, y_pred)}")
print(f"精度(macro 平均): {precision_score(y, y_pred, average='macro')}")
print(f"召回率(macro 平均): {recall_score(y, y_pred, average='macro')}")
print(f"F1 值(macro 平均): {f1_score(y, y_pred, average='macro')}")
(2)调用库方法
1. pandas 和 numpy
pandas.read_csv(filepath)
用于从文件中读取数据,并返回一个 DataFrame 对象。
参数 filepath: 文件路径。
示例: pd.read_csv('data.csv')。
2. sklearn.datasets.load_iris
load_iris()
加载 Iris 数据集并返回一个字典结构的数据对象,其中包含特征数据和目标标签。
返回数据字段:
data: 特征值,numpy 数组。
target: 标签值,numpy 数组。
target_names: 标签对应的类名。
3. sklearn.ensemble.RandomForestClassifier
RandomForestClassifier(n_estimators=100)
初始化随机森林分类器。
参数 n_estimators: 森林中树的数量(默认值为 100)。
4. sklearn.model_selection
KFold(n_splits=5, shuffle=True, random_state=42)
创建 K 折交叉验证对象。
参数说明:
n_splits: 折数(这里为 5 折)。
shuffle: 是否在分割前随机打乱数据。
random_state: 随机种子,用于保证结果的可重复性。
cross_val_score(estimator, X, y, cv, scoring)
使用交叉验证评估模型。
参数说明:
estimator: 要使用的模型(如 RandomForestClassifier)。
X: 特征数据。
y: 标签数据。
cv: 交叉验证拆分策略(如 KFold 对象)。
scoring: 性能评估指标(如 accuracy)。
cross_val_predict(estimator, X, y, cv)
获取交叉验证的预测值,类似于模型拟合后的 predict 方法,但通过交叉验证得到的预测值是 "未见数据" 的预测。
5. sklearn.metrics
accuracy_score(y_true, y_pred)
计算分类准确率。
参数:
y_true: 真实标签。
y_pred: 预测标签。
precision_score(y_true, y_pred, average='macro')
计算分类精度。
参数:
y_true: 真实标签。
y_pred: 预测标签。
average: 平均方式,macro 表示宏平均。
recall_score(y_true, y_pred, average='macro')
计算召回率。
f1_score(y_true, y_pred, average='macro')
计算 F1 分数。
classification_report(y_true, y_pred, target_names)
输出分类任务的性能报告,包括 precision, recall, f1-score 和 support。
参数:
y_true: 真实标签。
y_pred: 预测标签。
target_names: 标签的名称列表。

浙公网安备 33010602011771号