11/6
实验七:K 均值聚类算法实现与测试
一、实验目的
深入理解 K 均值聚类算法的算法原理,进而理解无监督学习的意义,能够使用 Python语言实现 K 均值聚类算法的训练与测试,并且使用五折交叉验证算法进行模型训练与评估
二、实验内容
(1)从 scikit-learn 库中加载 iris 数据集,使用留出法留出 1/3 的样本作为测试集(注 意同分布取样);
(2)使用训练集训练 K 均值聚类算法,类别数为 3;
(3)使用五折交叉验证对模型性能(准确度、精度、召回率和 F1 值)进行评估和选 择;
(4)使用测试集,测试模型的性能,对测试结果进行分析,完成实验报告中实验七的 部分。
三、算法步骤、代码、及结果
1. 算法伪代码
1. 加载 iris 数据集
2. 将数据集分为特征 X 和标签 y
3. 使用留出法将数据集分为训练集和测试集,测试集大小为 1/3
4. 初始化 KMeans 算法,设置聚类数为 3
5. 使用训练集训练 KMeans 模型
6. 初始化五折交叉验证
7. 对训练集进行交叉验证,计算准确度、精度、召回率和 F1 值
8. 打印交叉验证结果
9. 使用测试集测试模型性能
10. 计算测试集的准确度、精度、召回率和 F1 值
11. 打印测试集性能指标
12. 计算并打印混淆矩阵
2. 算法主要代码
完整源代码\调用库方法(函数参数说明)
from sklearn import datasets
from sklearn.model_selection import train_test_split, cross_val_score,
StratifiedKFold
from sklearn.cluster import KMeans
from sklearn.metrics import accuracy_score, precision_score, recall_score,
f1_score, confusion_matrix
import numpy as np
# (1)加载 iris 数据集,并留出 1/3 的样本作为测试集
iris = datasets.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,
stratify=y, random_state=42)
# (2)使用训练集训练 K 均值聚类算法,类别数为 3
kmeans = KMeans(n_clusters=3, random_state=42)
kmeans.fit(X_train, y_train)
# (3)使用五折交叉验证对模型性能进行评估和选择
cv = StratifiedKFold(n_splits=5)
scores = cross_val_score(kmeans, X_train, y_train, cv=cv, scoring='accuracy')
# 计算交叉验证的平均准确度
accuracy = scores.mean()
precision = cross_val_score(kmeans, X_train, y_train, cv=cv,
scoring='precision_macro').mean()
recall = cross_val_score(kmeans, X_train, y_train, cv=cv,
scoring='recall_macro').mean()
f1 = cross_val_score(kmeans, X_train, y_train, cv=cv, scoring='f1_macro').mean()
# 打印交叉验证结果
print(f"交叉验证的平均准确度: {accuracy:.2f}")
print(f"交叉验证的平均精度: {precision:.2f}")
print(f"交叉验证的平均召回率: {recall:.2f}")
print(f"交叉验证的平均F1值: {f1:.2f}")
# (4)使用测试集测试模型的性能
y_pred = kmeans.predict(X_test)
# 计算测试集的性能指标
test_accuracy = accuracy_score(y_test, y_pred)
test_precision = precision_score(y_test, y_pred, average='macro')
test_recall = recall_score(y_test, y_pred, average='macro')
test_f1 = f1_score(y_test, y_pred, average='macro')
# 打印测试集的性能指标
print(f"测试集的准确度:
{test_accuracy:.2f}")
print(f"测试集的精度:
{test_precision:.2f}")
print(f"测试集的召回率: {test_recall:.2f}")
print(f"测试集的F1值: {test_f1:.2f}")
# 分析测试结果
# 这里可以添加对测试结果的分析,例如:
# - 混淆矩阵
conf_matrix = confusion_matrix(y_test, y_pred)
print("混淆矩阵:")
print(conf_matrix)
- KMeans(n_clusters=3, random_state=42)
- n_clusters: 要形成的簇(聚类)数量。
- random_state: 随机数种子,用于初始化质心,确保结果可复现。
- cross_val_score(estimator, X, y, cv, scoring)
- estimator: 要评估的模型。
- X: 特征数据。
- y: 标签数据。
- cv: 交叉验证策略。
- scoring: 评估标准,如 'accuracy', 'precision_macro', 'recall_macro', 'f1_macro'。
- StratifiedKFold(n_splits=5)
- n_splits: 交叉验证中折(fold)的数量。
- 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 值。
- confusion_matrix(y_true, y_pred)
- y_true: 真实的标签。
- y_pred: 预测的标签。
- 返回混淆矩阵,用于详细分析分类结果。
3. 训练结果截图(包括:准确率、精度(查准率)、召回率(查全率)、F1)
四、实验结果分析
1. 测试结果截图(包括:准确率、精度(查准率)、召回率(查全率)、F1)
2. 对比分析
模型在交叉验证中的表现非常差,可能需要调整模型参数或选择不同的模型。
测试集上的表现有所改善,但仍然有改进空间。
淆矩阵显示模型在区分类别1和类别2时存在问题,特别是类别2的样本经常被错误分类为类别1。
可能需要更多的数据预处理、特征工程或尝试不同的聚类算法来提高模型性能。

浙公网安备 33010602011771号