目录
-
一、聚类算法简介
-
二、聚类算法API的使用
-
三、分类评估:混淆矩阵与核心指标
第一部分 聚类算法简介 - 学习目标
-
知道什么是聚类
-
了解聚类算法的应用场景
-
知道聚类算法的分类
1.1 聚类算法概念
-
定义:一类无监督学习方法,将数据划分为若干“簇”,实现“簇内样本相似度高、簇间样本差异大”。
-
核心逻辑:基于样本相似度划分类别,常用相似度计算方法为欧式距离。
-
目的:无先验知识下,自动发现数据内在结构与模式。
-
影响因素:不同聚类准则会产生不同聚类结果。
1.2 聚类算法的现实应用
-
商业领域:基于位置的商业推送、用户画像与广告推荐
-
信息领域:新闻聚类筛选、搜索引擎流量推荐
-
技术领域:恶意流量识别、图像分割/降维/识别、离群点检测(如信用卡异常消费)
-
科研领域:发掘相同功能的基因片段
1.3 聚类算法分类
-
按聚类颗粒度:粗聚类、细聚类
-
按实现方法: 基于划分:K-means算法(按均值计算的“质心”分类)
-
基于层次:DIANA(自顶向下)、AGNES(自底向上)
-
基于密度:DBSCAN算法
-
基于图:谱聚类(Spectral Clustering)
第二部分 聚类算法API的使用 - 学习目标
-
了解Kmeans算法的API
-
动手实践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聚类并评估效果
步骤梳理
-
导入工具包(KMeans、数据集生成、可视化、评估函数)
-
创建并可视化原始数据集
-
实例化KMeans模型并完成聚类预测
-
可视化聚类结果
-
用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))
第三部分 分类评估:混淆矩阵与核心指标
学习目标
-
理解混淆矩阵的构建方法
-
掌握精确率、召回率和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)—— 查全率
-
定义:真实为正例的样本中,被预测为正例的比例(关注“漏没漏”,如癌症检测优先保障此指标)。
-
公式:
-
案例计算:模型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效果越好。
-
公式:
-
案例计算:模型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. 第三部分总结
-
混淆矩阵是分类评估的基础,通过TP/FN/FP/TN量化预测偏差。
-
精确率关注“预测准确性”,召回率关注“真实正例覆盖度”,需根据场景选择优先指标。
-
F1-score是两者的调和平均数,用于综合评估模型性能。
-
核心公式: - 精确率 = TP/(TP+FP) - 召回率 = TP/(TP+FN) - F1-score = 2×精确率×召回率/(精确率+召回率)
文档整体总结
核心要点
-
聚类算法:无监督学习,按样本相似度(如欧式距离)自动归类,主流算法有K-means、DBSCAN等,核心API为:sklearn.cluster.KMeans。
-
分类评估:混淆矩阵是基础工具,结合精确率、召回率、F1-score可全面评估模型在不同场景的表现。
核心要点
-
聚类本质:无监督学习,按样本相似度自动归类,核心依赖欧式距离等相似度指标。
-
主流算法:K-means(划分式)、DBSCAN(密度式)、谱聚类(图基于)等。
-
核心API:sklearn.cluster.KMeans(n_clusters=8),关键参数为聚类中心数n_clusters。

1411

被折叠的 条评论
为什么被折叠?



