10.18

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

一、实验目的

 

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

二、实验内容

(1)从 scikit-learn 库中加载 iris 数据集,使用留出法留出 1/3 的样本作为测试集(注 意同分布取样); (2)使用训练集训练 K 均值聚类算法,类别数为 3; (3)使用五折交叉验证对模型性能(准确度、精度、召回率和 F1 值)进行评估和选 择; (4)使用测试集,测试模型的性能,对测试结果进行分析,完成实验报告中实验七的 部分。

 

 

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

   1. 算法伪代码

算法名称:基于 K 均值聚类的鸢尾花数据集分类及多维度性能评估

输入

 

鸢尾花数据集(包含特征数据以及对应的类别标签)

步骤



  1. 数据准备阶段
  • o 从 sklearn 库中加载鸢尾花数据集,提取特征数据赋值给变量 X,类别标签赋值给变量 y。
  • o 使用留出法,按照测试集占总样本的 0.33 比例,将数据集划分为训练集(X_train、y_train)和测试集(X_test、y_test),设置随机种子为 42 并通过 stratify=y 保证训练集和测试集的类别分布与原始数据集相似。
  1. 模型构建与训练阶段
  • o 创建 K 均值聚类模型实例 kmeans,设定类别数为 3,随机数生成器的种子设为 42,同时显式设置 n_init 参数为 10。
  • o 使用训练集数据(X_train、y_train)对 kmeans 模型进行训练。
  1. 交叉验证准备阶段
  • o 利用训练好的 kmeans 模型对训练集 X_train 进行预测,得到训练集的预测标签 train_predictions。
  • o 定义函数 evaluate_model,用于根据真实标签 y_true 和预测标签 y_pred 计算准确度(accuracy)、精度(precision)、召回率(recall)以及 F1 值(f1),计算精度、召回率、F1 值时采用 'weighted' 平均方式。
  1. 交叉验证阶段
  • o 运用五折交叉验证方法,针对 kmeans 模型在训练集(X_train、y_train)上进行性能评估,将每次折叠得到的评估分数存储在 cross_val_scores 变量中。
  • o 打印输出五折交叉验证得分(即 cross_val_scores 的值)。
  1. 训练集性能评估阶段
  • o 调用 evaluate_model 函数,传入训练集的真实标签 y_train 和预测标签 train_predictions,计算并获取训练集上的准确度、精度、召回率以及 F1 值,分别赋值给变量 accuracy、precision、precision、f1。
  • o 打印输出训练集上的各项评估指标,包括准确度、精度、召回率以及 F1 值。
  1. 测试集性能评估阶段
  • o 利用训练好的 kmeans 模型对测试集 X_test 进行预测,得到测试集的预测标签 test_predictions。
  • o 调用 evaluate_model 函数,传入测试集的真实标签 y_test 和预测标签 test_predictions,计算并获取测试集上的准确度、精度、召回率以及 F1 值,分别赋值给变量 test_accuracy、test_precision、test_recall、test_f1。
  • o 打印输出测试集上的各项评估指标,包括准确度、精度、召回率以及 F1 值。
  1. 聚类效果评估阶段(使用轮廓系数)
  • o 计算测试集的轮廓系数 silhouette_avg,通过 silhouette_score 函数传入测试集特征数据 X_test 和测试集预测标签 test_predictions 进行计算。
  • o 打印输出测试集轮廓系数(即 silhouette_avg 的值)。

输出



  1. 五折交叉验证得分。
  2. 训练集上的准确度、精度、召回率以及 F1 值。
  3. 测试集上的准确度、精度、召回率以及 F1 值。
  4. 测试集轮廓系数。

详细描述五折交叉验证的过程

评估模型性能的指标有哪些?

如何选择合适的K值对于K均值聚类?

 

   2. 算法主要代码

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

import numpy as np
import pandas as pd
from sklearn import datasets
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.cluster import KMeans
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score
from sklearn.metrics import silhouette_score

# 1. 加载 iris 数据集
iris = datasets.load_iris()
X = iris.data
y = iris.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. 训练 K 均值聚类算法,类别数为 3,设置 n_init 参数
kmeans = KMeans(n_clusters=3, random_state=42, n_init=10)  # 显式设置 n_init
kmeans.fit(X_train)

# 4. 使用五折交叉验证评估模型性能
# 为了计算准确度、精度、召回率和 F1 值,我们需要将聚类结果和真实标签进行比较
# KMeans 返回聚类标签,我们使用其预测进行评估
# 先得到训练集的预测标签
train_predictions = kmeans.predict(X_train)


# 然后为了便于进行交叉验证,定义一个函数来计算评估指标
def evaluate_model(y_true, y_pred):
    accuracy = accuracy_score(y_true, y_pred)
    precision = precision_score(y_true, y_pred, average='weighted')
    recall = recall_score(y_true, y_pred, average='weighted')
    f1 = f1_score(y_true, y_pred, average='weighted')
    return accuracy, precision, recall, f1


# 进行五折交叉验证
cross_val_scores = cross_val_score(kmeans, X_train, y_train, cv=5)
print(f'五折交叉验证得分: {cross_val_scores}')

# 在训练集上评估模型
accuracy, precision, recall, f1 = evaluate_model(y_train, train_predictions)
print(f'训练集上的评估指标:\n准确度: {accuracy}\n精度: {precision}\n召回率: {recall}\nF1 值: {f1}')

# 5. 在测试集上测试模型性能
test_predictions = kmeans.predict(X_test)
test_accuracy, test_precision, test_recall, test_f1 = evaluate_model(y_test, test_predictions)

print(f'测试集上的评估指标:\n准确度: {test_accuracy}\n精度: {test_precision}\n召回率: {test_recall}\nF1 值: {test_f1}')

# 6. 计算轮廓系数以评估聚类效果
silhouette_avg = silhouette_score(X_test, test_predictions)
print(f'测试集轮廓系数: {silhouette_avg}')

 

 

 

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

 

 

四、实验结果分析

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

 

 

2. 对比分析

在对 Iris 数据集应用 KMeans 聚类算法的分析中,模型的表现显著低于预期。五折交叉验证得分均为负值,显示出模型在训练集上的聚类效果不佳。此外,训练集和测试集的评估指标,包括准确度、精度、召回率和 F1 值,均较低,表明模型未能有效地区分各个聚类,且在未见数据上的泛化能力有限。测试集的轮廓系数为 0.525,显示出聚类效果一般,存在一定的重叠现象。

 

posted @ 2025-01-02 15:34  jais  阅读(48)  评论(0)    收藏  举报