2024.11.5

机器学习实验一

实验一:数据准备与模型评估

一、实验目的

熟悉Python 的基本操作,掌握对数据集的读写实现、对模型性能的评估实现的能力; 加深对训练集、测试集、N折交叉验证、模型评估标准的理解。

 

二、实验内容

(1)利用pandas库从本地读取iris数据集;

(2)从scikit-learn 库中直接加载iris 数据集;

(3)实现五折交叉验证进行模型训练;

(4)计算并输出模型的准确度、精度、召回率和F1值。

 

 

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

   1. 算法伪代码

输入:数据集(Iris数据集),模型(随机森林分类器)

输出:交叉验证的评估结果(准确率、精度、召回率、F1 值)

 

1. 加载数据

   1.1 从本地读取iris数据集

   1.2 从scikit-learn加载iris数据集

 

2. 初始化模型

   2.1 创建随机森林分类器对象

 

3. 定义交叉验证策略

   3.1 设置StratifiedKFold,确保每一折训练和测试数据集具有相同的类别分布

 

4. 五折交叉验证

   4.1 将数据分成5个折

   4.2 对每一折进行训练和评估

       4.2.1 划分训练集和测试集

       4.2.2 用训练集训练模型

       4.2.3 用测试集预测并计算评估指标(准确率、精度、召回率、F1 值)

   4.3 保存每一折的评估结果

 

5. 计算并输出总体评估结果

   5.1 计算所有折的平均评估指标

   5.2 输出每个指标的平均值和方差

   2. 算法主要代码

(1)完整源代码

import pandas as pd

from sklearn.datasets import load_iris

from sklearn.model_selection import cross_val_score,StratifiedKFold

from sklearn.tree import DecisionTreeClassifier

from sklearn.metrics import make_scorer,accuracy_score,precision_score,recall_score,f1_score

from sklearn.ensemble import RandomForestClassifier

 

#1.从本地读取iris数据集

data1 = pd.read_csv('iris.data',header=None)

print("本地数据读取成功:")

print(data1.head())

 

#2.从scrikit-learn 库中加载iris数据集

data2 = load_iris()

 #提取特征和目标值

x,y = data2.data,data2.target

print("\nscikit-learn 数据集加载成功:")

print(f"特征形状:{x.shape},标签形状:{y.shape}")

 

#3.五折交叉验证进行模型训练

 #使用随机森林分类器

rf_classifier = RandomForestClassifier(n_estimators=100, random_state=42)

 

#定义交叉验证策略

cv1 = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)

 

# 初始化存储结果的列表

accuracy_scores = []

precision_scores = []

recall_scores = []

f1_scores = []

 

# 执行五折交叉验证

print("\n五折交叉验证结果:")

for fold, (train_idx, test_idx) in enumerate(cv1.split(x, y), start=1):

    # 划分训练集和测试集

    x_train, x_test = x[train_idx], x[test_idx]

    y_train, y_test = y[train_idx], y[test_idx]

 

    # 训练模型

    rf_classifier.fit(x_train, y_train)

    y_pred = rf_classifier.predict(x_test)

 

    # 计算评估指标

    acc = accuracy_score(y_test, y_pred)

    prec = precision_score(y_test, y_pred, average='macro')

    rec = recall_score(y_test, y_pred, average='macro')

    f1 = f1_score(y_test, y_pred, average='macro')

 

    # 保存结果

    accuracy_scores.append(acc)

    precision_scores.append(prec)

    recall_scores.append(rec)

    f1_scores.append(f1)

 

    # 输出当前折的结果

    print(f"第 {fold} 折:")

    print(f"  准确率: {acc:.4f}, 精度: {prec:.4f}, 召回率: {rec:.4f}, F1 值: {f1:.4f}")

 

# 计算并输出总体平均结果

print("\n总体交叉验证结果:")

print(f"平均准确率: {pd.Series(accuracy_scores).mean():.4f}, 方差: {pd.Series(accuracy_scores).std():.4f}")

print(f"平均精度: {pd.Series(precision_scores).mean():.4f}, 方差: {pd.Series(precision_scores).std():.4f}")

print(f"平均召回率: {pd.Series(recall_scores).mean():.4f}, 方差: {pd.Series(recall_scores).std():.4f}")

print(f"平均 F1 值: {pd.Series(f1_scores).mean():.4f}, 方差: {pd.Series(f1_scores).std():.4f}")

 

(2)调用库方法

1.load_iris()

  • 功能:从 scikit-learn 加载内置的 Iris 数据集。
  • 参数:无。
  • 返回值:返回一个字典对象,其中包含特征矩阵 (data)、目标值 (target) 等信息。

data = load_iris()

x, y = data.data, data.target

2. StratifiedKFold(n_splits=5, shuffle=True, random_state=42)

  • 功能:用于交叉验证,将数据集按比例划分成5折,确保每一折中不同类别的样本分布一致。
  • 参数
    • o n_splits=5: 划分为5折。
    • o shuffle=True: 打乱数据顺序,保证每次交叉验证的随机性。
    • o random_state=42: 设置随机种子,确保每次划分结果一致。

cv = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)

3. RandomForestClassifier(n_estimators=100, random_state=42)

  • 功能:创建一个随机森林分类器,进行分类任务。
  • 参数
    • o n_estimators=100: 随机森林中树的数量。
    • o random_state=42: 设置随机种子,确保每次模型训练一致。

rf_classifier = RandomForestClassifier(n_estimators=100, random_state=42)

4. fit(X, y)

  • 功能:用训练数据 X 和目标值 y 训练模型。

rf_classifier.fit(x_train, y_train)

5. predict(X)

  • 功能:用训练好的模型对数据 X 进行预测。

y_pred = rf_classifier.predict(x_test)

6. accuracy_score(y_true, y_pred)

  • 功能:计算预测结果的准确率。

acc = accuracy_score(y_test, y_pred)

7. precision_score(y_true, y_pred, average='macro')

  • 功能:计算预测结果的精度,average='macro' 表示对每个类计算精度并求平均。

prec = precision_score(y_test, y_pred, average='macro')

8. recall_score(y_true, y_pred, average='macro')

  • 功能:计算预测结果的召回率,average='macro' 表示对每个类计算召回率并求平均。

rec = recall_score(y_test, y_pred, average='macro')

9. f1_score(y_true, y_pred, average='macro')

  • 功能:计算预测结果的F1值,average='macro' 表示对每个类计算F1值并求平均。

 

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

(1)准确率:0.9467

 

(2)精度:0.9512,召回率:0.9467,F1:0.9464

 

 

 

四、心得体会

 

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