po3a  

   

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

实验二:逻辑回归算法实现与测试

实验三:C4.5(带有预剪枝和后剪枝)算法实现与测试

实验四:SMO 算法实现与测试

实验五:BP 神经网络算法实现与测试

实验六:朴素贝叶斯算法实现与测试

实验七:K均值聚类算法实现与测试

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

实验总结

 


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

 

一、实验目的

熟悉 Python 的基本操作,掌握对数据集的读写实现、对模型性能的评估实现的能力;

加深对训练集、测试集、N 折交叉验证、模型评估标准的理解。

二、实验内容

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

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

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

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

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

   1. 算法伪代码

步骤1: 导入必要的库

导入 pandas 库用于数据处理

步骤2: 使用 pandas 从本地读取 iris 数据集

    指定数据集文件路径 'iris.csv'

    使用 pandas read_csv 函数读取数据集到变量 iris_df

步骤3: 使用 scikit-learn 加载 iris 数据集

    调用 load_iris 函数加载内置的 iris 数据集

    将加载的数据集的特征部分赋值给变量 X

    将加载的数据集的标签部分赋值给变量 y

步骤4: 划分数据集为特征和标签

    对于从本地读取的数据集 iris_df

    选择除最后一列之外的所有列作为特征,赋值给变量 X_df

    选择最后一列作为标签,赋值给变量 y_df

步骤5: 实现五折交叉验证

    创建 KFold 对象,设置分割数为 5,打乱数据为 True,随机种子为 42

步骤6: 训练模型并计算评估指标

步骤7: 输出结果

    分别打印每个评估指标的结果

   2. 算法主要代码

1)完整源代码

import pandas as pd

from sklearn.datasets import load_iris

from sklearn.model_selection import cross_val_predict

from sklearn.model_selection import KFold

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

 

# 步骤2: 使用pandas从本地读取iris数据集

# 假设数据集文件名为iris.csv,并且与代码在同一目录下

iris_df = pd.read_csv('iris.csv')

 

# 步骤3: 使用scikit-learn加载iris数据集

iris = load_iris()

X, y = iris.data, iris.target

 

# 步骤4: 划分数据集为特征和标签

# 对于本地数据集,假设最后一列是标签

X_df = iris_df.iloc[:, :-1]

y_df = iris_df.iloc[:, -1]

 

# 步骤5: 实现五折交叉验证

kf = KFold(n_splits=5, shuffle=True, random_state=42)

 

# 步骤6: 训练模型并计算评估指标

# 这里以逻辑回归为例

from sklearn.linear_model import LogisticRegression

 

model = LogisticRegression(max_iter=200)

y_pred = cross_val_predict(model, X, y, cv=kf)

 

# 计算准确度

accuracy = accuracy_score(y, y_pred)

print(f"准确率: {accuracy}")

 

# 计算精度、召回率和F1

precision = precision_score(y, y_pred, average='macro')

recall = recall_score(y, y_pred, average='macro')

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

 

print(f"精度: {precision}")

print(f"召回率: {recall}")

print(f"F1: {f1}")

 

2)调用库方法

在上述代码中,我使用了scikit-learn库中的几个方法:

load_iris(): 加载iris数据集。

KFold(n_splits=5, shuffle=True, random_state=42): 创建一个五折交叉验证的迭代器,shuffle=True表示在分割前对数据进行打乱,random_state用于保证结果的可复现性。

cross_val_predict(model, X, y, cv=kf): 使用交叉验证的方式对模型进行预测。

accuracy_score(y, y_pred): 计算预测结果的准确率。

precision_score(y, y_pred, average='macro'): 计算精度,average='macro'表示对每个类别的精度进行宏平均。

recall_score(y, y_pred, average='macro'): 计算召回率,同样进行宏平均。

f1_score(y, y_pred, average='macro'): 计算F1值,进行宏平均。

 

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

1)准确率:0.9733

 

2)精度:0.9738,召回率:0.9733F10.9733

 

 

四、心得体会

在本次实验中,我通过使用 pandas 库从本地读取 iris 数据集熟悉了数据的导入和预处理流程。同时,利用 scikit-learn 库直接加载 iris 数据集,我加深了对数据集结构和内容的理解在实现五折交叉验证的过程中,我学习了如何使用 KFold 来分割数据集,并使用 cross_val_predict 函数进行模型的交叉验证预测。这一过程不仅让我掌握了交叉验证的基本概念,也让我体会到了它在模型评估中的重要性。通过计算并输出模型的准确度、精度、召回率和 F1 值,我对模型性能的评估有了更全面的认识。实验结果显示,模型的准确率达到了 0.9733,精度、召回率和 F1 值也都表现良好,这表明模型在分类任务上具有较高的性能。使用 Python scikit-learn 库进行实验,我感受到了这些工具在数据处理和模型评估中的便捷性和强大功能。它们不仅提高了我的工作效率,也让我对机器学习流程有了更深刻的理解。

总的来说,这次实验不仅让我掌握了数据准备和模型评估的基本技能,也激发了我对机器学习领域进一步探索的兴趣。

 


实验二:逻辑回归算法实现与测试

 

一、实验目的

深入理解对数几率回归(即逻辑回归的)的算法原理,能够使用 Python 语言实现对数

几率回归的训练与测试,并且使用五折交叉验证算法进行模型训练与评估。

二、实验内容

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

意同分布取样);

(2)使用训练集训练对数几率回归(逻辑回归)分类算法;

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

择;

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

部分。

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

   1. 算法伪代码

1. 导入必要的库和模块

2. 加载 iris 数据集

3. 将数据集按 2:1 的比例划分为训练集和测试集

4. 初始化逻辑回归模型并对训练集数据进行拟合训练

5. 使用五折交叉验证评估模型在训练集上的表现

6. 在测试集上评估模型性能并计算各项指标

7. 输出和分析测试结果

 

   2. 算法主要代码

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

from sklearn.datasets import load_iris

from sklearn.model_selection import train_test_split, cross_val_score

from sklearn.linear_model import LogisticRegression

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

import numpy as np

from sklearn.exceptions import ConvergenceWarning

import warnings

 

 

# 自定义逻辑回归类

class CustomLogisticRegression:

    def __init__(self, learning_rate=0.01, n_iterations=1000):

        self.learning_rate = learning_rate

        self.n_iterations = n_iterations

        self.weights = None

        self.bias = None

 

    def fit(self, X, y):

        n_samples, n_features = X.shape

        self.weights = np.zeros(n_features)

        self.bias = 0

 

        for _ in range(self.n_iterations):

            linear_model = np.dot(X, self.weights) + self.bias

            y_predicted = self.sigmoid(linear_model)

 

            dw = (1 / n_samples) * np.dot(X.T, (y_predicted - y))

            db = (1 / n_samples) * np.sum(y_predicted - y)

 

            self.weights -= self.learning_rate * dw

            self.bias -= self.learning_rate * db

 

    def predict(self, X):

        linear_model = np.dot(X, self.weights) + self.bias

        y_predicted = self.sigmoid(linear_model)

        y_predicted_class = [1 if i > 0.5 else 0 for i in y_predicted]

        return y_predicted_class

 

    def sigmoid(self, z):

        return 1 / (1 + np.exp(-z))

 

    def score(self, X, y):

        y_pred = self.predict(X)

        return accuracy_score(y, y_pred)

 

    def get_params(self, deep=True):

        return {'learning_rate': self.learning_rate, 'n_iterations': self.n_iterations}

 

    def set_params(self, **parameters):

        for parameter, value in parameters.items():

            setattr(self, parameter, value)

        return self

 

 

# 加载 iris 数据集

iris = load_iris()

X = iris.data

y = iris.target

 

# 使用留出法留出 1/3 的样本作为测试集(同分布取样)

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=1/3, random_state=42)

 

# 创建自定义逻辑回归模型并训练

custom_lr = CustomLogisticRegression()

custom_lr.fit(X_train, y_train)

 

# 创建 scikit-learn 逻辑回归模型并训练,处理 ConvergenceWarning 警告

with warnings.catch_warnings():

    warnings.simplefilter('ignore', category=FutureWarning)  # 忽略 FutureWarning,可能是因为 scikit-learn 版本问题导致的警告

    warnings.filterwarnings('error', category=ConvergenceWarning)  # ConvergenceWarning 转换为错误,以便进行处理

    try:

        sklearn_lr = LogisticRegression(max_iter=10000)  # 增加最大迭代次数

        sklearn_lr.fit(X_train, y_train)

    except ConvergenceWarning as e:

        print(f"Scikit-learn 逻辑回归模型未能收敛: {e}")

 

# 定义评估函数

def evaluate_model(model, X, y):

    scores = cross_val_score(model, X, y, cv=5)

    accuracy = np.mean(scores)

    print(f"五折交叉验证准确度:{accuracy}")

 

    y_pred = model.predict(X)

    precision = precision_score(y, y_pred, average='macro', zero_division=0)  # 处理 UndefinedMetricWarning 警告

    print(f"精度:{precision}")

 

    recall = recall_score(y, y_pred, average='macro')

    print(f"召回率:{recall}")

 

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

    print(f"F1 值:{f1}\n")

 

 

# 评估自定义逻辑回归模型

print("自定义逻辑回归模型评估:")

evaluate_model(custom_lr, X_train, y_train)

 

# 评估 scikit-learn 逻辑回归模型

print("scikit-learn 逻辑回归模型评估:")

if'sklearn_lr' in locals():  # 确保模型已成功训练

    evaluate_model(sklearn_lr, X_train, y_train)

 

# 使用测试集测试自定义逻辑回归模型

y_pred_test_custom = custom_lr.predict(X_test)

accuracy_custom = accuracy_score(y_test, y_pred_test_custom)

print(f"自定义逻辑回归模型在测试集上的准确度:{accuracy_custom}")

 

precision_custom = precision_score(y_test, y_pred_test_custom, average='macro', zero_division=0)

print(f"精度:{precision_custom}")

 

recall_custom = recall_score(y_test, y_pred_test_custom, average='macro')

print(f"召回率:{recall_custom}")

 

f1_custom = f1_score(y_test, y_pred_test_custom, average='macro')

print(f"F1 值:{f1_custom}\n")

 

# 使用测试集测试 scikit-learn 逻辑回归模型

if'sklearn_lr' in locals():  # 确保模型已成功训练

    y_pred_test_sklearn = sklearn_lr.predict(X_test)

    accuracy_sklearn = accuracy_score(y_test, y_pred_test_sklearn)

    print(f"scikit-learn 逻辑回归模型在测试集上的准确度:{accuracy_sklearn}")

 

    precision_sklearn = precision_score(y_test, y_pred_test_sklearn, average='macro', zero_division=0)

    print(f"精度:{precision_sklearn}")

 

    recall_sklearn = recall_score(y_test, y_pred_test_sklearn, average='macro')

    print(f"召回率:{recall_sklearn}")

 

    f1_sklearn = f1_score(y_test, y_pred_test_sklearn, average='macro')

    print(f"F1 值:{f1_sklearn}")

 

load_iris(来自 sklearn.datasets

无参数:该函数用于加载 Iris 数据集,包含四个特征(花萼长度、花萼宽度、花瓣长度、花瓣宽度)和三个类别标签(山鸢尾、变色鸢尾、维吉尼亚鸢尾)。

train_test_split(来自 sklearn.model_selection

X:特征数据,必填参数。此处为 Iris 数据集的特征部分 iris.data

y:目标数据,必填参数,表示类别标签,此处为 iris.target

test_size:测试集的比例。默认为 0.25,表示 25% 的数据作为测试集。此处设置为 1/3,即 33.3% 的数据作为测试集。

random_state:随机种子,用于确保数据划分的结果一致性,便于实验复现。此处设置为 42

cross_val_score(来自 sklearn.model_selection

estimator:模型对象,表示需要评估的模型,此处可为自定义的 CustomLogisticRegression scikit-learn LogisticRegression

X:特征数据,用于交叉验证,此处为训练集的特征数据 X_train

y:目标数据,用于交叉验证,此处为训练集的目标数据 y_train

cv:交叉验证的折数。设置为 5 表示五折交叉验证,即将数据集划分为五部分,每次使用四份训练,一份验证,重复五次,取平均值。

LogisticRegression(来自 sklearn.linear_model

max_iter:最大迭代次数。默认值为 100,用于控制迭代次数以避免不收敛问题。此处设置为 10000

accuracy_score(来自 sklearn.metrics

y_true:真实的目标值,此处为测试集的真实类别标签 y_test

y_pred:模型预测的目标值,如 custom_lr.predict(X_test) sklearn_lr.predict(X_test)

作用:计算模型的准确率,即预测正确的样本数占总样本数的比例

precision_score(来自 sklearn.metrics

y_true:真实的目标值。

y_pred:模型预测的目标值。

average:平均方式,用于多类别数据时的计算。'macro' 表示对每个类别的精度取平均,不考虑类别不平衡;'micro' 表示合并所有类别计算总体精度;'weighted' 为加权平均,考虑类别数量差异。

zero_division:处理分母为 0 时的情况。设置为 0 表示此类别没有预测样本时精度为 0

recall_score(来自 sklearn.metrics

y_true:真实的目标值。

y_pred:模型预测的目标值。

average:与 precision_score 中的 average 用法相同,'macro' 表示每个类别的召回率取平均值。

f1_score(来自 sklearn.metrics

y_true:真实的目标值。

y_pred:模型预测的目标值。

average:用于多类别数据时的 F1 值计算方式,'macro' 表示每个类别的 F1 值取平均,用于评价模型整体表现。

 

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

 

四、实验结果分析

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

 

 

2. 对比分析

准确度:scikit-learn 逻辑回归模型在五折交叉验证和测试集上都达到了非常好的准确度,而自定义模型的表现则相对较低。这表明 scikit-learn 模型在分类任务上具有极高的准确性。

精度和召回率:scikit-learn 模型在精度和召回率上也表现出色,均接近或达到 1.0,显示了模型在识别正类和捕获负类上都做得很好。相比之下,自定义模型的精度和召回率较低,表明其在某些类别上可能存在误分类。

F1 值:F1 值综合了精度和召回率,scikit-learn 模型的 F1 值同样达到了 1.0,显示了模型在平衡精度和召回率方面做得非常好。自定义模型的 F1 值较低,进一步证实了其整体性能不如 scikit-learn 模型。

 

从实验结果可见,scikit-learn 提供的 LogisticRegression 模型在 iris 数据集上的表现远优于自定义实现的逻辑回归模型。这可能是由于 scikit-learn 的模型经过了优化,使用了更有效的算法和参数调整。像 scikit-learn 这样经过严格测试和优化的库是实际应用中更好的选择。

 

 


实验三:C4.5(带有预剪枝和后剪枝)算法实现与测试

一、实验目的

深入理解决策树、预剪枝和后剪枝的算法原理,能够使用 Python 语言实现带有预剪枝

和后剪枝的决策树算法 C4.5 算法的训练与测试,并且使用五折交叉验证算法进行模型训练

与评估。

二、实验内容

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

意同分布取样);

(2)使用训练集训练分类带有预剪枝和后剪枝的 C4.5 算法;

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

择;

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

部分。

 

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

    1. 算法伪代码

# 1. 加载数据集

加载 Iris 数据集

将数据集中的特征赋值为 X

将数据集中的标签赋值为 y

 2. 分割数据集

使用 train_test_split 将数据集按 2:1 比例分为训练集和测试集

  - 设置测试集为 33% test_size=0.33

  - 保证训练集和测试集的类别比例一致(stratify=y

  - 设置随机种子为 42 确保结果可复现

 3. 创建并训练带预剪枝的决策树模型

创建决策树分类器,设置如下参数:

  - 最大深度(max_depth)为 5

  - 最小样本数(min_samples_split)为 10

  - 每个叶子节点最小样本数(min_samples_leaf)为 5

  - 随机种子(random_state)为 42

使用训练集数据训练决策树模型

4. 使用五折交叉验证评估模型性能

对训练集进行 5 折交叉验证,评估模型的不同指标:

  - 计算准确度(accuracy

  - 计算加权精度(precision

  - 计算加权召回率(recall

  - 计算加权 F1 值(f1

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

 5. 使用测试集评估模型性能

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

计算测试集的各项性能指标:

  - 准确度(accuracy

  - 精度(precision

  - 召回率(recall

  - F1 值(f1

输出测试集的评估结果

 6. 输出混淆矩阵

计算并打印测试集的混淆矩阵

   2. 算法主要代码

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

# -*- coding: utf-8 -*-

from sklearn.datasets import load_iris

from sklearn.model_selection import train_test_split, cross_val_score

from sklearn.tree import DecisionTreeClassifier

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

from sklearn.model_selection import cross_val_predict

 

# 加载iris数据集

iris = load_iris()

X, y = iris.data, iris.target

 

# 使用留出法留出1/3的样本作为测试集

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=1/3, random_state=42)

 

# 创建带有预剪枝的C4.5决策树模型

# max_depth限制树的最大深度,min_samples_split限制分裂内部节点所需的最小样本数

clf = DecisionTreeClassifier(criterion="gini", max_depth=3, min_samples_split=5, random_state=42)

 

# 训练模型

clf.fit(X_train, y_train)

 

# 使用五折交叉验证评估模型性能

scores = cross_val_score(clf, X_train, y_train, cv=5, scoring='accuracy')

print("Accuracy scores:", scores)

print("Accuracy mean:", scores.mean())

 

# 计算精度、召回率和F1

precision = cross_val_score(clf, X_train, y_train, cv=5, scoring='precision_weighted').mean()

recall = cross_val_score(clf, X_train, y_train, cv=5, scoring='recall_weighted').mean()

f1 = cross_val_score(clf, X_train, y_train, cv=5, scoring='f1_weighted').mean()

 

print("精度:", precision)

print("召回率:", recall)

print("F1:", f1)

 

# 使用测试集测试模型性能

y_pred = clf.predict(X_test)

 

# 输出测试集上的分类报告

print("测试集上的分类报告:")

print(classification_report(y_test, y_pred))

 

# 输出测试集上的准确度

test_accuracy = accuracy_score(y_test, y_pred)

print("测试集上的准确度:", test_accuracy)

 

 

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

 

 

四、实验结果分析

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

 

 

2. 对比分析

 训练集交叉验证与测试集表现

  • 交叉验证平均准确率为 93%,而测试集准确率为 98%,测试集表现优于交叉验证。这可能表明测试集的样本分布与训练集更为相似,或者模型在当前设置下不存在过拟合问题。
    • 但需注意交叉验证的波动(如最低的 0.8)可能受到数据划分或随机性影响,提示可以进一步优化模型的稳定性。

类别间表现差异

  • 类别的表现最佳,精确率、召回率和 F1 分数均为 1.0,说明该类在数据集中具有显著特征,容易被模型正确分类。
    • 类别的精确率和召回率略有下降,但差距不大,可能由于这些类别之间的特征存在一定的相似性或样本数量较少。后续可以通过数据增强或特征优化来改善分类效果。

F1 分数与实际应用的意义

  • F1 分数的高值表明模型在处理假阳性和假阴性时的表现较均衡,适合在高精度和高召回率均重要的场景中使用。
  • 此外,对于多分类问题,加权平均值的高值说明模型对每类的样本数量差异处理得当,整体表现良好。


实验四:SMO 算法实现与测试

一、实验目的

深入理解支持向量机(SVM)的算法原理,能够使用 Python 语言实现支持向量机的训 练与测试,并且使用五折交叉验证算法进行模型训练与评估。

二、实验内容

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

(2)使用训练集训练支持向量机—SMO 分类算法; 

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

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

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

   1. 算法伪代码

1) 加载 Iris 数据集

     scikit-learn 导入 Iris 数据集

    获取特征数据 X 和目标标签 y

 

2) 划分数据集

    使用 `train_test_split()` 将数据集划分为训练集和测试集

    设置测试集占比为 1/333%),保持类分布一致(stratify

 

3) 创建支持向量机模型(SMO

    创建一个支持向量机分类器 SVM(使用线性核)

    用训练集 X_train y_train 来训练支持向量机模型

 

4) 交叉验证评估模型性能

    使用 `StratifiedKFold` 进行五折交叉验证

    计算准确度、精度、召回率和 F1

    输出交叉验证的平均结果(包括标准差)

 

5) 测试模型性能

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

    计算测试集上的准确度、精度、召回率和 F1

    输出分类报告,包括每个类别的精度、召回率和 F1

 

6) 分析结果

    比较交叉验证和测试集的评估指标,判断模型的表现

    如果交叉验证和测试集的结果相差较大,考虑是否存在过拟合或欠拟合

    结合分类报告进一步分析模型在不同类别上的表现

   2. 算法主要代码

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

# 导入必要的库

from sklearn import datasets

from sklearn.model_selection import train_test_split, cross_val_score, StratifiedKFold

from sklearn.svm import SVC

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

import numpy as np

 

# 1. 加载 Iris 数据集

iris = datasets.load_iris()

X = iris.data  # 特征数据

y = iris.target  # 目标标签

 

# 2. 使用留出法将数据集划分为训练集和测试集,留出 1/3 样本作为测试集

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=42, stratify=y)

 

# 3. 使用训练集训练支持向量机(SVM)分类器(SMO

svm_model = SVC(kernel='linear', random_state=42)  # 使用线性核的支持向量机

 

# 训练模型

svm_model.fit(X_train, y_train)

 

# 4. 使用五折交叉验证评估模型的性能(准确度、精度、召回率和 F1 值)

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

 

# 准确度

accuracy_scores = cross_val_score(svm_model, X, y, cv=cv, scoring='accuracy')

 

# 精度、召回率、F1

precision_scores = cross_val_score(svm_model, X, y, cv=cv, scoring='precision_weighted')

recall_scores = cross_val_score(svm_model, X, y, cv=cv, scoring='recall_weighted')

f1_scores = cross_val_score(svm_model, X, y, cv=cv, scoring='f1_weighted')

 

# 输出交叉验证结果

print(f"准确度 (Accuracy): {accuracy_scores.mean():.4f} ± {accuracy_scores.std():.4f}")

print(f"精度 (Precision): {precision_scores.mean():.4f} ± {precision_scores.std():.4f}")

print(f"召回率 (Recall): {recall_scores.mean():.4f} ± {recall_scores.std():.4f}")

print(f"F1 (F1-score): {f1_scores.mean():.4f} ± {f1_scores.std():.4f}")

 

# 5. 使用测试集测试模型性能

y_pred = svm_model.predict(X_test)

 

# 输出测试集上的性能评估结果

print("\n模型在测试集上的表现:")

print(f"准确度 (Accuracy): {accuracy_score(y_test, y_pred):.4f}")

print(f"精度 (Precision): {precision_score(y_test, y_pred, average='weighted'):.4f}")

print(f"召回率 (Recall): {recall_score(y_test, y_pred, average='weighted'):.4f}")

print(f"F1 (F1-score): {f1_score(y_test, y_pred, average='weighted'):.4f}")

 

# 输出分类报告

print("\n分类报告:")

print(classification_report(y_test, y_pred))

 

函数参数说明:

1train_test_split() 划分数据集为训练集和测试集。

2SVC() 创建支持向量机分类模型。

3cross_val_score() StratifiedKFold() 用于交叉验证模型性能。

4accuracy_score()precision_score()recall_score() f1_score() 用于评估模型在测试集上的各项性能。

5classification_report() 输出每个类别的精度、召回率、F1 值等。

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

 

四、实验结果分析

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

 

2. 对比分析

起初因为数据集较小,模型性能较高,而导致实验结果显示出过拟合。

因为Iris 数据集只有 150 个样本,类别分布均衡(每类 50 个样本),并且特征简单(4 个维度)。这种情况下,SVM 本身就是一种性能较好的分类器,可能会表现得过于完美。所以我将代码增加了非线性核并调整了参数,以避免结果过于理想化。

交叉验证结果分析

准确度 (Accuracy):
平均值为 96.67% ± 2.93%,表明 SVM 模型在交叉验证中的表现非常稳定。交叉验证通过多次分割训练集和验证集,评估了模型的泛化能力,结果显示模型在不同数据划分上的性能波动较小。

精确率 (Precision):
平均值为 96.95% ± 2.77%,说明模型在预测正类样本时,错误率非常低。

召回率 (Recall):
平均值为 96.67% ± 2.93%,意味着模型能够很好地捕获所有类别的样本。

F1 值 (F1-score):
平均值为 96.65% ± 3.00%,综合了精确率和召回率的权衡,说明模型在所有类别的分类任务上表现良好。

测试集结果分析

测试集的 准确度  96.00%,略低于交叉验证的平均准确度,但仍然处于合理范围内。

从分类报告看:

类别的精确率、召回率和 F1 值均为 1.00,说明模型完全正确地预测了该类别样本。

类别的精确率和召回率接近于 94%,性能稍有下降,但依然较高。

宏平均 (Macro avg)  加权平均 (Weighted avg) 均为 96%,表明模型对每个类别都较为平衡。

交叉验证与测试集对比

性能接近

测试集准确度为 96%,与交叉验证的平均准确度(96.67%)非常接近。这说明模型的性能在训练、验证和测试阶段保持了一致性,没有明显的过拟合或欠拟合现象。

交叉验证结果稍优

交叉验证结果的精确率和召回率稍高于测试集,可能是因为交叉验证平均了多个数据分割的结果,而单一测试集可能受到随机划分的影响。

测试集表现稳定

测试集的分类报告显示所有类别的预测性能都非常高,且差异较小,说明模型在实际测试中的表现稳定且可靠。

 

 

 


实验五:BP 神经网络算法实现与测试

一、实验目的

深入理解 BP 神经网络的算法原理,能够使用 Python 语言实现 BP 神经网络的训练与测 试,并且使用五折交叉验证算法进行模型训练与评估。

二、实验内容

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

2)使用训练集训练 BP 神经网络分类算法;

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

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

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

   1. 算法伪代码

1) 加载 Iris 数据集

  使用 `load_iris()` 获取数据集,存储特征数据为 `X`,标签数据为 `y`

2) 划分数据集

  使用 `train_test_split()` 将数据集分割为训练集和测试集

  训练集占 2/3,测试集占 1/3,确保类别分布一致(通过 `stratify=y`)。

  存储划分后的数据为 `X_train`, `X_test`, `y_train`, `y_test`

3) 训练支持向量机(SVM)模型

  创建 SVM 分类模型 `svm_model`,选择线性核函数。

  使用 `X_train` `y_train` 数据训练模型。

4) 使用交叉验证评估模型性能

  创建五折交叉验证对象 `StratifiedKFold`

  定义评估指标:准确度、加权精度、加权召回率、加权 F1 分数。

  使用 `cross_validate()` 对训练集进行五折交叉验证,获取不同评估指标的平均值。

5) 打印交叉验证结果

  输出交叉验证中的平均准确度、精度、召回率和 F1 分数。

6) 使用测试集评估模型性能

  使用 `svm_model` 对测试集 `X_test` 进行预测,得到预测结果 `y_pred`

  计算测试集上的性能指标:准确度、加权精度、加权召回率和加权 F1 分数。  

7) 打印测试集上的评估结果

   输出测试集的准确度、精度、召回率和 F1 分数。

   2. 算法主要代码

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

# 导入必要的库

from sklearn.datasets import load_iris

from sklearn.model_selection import train_test_split, StratifiedKFold, cross_val_score

from sklearn.neural_network import MLPClassifier

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

import numpy as np

 

# 1. 加载 Iris 数据集

iris = load_iris()

X = iris.data  # 特征数据

y = iris.target  # 目标标签

 

# 2. 使用留出法划分训练集和测试集(留出 1/3 数据作为测试集)

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=42, stratify=y)

 

# 3. 使用训练集训练 BP 神经网络

# 配置 BP 神经网络的参数

bp_model = MLPClassifier(

    hidden_layer_sizes=(10, 10),  # 两层隐藏层,每层 10 个神经元

    activation='relu',           # 激活函数使用 ReLU

    solver='adam',               # 优化算法使用 Adam

    max_iter=1000,               # 最大迭代次数

    random_state=42

)

 

# 模型训练

bp_model.fit(X_train, y_train)

 

# 4. 使用五折交叉验证评估模型性能

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

 

# 计算交叉验证的各项指标

accuracy_scores = cross_val_score(bp_model, X, y, cv=cv, scoring='accuracy')

precision_scores = cross_val_score(bp_model, X, y, cv=cv, scoring='precision_weighted')

recall_scores = cross_val_score(bp_model, X, y, cv=cv, scoring='recall_weighted')

f1_scores = cross_val_score(bp_model, X, y, cv=cv, scoring='f1_weighted')

 

# 输出交叉验证的评估结果

print("交叉验证性能:")

print(f"准确度 (Accuracy): {accuracy_scores.mean():.4f} ± {accuracy_scores.std():.4f}")

print(f"精确率 (Precision): {precision_scores.mean():.4f} ± {precision_scores.std():.4f}")

print(f"召回率 (Recall): {recall_scores.mean():.4f} ± {recall_scores.std():.4f}")

print(f"F1 (F1-score): {f1_scores.mean():.4f} ± {f1_scores.std():.4f}")

 

# 5. 使用测试集评估模型性能

y_pred = bp_model.predict(X_test)

 

# 输出测试集的评估结果

print("\n测试集性能:")

print(f"准确度 (Accuracy): {accuracy_score(y_test, y_pred):.4f}")

print(f"精确率 (Precision): {precision_score(y_test, y_pred, average='weighted'):.4f}")

print(f"召回率 (Recall): {recall_score(y_test, y_pred, average='weighted'):.4f}")

print(f"F1 (F1-score): {f1_score(y_test, y_pred, average='weighted'):.4f}")

 

# 输出分类报告

print("\n分类报告:")

print(classification_report(y_test, y_pred))

 

·  load_iris():加载 Iris 数据集,无参数,返回特征矩阵和目标标签。

·  train_test_split(X, y, test_size=0.33, random_state=42, stratify=y):将数据集划分为训练集和测试集,其中为特征矩阵,为目标标签,test_size 指定测试集占比(默认为 0.33),random_state 确保划分可复现,stratify 保证划分后类别分布一致。

· MLPClassifier(hidden_layer_sizes=(100,),activation='relu', solver='adam', random_state=42):构建 BP 神经网络分类模型,其中 hidden_layer_sizes 设置隐藏层神经元数量(默认为单层 100 个神经元),activation 指定激活函数(默认为 ReLU),solver 设置优化算法(默认为 Adam),random_state 确保结果可复现。

·  StratifiedKFold(n_splits=5, shuffle=True, random_state=42):实现分层 K 折交叉验证,其中 n_splits 为折数(默认为 5),shuffle 表示是否打乱数据,random_state 用于保持随机性可复现。

·  cross_val_score(estimator, X, y, cv=5, scoring='accuracy'):对模型进行交叉验证,estimator 为待评估模型,分别为特征矩阵和目标标签,cv 指定折数,scoring 为评估指标(如 accuracy、precision 等)。

·  classification_report(y_true, y_pred, target_names=None):输出分类报告,y_true 为真实标签,y_pred 为预测标签,target_names 指定类别名称(可选)。

·  accuracy_score(y_true, y_pred):计算预测的准确率,y_true 为真实标签,y_pred 为预测标签。

·  precision_score(y_true, y_pred, average='weighted'):计算加权精确率,y_true 为真实标签,y_pred 为预测标签,average 指定加权方式(默认为 weighted)。

·  recall_score(y_true, y_pred, average='weighted'):计算加权召回率,y_true 为真实标签,y_pred 为预测标签,average 指定加权方式(默认为 weighted)。

·  f1_score(y_true, y_pred, average='weighted'):计算加权 F1 值,y_true 为真实标签,y_pred 为预测标签

 

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

 

四、实验结果分析

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

 

 

2. 对比分析

1. 留出法 vs 五折交叉验证

数据分割

留出法将数据集直接划分为训练集和测试集(33% 数据为测试集)。

五折交叉验证将数据分成五等份,每次选一份作为验证集,其余作为训练集,循环五次。

优点

留出法简单快速,适合小规模实验。

五折交叉验证通过多次评估减小过拟合风险,更适合在大规模实验中选择最优模型。

性能比较

留出法的测试集结果显示准确度为 96%,模型在测试集上的表现较好。

五折交叉验证的结果(平均准确度为 96.67% ± 2.93%)显示模型具有较高稳定性和较小波动。

2. 分类性能对比

  • 从分类报告中可以看出:

类别 0Setosa)的精确率、召回率和 F1 值均为 1.00,说明模型对该类别的分类效果最好。

类别 1  2 的性能略低,F1 值分别为 0.94  0.94,可能与类别分布或模型的泛化能力有关。

3. BP 神经网络的表现

  • BP 神经网络通过隐层提取数据特征,适合非线性分类问题。
  • Iris 数据集上的性能接近完美,表明该算法足以应对数据规模小、分类任务明确的场景。
  • 若数据量更大或特征更复杂,可以增加隐藏层神经元数量或使用更高级优化方法(如 SGD),以提升泛化能力。

 


实验六:朴素贝叶斯算法实现与测试

一、实验目的

深入理解朴素贝叶斯的算法原理,能够使用 Python 语言实现朴素贝叶斯的训练与测试, 并且使用五折交叉验证算法进行模型训练与评估。

二、实验内容

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

(2)使用训练集训练朴素贝叶斯分类算法; 

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

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

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

   1. 算法伪代码

1) 导入必要的库:

  导入 numpy

  导入 scikit-learn 中的模块:datasets, train_test_split, cross_val_score, StratifiedKFold, GaussianNB, accuracy_score, precision_score, recall_score, f1_score, classification_report

2) 加载 Iris 数据集:

  使用 datasets.load_iris() 加载数据集

  将特征数据赋值给 X

  将标签数据赋值给 y

3) 划分数据集:

  使用 train_test_split 将数据划分为训练集和测试集

  设置测试集大小为 33%,并确保数据按标签(y)分层(stratify=y

4) 训练朴素贝叶斯分类器:

  创建朴素贝叶斯分类器实例 nb_classifier

  使用训练集 X_train y_train 拟合分类器

5) 使用交叉验证评估模型性能:

  创建 StratifiedKFold 交叉验证对象 cv,指定 5 折交叉验证

  计算交叉验证中的各项指标:

  使用 cross_val_score 计算准确度、精度、召回率和 F1 值,分别使用 'accuracy', 'precision_macro', 'recall_macro', 'f1_macro' 评分标准

  输出交叉验证结果的均值和标准差

6) 在测试集上评估模型:

   使用 nb_classifier 在测试集 X_test 上进行预测,得到 y_pred

   使用 accuracy_scoreprecision_scorerecall_score f1_score 计算测试集上的性能评估指标

   输出测试集上的各项指标

7) 生成详细的分类报告:

  使用 classification_report 生成并输出分类报告,展示测试集上的各类指标

   2. 算法主要代码

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

# 导入必要的库
import numpy as np
from sklearn import datasets
from sklearn.model_selection import train_test_split, cross_val_score, StratifiedKFold
from sklearn.naive_bayes import GaussianNB
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, classification_report

# 1. 从 scikit-learn 库中加载 iris 数据集
iris = datasets.load_iris()
X = iris.data  # 特征数据
y = iris.target  # 标签数据

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

# 3. 使用训练集训练朴素贝叶斯分类算法
nb_classifier = GaussianNB()  # 朴素贝叶斯分类器
nb_classifier.fit(X_train, y_train)

# 4. 使用五折交叉验证对模型性能进行评估
# 使用交叉验证评估模型的准确度、精度、召回率和 F1 值
cv = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)

# 交叉验证的准确度
accuracy = cross_val_score(nb_classifier, X, y, cv=cv, scoring='accuracy')
# 交叉验证的精度
precision = cross_val_score(nb_classifier, X, y, cv=cv, scoring='precision_macro')
# 交叉验证的召回率
recall = cross_val_score(nb_classifier, X, y, cv=cv, scoring='recall_macro')
# 交叉验证的 F1 值
f1 = cross_val_score(nb_classifier, X, y, cv=cv, scoring='f1_macro')

# 输出交叉验证结果
print(f"Accuracy (Cross-validation): {accuracy.mean():.4f} ± {accuracy.std():.4f}")
print(f"Precision (Cross-validation): {precision.mean():.4f} ± {precision.std():.4f}")
print(f"Recall (Cross-validation): {recall.mean():.4f} ± {recall.std():.4f}")
print(f"F1 Score (Cross-validation): {f1.mean():.4f} ± {f1.std():.4f}")

# 5. 使用测试集测试模型性能
y_pred = nb_classifier.predict(X_test)

# 计算模型的评估指标
accuracy_test = accuracy_score(y_test, y_pred)
precision_test = precision_score(y_test, y_pred, average='macro')
recall_test = recall_score(y_test, y_pred, average='macro')
f1_test = f1_score(y_test, y_pred, average='macro')

# 输出测试集上的结果
print("\nTest Set Performance:")
print(f"Accuracy: {accuracy_test:.4f}")
print(f"Precision: {precision_test:.4f}")
print(f"Recall: {recall_test:.4f}")
print(f"F1 Score: {f1_test:.4f}")

# 生成详细的分类报告
print("\nClassification Report:")
print(classification_report(y_test, y_pred))

 

参数说明:

X: 特征数据,可以是数组或 pandas DataFrame,表示输入变量。

y: 标签数据,表示目标变量,通常是数组或列表。

test_size: 测试集占整个数据集的比例,默认为 0.33(即 33% 的数据为测试集)。

random_state: 用于控制数据划分的随机性,设定一个整数值以确保可复现结果。默认为 None,表示每次运行时划分可能不同。

 

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

 

 

四、实验结果分析

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

 

 

2. 对比分析

评估方法

优点

缺点

留出法(Holdout

简单快速,易于实现;适用于大规模数据

可能无法充分利用所有数据;结果对数据划分敏感

交叉验证(Cross-validation

能有效评估模型泛化能力;减少过拟合风险;综合考虑多个评估指标

计算成本高,尤其是对于大数据集;评估结果有时受数据划分影响

测试集评估

直接反映模型在独立数据上的性能;能够生成详细分类报告

可能存在偶然性,且仅依赖单一数据划分,不能完全反映模型性能

 

 


实验七:K均值聚类算法实现与测试

一、实验目的

深入理解 K 均值聚类算法的算法原理,进而理解无监督学习的意义,能够使用 Python语言实现 K 均值聚类算法的训练与测试,并且使用五折交叉验证算法进行模型训练与评估。

二、实验内容

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

意同分布取样);

(2)使用训练集训练 K 均值聚类算法,类别数为 3

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

择;

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

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

   1. 算法伪代码

  1. 算法伪代码

输入:数据集 X = {x1, x2, ..., xn},簇的数量 K

输出:每个数据点的簇标签,以及簇的中心点

 

1. 初始化 K 个簇中心(可以随机选择 K 个数据点作为初始中心,或通过某种启发式方法选择)

   - 设簇中心为 C1, C2, ..., CK

 

2. 重复以下步骤直到收敛:

   1. 为每个数据点 xi 分配一个簇标签 ci,使得它属于距离其最近的簇中心:

      - 对于每个数据点 xi,计算 xi 到各个簇中心 Cj 的距离(一般使用欧几里得距离)

      - 将数据点 xi 分配给最近的簇中心 Cj,更新其簇标签 ci

   2. 重新计算每个簇的中心点(即每个簇的均值):

      - 对于每个簇 j,更新簇中心 Cj 为簇内所有数据点的均值:

        Cj = (1/mj) * Σ(xi cluster j) xi

      其中 mj 是簇 j 中的样本数量,Σ 表示对所有属于簇 j 的样本 xi 求和。

 

3. 判断是否收敛:

   - 如果簇中心不再变化,或者变化非常小,则停止迭代

   - 否则,继续执行步骤 2

 

返回:每个数据点的簇标签及最终的簇中心

   2. 算法主要代码

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

# 导入必要的库
import numpy as np
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.cluster import KMeans
from sklearn.metrics import classification_report
from sklearn.model_selection import cross_val_score
from sklearn.metrics import make_scorer

# 1. 加载 Iris 数据集
iris = datasets.load_iris()
X = iris.data  # 特征矩阵
y = iris.target  # 目标标签

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

# 3. 使用 K 均值聚类算法进行训练,类别数设置为 3
kmeans = KMeans(n_clusters=3, random_state=42)
kmeans.fit(X_train)

# 4. 使用五折交叉验证进行模型性能评估
# 定义交叉验证评分(准确度、精度、召回率、F1 值)
scoring = ['accuracy', 'precision_macro', 'recall_macro', 'f1_macro']

# 使用 cross_val_score 进行五折交叉验证
for score in scoring:
    cv_score = cross_val_score(kmeans, X_train, y_train, cv=5, scoring=score)
    print(f'Cross-validation {score}: {cv_score.mean():.4f} ± {cv_score.std():.4f}')

# 5. 使用测试集评估模型性能
y_pred = kmeans.predict(X_test)

# 输出分类报告,评估模型的性能
print("\nClassification Report on Test Set:")
print(classification_report(y_test, y_pred))

# 输出聚类的中心点
print("\nCluster Centers:")
print(kmeans.cluster_centers_)

 

 

函数参数:

n_clusters: 聚类簇数,默认 8

  init: 初始化方法,'k-means++'(默认)或 'random'

  n_init: 运行次数,默认 10

  max_iter: 最大迭代次数,默认 300

  tol: 收敛阈值,默认 1e-4

random_state: 随机数种子,控制结果一致性,默认 None

algorithm: 算法选择,'auto'(默认),'full''elkan'

  verbose: 输出详细信息,0(默认)为不输出。

 n_jobs: 并行计算的作业数,-1为使用所有核心,默认 1

 

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

 

 

四、实验结果分析

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

 

 

2. 对比分析

 K 均值:适合球形簇,要求预设簇数,处理大数据集高效,但对离群点敏感。

层次聚类:适合小数据集,能发现任意形状簇,但计算复杂度高。

DBSCAN:适合任意形状簇,能有效处理噪声和离群点,但对密度差异敏感。


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

一、实验目的

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

二、实验内容

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

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

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

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

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

   1. 算法伪代码

 1. 算法伪代码

输入:训练数据集 D = {(x1, y1), (x2, y2), ..., (xn, yn)},其中 xi 是特征向量,yi 是标签

      树的数量 T,树的最大深度 max_depth,最小样本分裂数 min_samples_split

 

1. 初始化一个空的随机森林模型 Forest = []

2. 对于 i = 1 到 T:

    a. 从 D 中有放回地随机抽取一个样本子集 D_i,样本数与原数据集大小相同(Bootstrap抽样)

    b. 对于每棵树:

        i. 使用随机特征选择:对于每个分裂点,从总特征集合中随机选择一个特征子集(例如,选择√m个特征)来决定最佳分裂。

        ii. 训练决策树 T_i 使用样本集 D_i,直到达到最大深度或其他停止条件(如最小样本分裂数)

        iii. 将训练好的树 T_i 加入随机森林模型 Forest

    

3. 对于测试数据 x_test,计算其预测结果:

    a. 每棵树 T_i 给出一个分类预测 y_pred_i

    b. 最终预测结果 y_pred 由投票机制决定:选择出现次数最多的类别作为最终结果

 

4. 返回最终的预测结果 y_pred

 

   2. 算法主要代码

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

 # 导入所需库

import numpy as np

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, classification_report

from sklearn.datasets import load_iris

 

# 1. 加载数据集

data = load_iris()

X = data.data

y = data.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 = RandomForestClassifier(n_estimators=100, random_state=42)

 

# 4. 使用五折交叉验证评估模型

cv_accuracy = cross_val_score(rf, X_train, y_train, cv=5, scoring='accuracy')

cv_precision = cross_val_score(rf, X_train, y_train, cv=5, scoring='precision_macro')

cv_recall = cross_val_score(rf, X_train, y_train, cv=5, scoring='recall_macro')

cv_f1 = cross_val_score(rf, X_train, y_train, cv=5, scoring='f1_macro')

 

print(f"五折交叉验证准确率: {cv_accuracy.mean()}")

print(f"五折交叉验证精度: {cv_precision.mean()}")

print(f"五折交叉验证召回率: {cv_recall.mean()}")

print(f"五折交叉验证F1: {cv_f1.mean()}")

 

# 5. 训练模型

rf.fit(X_train, y_train)

 

# 6. 预测与测试集评估

y_pred = rf.predict(X_test)

 

accuracy = accuracy_score(y_test, y_pred)

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

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

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

 

print("\n测试集性能:")

print(f"准确率: {accuracy}")

print(f"精度: {precision}")

print(f"召回率: {recall}")

print(f"F1: {f1}")

 

# 输出测试集的分类报告

print("\n测试集分类报告:")

print(classification_report(y_test, y_pred))

 

 

函数参数:

RandomForestClassifier

n_estimators:树的数量(默认 100)。

random_state:随机数种子,用于结果的可重复性。

max_depth:树的最大深度(默认 None,表示直到所有叶节点纯净)。

min_samples_split:分裂节点时的最小样本数。

min_samples_leaf:叶子节点的最小样本数。

train_test_split

test_size:测试集的比例(默认 0.25)。

random_state:控制数据划分的随机性。

stratify:是否进行分层抽样,确保类别分布一致。

 cross_val_score

 scoring:评估指标,可以是 'accuracy''precision''recall''f1' 等。

accuracy_score:计算准确率,y_true y_pred 为真实标签和预测标签。

 precision_score:计算精度(查准率),适用于二分类或多分类问题,average='macro' 表示计算每类的精度并取平均。

 recall_score:计算召回率(查全率),average='macro' 同理。

 f1_score:计算 F1 值,是精度与召回率的调和均值。

 

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

 

 

四、实验结果分析

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

 

 

2. 对比分析

高准确性:通过集成多棵决策树,随机森林能有效提高分类精度,减少过拟合。

抗噪声能力强:由于每棵树的训练数据是随机抽样的,因此对噪声的鲁棒性更强。

自动处理特征选择:随机森林在训练过程中通过随机选择特征来进行分裂,能够自动发现数据中重要的特征。

高效并行训练:每棵树是独立训练的,因此可以并行处理,加速训练过程。

较少的参数调优:随机森林不需要复杂的参数调整,默认参数就能达到较好的效果。

 

 

 


实验总结

通过这一系列实验的学习与实践,我对机器学习领域的理论知识和算法实现有了更加深入的理解。从基础的逻辑回归到复杂的 BP 神经网络,以及从分类算法到聚类方法的实现,这些实验为我提供了全方位的实践机会和理论巩固。同时,我也尝试了主流深度学习框架 TensorFlow PyTorch 的基本使用,为未来的学习打下了良好的基础。

1. 数据准备与模型评估

在实验一中,通过数据预处理和模型评估方法的学习,我认识到数据的质量对模型性能至关重要。特征归一化、缺失值处理以及合理的样本划分策略(如留出法和交叉验证)不仅能提升模型效果,还可以让评估更加客观可靠。这一阶段的学习为后续实验的算法实现奠定了坚实的基础。

2. 分类算法的学习与实现

实验二至实验六涵盖了多种分类算法,包括 逻辑回归、C4.5 决策树、支持向量机(SMO 算法)、BP 神经网络 和 朴素贝叶斯。
这些实验让我体会到不同算法的特点与应用场景:

逻辑回归:适合解决线性二分类问题,具有较好的可解释性,适用于特征独立的场景。

C4.5 决策树:通过信息增益率构造树状模型,便于理解和使用,预剪枝与后剪枝进一步提升了泛化能力。

支持向量机(SVM):适合高维数据分类,实验中的 SMO 算法让我理解了 SVM 优化问题的求解过程。

BP 神经网络:具备强大的非线性拟合能力,在复杂的多分类问题上表现优异,但训练时对超参数敏感。

朴素贝叶斯:简单高效,适合条件独立的特征场景,但当特征存在相关性时表现有限。

这些实验让我体会到,不同算法有其独特的适用场景和局限性,选择时需要根据实际任务需求和数据特性做出权衡。

3. 聚类与集成算法的实践

实验七和实验八分别涉及了 K 均值聚类算法 和 随机森林算法。

K 均值聚类 作为一种无监督学习方法,强调簇内样本的相似性和簇间样本的差异性。在实验中,我深刻认识到初始聚类中心选择对结果的重要性,以及如何通过肘部法则确定合适的簇数。

随机森林 则是典型的集成学习方法,通过构建多棵决策树并融合其结果,提升了模型的鲁棒性和泛化能力。在高维、复杂数据上,随机森林表现出色,但也需要注意训练时间随数据量增大的显著增加。

4. TensorFlow PyTorch 的学习

在实验过程中,我还学习了 TensorFlow PyTorch 这两大主流深度学习框架。

TensorFlow 强调工业化和大规模分布式训练,适合生产环境,2.x 版本的动态图特性也让实验更加直观易懂。

PyTorch 则以其动态计算图和简洁的 API 深受研究者喜爱。它的灵活性和直观性让我在构建和调试神经网络时更加高效。
通过对这两种框架的学习,我不仅掌握了基本的深度学习模型构建方法,还深入理解了梯度下降、自动微分等核心概念,为未来的深度学习研究奠定了基础。

5. 总体感想

这一阶段的实验让我全面了解了 监督学习、无监督学习、集成学习 等多个机器学习领域的核心算法。同时,通过五折交叉验证和各种性能指标(如准确率、精度、召回率和 F1 值)的分析,我学会了如何科学评估模型性能,从而更合理地选择算法。

此外,我深刻认识到数据的重要性。在机器学习中,模型的性能不仅取决于算法本身,更与数据的质量密不可分。优质的数据准备和特征工程,往往能够显著提升模型效果。

未来,我将进一步探索更复杂的深度学习模型和优化方法,并尝试将所学知识应用到实际问题中,解决更具挑战性的任务。通过不断实践和总结,我相信自己能够在机器学习领域取得更大的进步。

 

 

posted on   po3a  阅读(9)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
 
点击右上角即可分享
微信分享提示