2024.12.4

机器学习实验七

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

一、实验目的

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

 

二、实验内容

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

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

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

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

 

 

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

   1. 算法伪代码

1. 加载数据集

    - 使用 sklearn 提供的鸢尾花数据集。

 

2. 数据划分

    - 使用 `train_test_split` 将数据集划分为训练集和测试集,确保测试集占 1/3,且类别分布一致。

 

3. 训练 K 均值聚类模型

    - 初始化 KMeans 聚类模型,指定聚类数为 3(鸢尾花数据集有 3 个类别)。

    - 使用训练集对模型进行训练,得到聚类标签。

 

4. 将聚类标签映射为真实标签

    - 使用 `mode` 函数,将每个聚类的标签映射为训练集真实标签的最频繁值,以此来匹配聚类结果和实际类别。

 

5. 测试集评估

    - 使用测试集对模型进行预测,得到预测的聚类标签。

    - 将预测的聚类标签映射为真实标签,并计算准确率、精度、召回率和 F1 值。

 

6. 输出结果

    - 输出测试集的评估结果:准确率、精度、召回率和 F1 值。

   2. 算法主要代码

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

from sklearn import datasets
from sklearn.cluster import KMeans
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score
from scipy.stats import mode
import numpy as np

# Step 1: 加载数据并划分训练集和测试集
iris = datasets.load_iris()
X, y = iris.data, iris.target

# 按类别分布划分
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=1/3, random_state=42, stratify=y
)

# Step 2: 训练 K 均值聚类模型
kmeans = KMeans(n_clusters=3, random_state=42)
kmeans.fit(X_train)

# 将训练集聚类结果映射为标签
def map_clusters_to_labels(kmeans_labels, true_labels):
    labels = np.zeros_like(kmeans_labels)
    for cluster in range(kmeans.n_clusters):
        mask = (kmeans_labels == cluster)
        labels[mask] = mode(true_labels[mask])[0]
    return labels

mapped_train_labels = map_clusters_to_labels(kmeans.labels_, y_train)

# Step 3: 测试集评估
test_pred_clusters = kmeans.predict(X_test)
mapped_test_labels = map_clusters_to_labels(test_pred_clusters, y_test)

# 评估指标计算,处理警告
accuracy = accuracy_score(y_test, mapped_test_labels)
precision = precision_score(y_test, mapped_test_labels, average='macro', zero_division=0)
recall = recall_score(y_test, mapped_test_labels, average='macro', zero_division=0)
f1 = f1_score(y_test, mapped_test_labels, average='macro')

# 输出结果
print("\n测试集性能:")
print(f"Accuracy: {accuracy:.4f}")
print(f"Precision: {precision:.4f}")
print(f"Recall: {recall:.4f}")
print(f"F1 Score: {f1:.4f}")

 

1  datasets.load_iris(): 加载鸢尾花数据集,包含 150 个样本,4 个特征,适合用于分类任务。

2  train_test_split(): 将数据集划分为训练集和测试集,使用 stratify=y 保证类别分布一致。

3  KMeans(): 初始化 K 均值聚类模型,n_clusters=3 表示聚类数为 3,因为鸢尾花数据集有 3 个类别。

4  mode(): 计算聚类标签与真实标签之间的映射关系,返回每个聚类中的最频繁真实标签。

5  accuracy_score(), precision_score(), recall_score(), f1_score(): 分别计算模型在测试集上的准确率、精度、召回率和 F1 值。

 

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

 

 

四、实验结果分析

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

 

 

2. 对比分析

 

准确率(Accuracy:模型在测试集上的准确率为 0.9800,表现良好。

精度(Precision:精度为 0.9798,表示模型预测为某类别的样本大多是正确的。

召回率(Recall:召回率为 0.9800,表明模型对所有类别都有较好的召回能力。

F1 :F1 分数接近 0.9800,表明精度和召回率之间的平衡较好。

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