Menu
CoddyTech

两种细胞

本课属于 Coddy Machine Learning 学习旅程的“无监督学习”单元。第 51 课,共 51 课。

实验室测量了 569 个组织样本,每个样本有 30 项细胞测量数据。数量太多,无法绘图,也没人能看出其中的规律:

一个由 24 个样本和 30 项测量组成的网格,每个单元格按数值从低到高以蓝色到红色着色,拼成一幅看不出明显规律的拼图

每个样本的诊断结果(良性或恶性)都封存在信封里。没有这些信息,细胞能把自己分成两类吗?

用 PCA 将 30 个测量值降维,对剩下的数据进行聚类,然后再打开信封,看看这些细胞聚得有多近。

challenge icon

挑战

困难

程序会读取要保留的方差比例,该值至少为 0.7;起始代码会设置图表。

  1. 先进行缩放,再保留能达到该比例的最少组件。打印组件数量以及它们保留的方差比例。
  2. 使用 k-means 对这些组件进行聚类:k = 2,n_init=10,random_state=0。
  3. 打开信封:按每个簇的大小从大到小,打印其中的诊断结果和多数诊断。然后打印一致率,也就是与各自簇的多数诊断相符的样本比例。
  4. 按簇绘制前两个组件的散点图,标签为 mostly benign 或 mostly malignant;显示图例并展示图表。

对于前 300 个样本,比例为 0.8 时:

Components for 80% of the variance: 5 (they keep 0.844)
Cluster of 175: 146 benign, 29 malignant, so mostly benign
Cluster of 125: 8 benign, 117 malignant, so mostly malignant
Agreement with the diagnosis: 0.877

对应的图表:

前 300 个样本在前两个组件上的分布:左侧是以良性样本为主的簇,右侧是向外扩展的以恶性样本为主的簇,并带有图例

接下来,Coddy 会描述你的图表。

亲手试试

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.datasets import load_breast_cancer
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
from sklearn.cluster import KMeans

# 569 个组织样本,每个样本有 30 项细胞测量值
cancer = load_breast_cancer(as_frame=True)
cells = cancer.data
# 密封的信封:每个样本是良性还是恶性。最后再打开。
diagnosis = pd.Series(cancer.target_names[cancer.target])

# 要保留的方差比例,至少为 0.7
share = float(input())

fig, ax = plt.subplots()
ax.set_title("Cells on Two Components")
ax.set_xlabel("Component 1")
ax.set_ylabel("Component 2")

# 在下方编写你的代码
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

无监督学习中的所有课

自己练习: Python 在线编译器