目 录
实验一:数据准备与模型评估
实验二:逻辑回归算法实现与测试
实验三: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.9733,F1:0.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)可能受到数据划分或随机性影响,提示可以进一步优化模型的稳定性。
类别间表现差异:
- 类别 0 的表现最佳,精确率、召回率和 F1 分数均为 1.0,说明该类在数据集中具有显著特征,容易被模型正确分类。
- 类别 1 和 2 的精确率和召回率略有下降,但差距不大,可能由于这些类别之间的特征存在一定的相似性或样本数量较少。后续可以通过数据增强或特征优化来改善分类效果。
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/3(33%),保持类分布一致(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))
函数参数说明:
(1)train_test_split() 划分数据集为训练集和测试集。
(2)SVC() 创建支持向量机分类模型。
(3)cross_val_score() 和 StratifiedKFold() 用于交叉验证模型性能。
(4)accuracy_score()、precision_score()、recall_score() 和 f1_score() 用于评估模型在测试集上的各项性能。
(5)classification_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%,略低于交叉验证的平均准确度,但仍然处于合理范围内。
从分类报告看:
类别 0 的精确率、召回率和 F1 值均为 1.00,说明模型完全正确地预测了该类别样本。
类别 1 和 2 的精确率和召回率接近于 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):将数据集划分为训练集和测试集,其中 X 为特征矩阵,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 为待评估模型,X 和 y 分别为特征矩阵和目标标签,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. 分类性能对比
- 从分类报告中可以看出:
类别 0(Setosa)的精确率、召回率和 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_score、precision_score、recall_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 值)的分析,我学会了如何科学评估模型性能,从而更合理地选择算法。
此外,我深刻认识到数据的重要性。在机器学习中,模型的性能不仅取决于算法本身,更与数据的质量密不可分。优质的数据准备和特征工程,往往能够显著提升模型效果。
未来,我将进一步探索更复杂的深度学习模型和优化方法,并尝试将所学知识应用到实际问题中,解决更具挑战性的任务。通过不断实践和总结,我相信自己能够在机器学习领域取得更大的进步。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)