Python打卡Day18 基于聚类进一步推断类型

今天的主题是无监督算法中的聚类,常利用聚类来发现数据中的模式,并对每一个聚类后的类别特征进行可视化,以此得到新的特征并赋予实际含义。

python 复制代码
import pandas as pd
from sklearn.preprocessing import StandardScaler
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score
from sklearn.manifold import TSNE
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score

# 加载数据集
df = pd.read_csv('heart.csv')

# 1. 标准化数据
scaler = StandardScaler()
scaled_df = scaler.fit_transform(df.drop('target', axis=1))

# 2. 选择合适的算法(这里使用 KMeans),根据评估指标(轮廓系数)调参
silhouette_scores = []
for n_cluster in range(2, 11):
    kmeans = KMeans(n_clusters=n_cluster)
    kmeans.fit(scaled_df)
    label = kmeans.labels_
    sil_coeff = silhouette_score(scaled_df, label, metric='euclidean')
    silhouette_scores.append(sil_coeff)

# 获取最佳簇数
best_n_clusters = silhouette_scores.index(max(silhouette_scores)) + 2

kmeans = KMeans(n_clusters=best_n_clusters)
kmeans.fit(scaled_df)
cluster_labels = kmeans.labels_

# 3. 将聚类后的特征添加到原数据中
df['Cluster'] = cluster_labels

# 4. 使用 t - SNE 进行 2D 可视化
tsne = TSNE(n_components=2, random_state=42)
tsne_result = tsne.fit_transform(scaled_df)
df['tsne-2d-one'] = tsne_result[:, 0]
df['tsne-2d-two'] = tsne_result[:, 1]

# 可视化聚类结果
plt.figure(figsize=(16, 10))
sns.scatterplot(
    x="tsne-2d-one", y="tsne-2d-two",
    hue="Cluster",
    palette=sns.color_palette("hls", best_n_clusters),
    data=df,
    legend="full",
    alpha=0.3
)
plt.title('t - SNE 2D Visualization of Clusters')
plt.show()

# 5. 聚类后分析

# 1、推断簇的类型
cluster_summary = df.groupby('Cluster').mean()
print("各簇的特征均值:")
print(cluster_summary)

# 2. 通过可视化图形定义簇的含义(这里简单描述,实际需结合专业知识深入分析)
# 从 t - SNE 可视化图形中,不同簇在二维空间中的分布位置和聚集程度可以推测簇的含义。
# 例如,彼此分离较远的簇可能代表具有明显不同特征的群体。

# 3. 通过精度判断特征工程价值
# 划分训练集和测试集
X = df.drop(['target', 'Cluster', 'tsne-2d-one', 'tsne-2d-two'], axis=1)
y = df['target']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 训练逻辑回归模型
logreg = LogisticRegression()
logreg.fit(X_train, y_train)

# 预测并计算精度
y_pred = logreg.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print("逻辑回归模型的精度:", accuracy)

特征工程后模型精度有所提升

年龄方面,簇 0 的平均年龄(58.624)比簇 1 的平均年龄(51.376404)要高。这可能意味着簇 0 代表年龄较大的人群,而簇 1 代表相对年轻的人群。

目标方面,簇 0 的均值为 0.216000,簇 1 的均值为 0.775281,差异较大。推测簇 0 可能代表心脏病发病风险较低的人群,而簇 1 代表心脏病发病风险较高的人群。结合年龄特征,可能年龄较大的人群虽然某些指标看起来不太好(如胆固醇 chol 等),但实际发病风险相对低;而相对年轻人群在某些情况下发病风险却较高。

@浙大疏锦行

相关推荐
Sakura_j_h_16 分钟前
从零写一个 MCP stdio Server:用 Python 校验博客文章格式
开发语言·python·自动化·ai工具·mcp·json-rpc
大草原的小灰灰23 分钟前
LLM应用的标准开发框架LangChain(八)- 中间件
python·中间件·langchain
卷无止境34 分钟前
百万 token 时代的真相:主流大模型上下文窗口与最大输出的横向对比分析
人工智能·python
用户298698530141 小时前
Python 实战:将 HTML 批量转换为 Markdown
python·html·markdown
hhcgchpspk1 小时前
flask服务端页面预防被爬措施
后端·python·flask·网络爬虫·防爬
小小张说故事1 小时前
Python 里 copy.copy() 和 deepcopy() 到底差在哪:拆开 __copy__、__deepcopy__ 和那个防止无限递归的 memo 字典
python
vipxieliang1 小时前
Python collections:高效容器与实战案例
后端·python
青少儿编程课堂2 小时前
蓝桥杯青少组图形化 STEMA 省考(报名倒计时·11/22开考)+ 全国青少年信息素养大赛 2026—2027赛季 + 电子学会图形化考级:校园华容道大闯关
c++·python·算法·bfs·信息学竞赛
迪菲赫尔曼2 小时前
【基础篇 26】第一次在服务器完成训练:准备数据、断线继续、检查成果与备份
运维·服务器·人工智能·机器学习·计算机视觉
特创数字科技2 小时前
写了个 Windows 下载器:一键拉 GitHub / Gitee 源码,带 SHA256 校验
python·github