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: 标签的名称列表。

posted @ 2024-12-06 22:52  大虚胖子  阅读(30)  评论(0)    收藏  举报