人工智能-机器学习(五)——聚类算法

目录

  • 一、聚类算法简介

  • 二、聚类算法API的使用

  • 三、分类评估:混淆矩阵与核心指标

第一部分 聚类算法简介 - 学习目标

  1. 知道什么是聚类

  2. 了解聚类算法的应用场景

  3. 知道聚类算法的分类

1.1 聚类算法概念

  • 定义:一类无监督学习方法,将数据划分为若干“簇”,实现“簇内样本相似度高、簇间样本差异大”。

  • 核心逻辑:基于样本相似度划分类别,常用相似度计算方法为欧式距离。

  • 目的:无先验知识下,自动发现数据内在结构与模式。

  • 影响因素:不同聚类准则会产生不同聚类结果。

1.2 聚类算法的现实应用

  • 商业领域:基于位置的商业推送、用户画像与广告推荐

  • 信息领域:新闻聚类筛选、搜索引擎流量推荐

  • 技术领域:恶意流量识别、图像分割/降维/识别、离群点检测(如信用卡异常消费)

  • 科研领域:发掘相同功能的基因片段

1.3 聚类算法分类

  1. 按聚类颗粒度:粗聚类、细聚类

  2. 按实现方法: 基于划分:K-means算法(按均值计算的“质心”分类)

  3. 基于层次:DIANA(自顶向下)、AGNES(自底向上)

  4. 基于密度:DBSCAN算法

  5. 基于图:谱聚类(Spectral Clustering)

第二部分 聚类算法API的使用 - 学习目标

  1. 了解Kmeans算法的API

  2. 动手实践Kmeans算法

2.1 KMeans算法API详解

核心类:sklearn.cluster.KMeans(n_clusters=8)

  • 参数:n_clusters(整型,默认8)—— 聚类中心数量(生成的质心数)

  • 核心方法: estimator.fit(x):训练模型(计算聚类中心)

  • estimator.predict(x):对样本进行类别预测

  • estimator.fit_predict(x):合并训练与预测,先调用fit再调用predict

2.2 实践案例:KMeans模型数据聚类探索

任务:创建二维数据集,用K-means聚类并评估效果

步骤梳理
  1. 导入工具包(KMeans、数据集生成、可视化、评估函数)

  2. 创建并可视化原始数据集

  3. 实例化KMeans模型并完成聚类预测

  4. 可视化聚类结果

  5. 用Calinski-Harabasz指标评估聚类效果

完整代码实现
# 1.导入工具包
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs
from sklearn.metrics import calinski_harabasz_score  # 注意:calinski_harabaz_score已废弃

# 2.创建数据集:1000个样本,2个特征,4个质心,簇标准差分别为[0.4, 0.2, 0.2, 0.2]
x, y = make_blobs(
    n_samples=1000,
    n_features=2,
    centers=[[-1,-1], [0,0], [1,1], [2,2]],
    cluster_std=[0.4, 0.2, 0.2, 0.2],
    random_state=22
)
# 可视化原始数据
plt.figure()
plt.scatter(x[:, 0], x[:, 1], marker='o')
plt.title("原始数据集")
plt.show()

# 3.使用K-means聚类(指定4个簇)并预测
y_pred = KMeans(n_clusters=4, random_state=22).fit_predict(x)
# 可视化聚类结果
plt.scatter(x[:, 0], x[:, 1], c=y_pred)
plt.title("KMeans聚类结果")
plt.show()

# 4.模型评估(CH指标:值越大,聚类效果越好)
print("Calinski-Harabasz Score:", calinski_harabasz_score(x, y_pred))

第三部分 分类评估:混淆矩阵与核心指标

学习目标

  1. 理解混淆矩阵的构建方法

  2. 掌握精确率、召回率和F1-score的计算方法

1. 为什么需要混淆矩阵?—— 问题引入

仅用“预测准确率”无法满足所有业务场景需求。以癌症检测为例,核心诉求不仅是“预测对多少样本”,更关键的是:所有癌症患者是否都被检测出来? 若遗漏患者(假阴性),后果远重于将健康人误判为患者(假阳性),因此需要更精细的评估指标——混淆矩阵。

2. 混淆矩阵核心概念

混淆矩阵是模型预测结果与样本真实标签的对比矩阵,核心通过4个指标量化分类效果(以二分类任务为例,假设“恶性肿瘤”为正例,“良性肿瘤”为反例):

  • 真正例(TP):真实为正例,预测为正例的样本数(如:实际恶性,预测为恶性)

  • 假反例(FN):真实为正例,预测为反例的样本数(如:实际恶性,预测为良性——关键错误)

  • 假正例(FP):真实为反例,预测为正例的样本数(如:实际良性,预测为恶性)

  • 真反例(TN):真实为反例,预测为反例的样本数(如:实际良性,预测为良性)

核心关系:TP + FN + FP + TN = 总样本数

3. 混淆矩阵实践:肿瘤检测案例

已知:10个样本(6个恶性、4个良性),分别计算模型A、B的混淆矩阵指标:

3.1 案例数据
  • 模型A:预测对3个恶性、4个良性

  • 模型B:预测对6个恶性、1个良性

3.2 手动计算结果

模型

TP(真恶性)

FN(漏诊恶性)

FP(误诊良性)

TN(真良性)

A

3

6-3=3

4-4=0

4

B

6

6-6=0

4-1=3

1

3.3 代码实现(sklearn)
from sklearn.metrics import confusion_matrix
import pandas as pd

def calculate_confusion_matrix():
    # 真实标签(6恶性、4良性)
    y_true = ["恶性", "恶性", "恶性", "恶性", "恶性", "恶性", "良性", "良性", "良性", "良性"]
    labels = ["恶性", "良性"]  # 定义标签顺序
    dataframe_labels = ["预测恶性(正例)", "预测良性(反例)"]
    
    # 模型A预测结果
    print("模型A混淆矩阵:")
    print("-" * 25)
    y_pred1 = ["恶性", "恶性", "恶性", "良性", "良性", "良性", "良性", "良性", "良性", "良性"]
    result1 = confusion_matrix(y_true, y_pred1, labels=labels)  # 修正原代码参数错误
    print(pd.DataFrame(result1, columns=dataframe_labels, index=["真实恶性(正例)", "真实良性(反例)"]))
    
    # 模型B预测结果
    print("\n模型B混淆矩阵:")
    print("-" * 25)
    y_pred2 = ["恶性", "恶性", "恶性", "恶性", "恶性", "恶性", "恶性", "恶性", "恶性", "良性"]
    result2 = confusion_matrix(y_true, y_pred2, labels=labels)
    print(pd.DataFrame(result2, columns=dataframe_labels, index=["真实恶性(正例)", "真实良性(反例)"]))

# 调用函数
calculate_confusion_matrix()

4. 延伸评估指标:精确率、召回率、F1-score

基于混淆矩阵的4个核心指标,衍生出3个关键评估指标,解决“不同场景下的模型偏好”问题。

4.1 精确率(Precision)—— 查准率
  • 定义:预测为正例的样本中,真实为正例的比例(关注“预测准不准”)。

  • 公式:Precision = TP / (TP + FP)

  • 案例计算:模型A:3/(3+0)=100%;模型B:6/(6+3)=67%

4.2 精确率计算代码
from sklearn.metrics import precision_score

def calculate_precision():
    # 真实标签
    y_true = ["恶性", "恶性", "恶性", "恶性", "恶性", "恶性", "良性", "良性", "良性", "良性"]
    
    # 模型A预测结果
    y_pred1 = ["恶性", "恶性", "恶性", "良性", "良性", "良性", "良性", "良性", "良性", "良性"]
    p1 = precision_score(y_true, y_pred1, pos_label="恶性")
    print("模型A精确率:", round(p1, 2))
    
    # 模型B预测结果
    y_pred2 = ["恶性", "恶性", "恶性", "恶性", "恶性", "恶性", "恶性", "恶性", "恶性", "良性"]
    p2 = precision_score(y_true, y_pred2, pos_label="恶性")
    print("模型B精确率:", round(p2, 2))

calculate_precision()
4.3 召回率(Recall)—— 查全率
  • 定义:真实为正例的样本中,被预测为正例的比例(关注“漏没漏”,如癌症检测优先保障此指标)。

  • 公式:Recall = TP / (TP + FN)

  • 案例计算:模型A:3/(3+3)=50%;模型B:6/(6+0)=100%

4.4 召回率计算代码
from sklearn.metrics import recall_score

def calculate_recall():
    # 真实标签
    y_true = ["恶性", "恶性", "恶性", "恶性", "恶性", "恶性", "良性", "良性", "良性", "良性"]
    
    # 模型A预测结果
    y_pred1 = ["恶性", "恶性", "恶性", "良性", "良性", "良性", "良性", "良性", "良性", "良性"]
    r1 = recall_score(y_true, y_pred1, pos_label="恶性")
    print("模型A召回率:", round(r1, 2))
    
    # 模型B预测结果
    y_pred2 = ["恶性", "恶性", "恶性", "恶性", "恶性", "恶性", "恶性", "恶性", "恶性", "良性"]
    r2 = recall_score(y_true, y_pred2, pos_label="恶性")
    print("模型B召回率:", round(r2, 2))

calculate_recall()
4.5 F1-score —— 综合指标
  • 定义:平衡精确率与召回率的综合指标,取值范围[0,1],越接近1效果越好。

  • 公式:F1 = 2 × Precision × Recall / (Precision + Recall)

  • 案例计算:模型A:2×1×0.5/(1+0.5)≈67%;模型B:2×0.67×1/(0.67+1)≈80%

4.6 F1-score计算代码
from sklearn.metrics import f1_score

def calculate_f1():
    # 真实标签
    y_true = ["恶性", "恶性", "恶性", "恶性", "恶性", "恶性", "良性", "良性", "良性", "良性"]
    
    # 模型A预测结果
    y_pred1 = ["恶性", "恶性", "恶性", "良性", "良性", "良性", "良性", "良性", "良性", "良性"]
    f1 = f1_score(y_true, y_pred1, pos_label="恶性")
    print("模型A F1-score:", round(f1, 2))
    
    # 模型B预测结果
    y_pred2 = ["恶性", "恶性", "恶性", "恶性", "恶性", "恶性", "恶性", "恶性", "恶性", "良性"]
    f2 = f1_score(y_true, y_pred2, pos_label="恶性")
    print("模型B F1-score:", round(f2, 2))

calculate_f1()

5. 第三部分总结

  1. 混淆矩阵是分类评估的基础,通过TP/FN/FP/TN量化预测偏差。

  2. 精确率关注“预测准确性”,召回率关注“真实正例覆盖度”,需根据场景选择优先指标。

  3. F1-score是两者的调和平均数,用于综合评估模型性能。

  4. 核心公式: - 精确率 = TP/(TP+FP) - 召回率 = TP/(TP+FN) - F1-score = 2×精确率×召回率/(精确率+召回率)

文档整体总结

核心要点

  1. 聚类算法:无监督学习,按样本相似度(如欧式距离)自动归类,主流算法有K-means、DBSCAN等,核心API为:sklearn.cluster.KMeans。

  2. 分类评估:混淆矩阵是基础工具,结合精确率、召回率、F1-score可全面评估模型在不同场景的表现。

核心要点

  1. 聚类本质:无监督学习,按样本相似度自动归类,核心依赖欧式距离等相似度指标。

  2. 主流算法:K-means(划分式)、DBSCAN(密度式)、谱聚类(图基于)等。

  3. 核心API:sklearn.cluster.KMeans(n_clusters=8),关键参数为聚类中心数n_clusters。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值