Menu
CoddyTech

客户细分

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

本章将聚类应用于实践,最终制作出一份按情绪分类的播放列表:

80 首歌曲以点表示,横轴为情感效价,纵轴为能量,共分为 k-means 找到并命名的四组:左上是紧张,右上是快乐,左下是悲伤,右下是平静

首先是细分群体:人们可以采取行动的群体。一家旅舍将两个特征量化并对住客进行聚类:

150 名旅舍住客,按每次住宿晚数和提前预订天数分布,分为三个群体:提前几个月预订的学校旅行团、短期住宿的周末游客、临近出发才预订且住宿时间较长的背包客

实际单位说明了一个群组的特征。它的标准化中心显示了它的独特之处:相对于平均水平,群组中每项特征的标准差。

X = StandardScaler().fit_transform(guests[["nights", "days_ahead"]])
km = KMeans(n_clusters=3, n_init=10, random_state=0).fit(X)
print(km.cluster_centers_.round(1))

这会打印:

[[ 1.3 -0.7]
 [-0.7 -0.7]
 [-0.7  1.4]]

每行中离 0 最远的数字表示其细分群体。第 0 行的停留时间长 1.3 个标准差:背包客。第 2 行的预订时间早 1.4 个标准差:学校旅行团。

challenge icon

挑战

中等

一家剧院想了解它的 166 名会员。程序会读取用于划分的特征,例如 age,ticket_price。

  1. 对这些列进行缩放,使用起始代码中的辅助函数聚类为 best_k(X) 个群组,并打印群组数量。
  2. 按规模从大到小,打印每个群组的规模和名称:中心离 0 最远的特征、high 或 low,以及距离。

对于另一家剧院和 age,shows_per_year:

4 segments
57 members: high shows_per_year (1.2 std from average)
52 members: low shows_per_year (1.0 std from average)
40 members: low age (1.4 std from average)
32 members: high age (1.5 std from average)

亲手试试

import numpy as np
import pandas as pd
from sklearn.preprocessing import StandardScaler
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score

# 每位剧院会员对应一行
members = pd.read_csv("theatre.csv")
# 用于分组的特征,例如 age,ticket_price
features = input().split(",")


# 根据轮廓系数:从 2 到 6 中,选出使 X 的轮廓系数最高的 k
def best_k(X):
    best, best_score = 2, -1
    for k in range(2, 7):
        labels = KMeans(n_clusters=k, n_init=10, random_state=0).fit_predict(X)
        score = silhouette_score(X, labels)
        if score > best_score:
            best, best_score = k, score
    return best


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

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

无监督学习中的所有课

自己练习: Python 在线编译器