算法伪代码
BEGIN
// 1. 导入必要的库
导入 numpy 作为 np
导入 pandas 作为 pd
从 sklearn 导入 datasets
从 sklearn.model_selection 导入 train_test_split, cross_val_score
从 sklearn.cluster 导入 KMeans
从 sklearn.metrics 导入 accuracy_score, precision_score, recall_score, f1_score, silhouette_score
// 2. 加载 iris 数据集
iris = datasets.load_iris()
设置 X = iris.data // 特征数据
设置 y = iris.target // 标签数据
// 3. 使用留出法将数据集分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=42, stratify=y)
// 4. 训练 K 均值聚类算法,类别数为 3,设置 n_init 参数
kmeans = KMeans(n_clusters=3, random_state=42, n_init=10)
kmeans.fit(X_train) // 训练模型
// 5. 使用五折交叉验证评估模型性能
// 获取训练集的预测标签
train_predictions = kmeans.predict(X_train)
// 定义评估指标计算函数
FUNCTION 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
END FUNCTION
// 进行五折交叉验证
cross_val_scores = cross_val_score(kmeans, X_train, y_train, cv=5)
打印 "五折交叉验证得分: ", cross_val_scores
// 在训练集上评估模型
accuracy, precision, recall, f1 = evaluate_model(y_train, train_predictions)
打印 "训练集上的评估指标"
打印 "准确度: ", accuracy
打印 "精度: ", precision
打印 "召回率: ", recall
打印 "F1 值: ", f1
// 6. 在测试集上测试模型性能
test_predictions = kmeans.predict(X_test)
test_accuracy, test_precision, test_recall, test_f1 = evaluate_model(y_test, test_predictions)
打印 "测试集上的评估指标"
打印 "准确度: ", test_accuracy
打印 "精度: ", test_precision
打印 "召回率: ", test_recall
打印 "F1 值: ", test_f1
// 7. 计算轮廓系数以评估聚类效果
silhouette_avg = silhouette_score(X_test, test_predictions)
打印 "测试集轮廓系数: ", silhouette_avg
END
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. 对比分析
交叉验证结果:
五折交叉验证的得分范围从0.943到1.000,平均准确度接近1.000,说明模型在训练集的表现相当稳定。
训练集结果:
训练集上的评估指标均为0.973,显示模型能够在训练数据上很好地拟合,准确度、精度、召回率和F1值高度一致,表明了模型对各类样本的无偏识别能力。
测试集结果:
测试集上的所有评估指标均为0.960,仍然表明模型有很强的泛化能力,已成功识别出大部分样本。这种较高的值表明模型在未见过的数据上同样表现良好。
评估标准有效性:
在聚类问题中,准确度、精度、召回率和F1值是比较关键的指标,特别是在分类问题中。这里的聚类结果与真实标签进行了比较,因此可以对模型的分类效果进行评估。
轮廓系数(Silhouette Score):
测试集的轮廓系数为0.552,反映了聚类结果的相似性和良好分隔性。轮廓系数越接近1,表示聚类效果越好;接近0和负值则表示数据可以进行更好的聚合或分离。
浙公网安备 33010602011771号