一.案例介绍

选取性别和年收入作为特征,基于k-means算法对用户进行分类。首先用SSE+肘部法以及SC选取最佳K值,之后再进行模型选练以及预测。

二.代码部分详解

1.寻找最佳K值

#1.找聚类的  质心数
def dm01_find_k():
    #1.加载数据集
    df = pd.read_csv('./data/customers.csv')
    # df.info()

    #抽取特征
    x = df.iloc[:, 3:5]
    print(x)

    #2.定义ssc_list sc_list 记录:不同K值,评估效果
    sse_list = []   #sse:只考虑簇内, 越小越好
    sc_list = []    #sc:考虑簇内和簇间 越大越好
    #3.设置for循环,测试不同k的值,评估效果
    for k in range(2, 20):
        #4.创建模型对象
        estimator = KMeans(n_clusters=k, max_iter=100, random_state=23)
        #5.模型训练
        estimator.fit(x)
        #6.模型预测
        y_pred = estimator.predict(x)
        #分别把评分添加到对应的列表中
        sse_list.append(estimator.inertia_)
        sc_list.append(silhouette_score(x,y_pred))
    #4.绘制折线图,看看k值,哪个最好
    plt.figure(figsize=(20, 10))
    plt.plot(range(2, 20), sse_list, label='SSE')
    plt.show()

    plt.figure(figsize=(20, 10))
    plt.plot(range(2, 20), sc_list, label='SC')
    plt.show()

找出最佳K值为5

2.模型训练预测

#2.模型训练、预测、评估
def dm02_train_predict_evaluate():
    # 1.加载数据集
    df = pd.read_csv('./data/customers.csv')
    # df.info()

    # 2.抽取特征
    x = df.iloc[:, 3:5]
    #3.模型训练
    estimator = KMeans(n_clusters=5, max_iter=100, random_state=23)
    estimator.fit(x)

    #4.模型预测
    y_pred = estimator.predict(x)

    #5.绘制五个簇 样本点 -》散点图
    plt.scatter(x.values[y_pred == 0, 0], x.values[y_pred == 0, 1], c='r', label='HG')  # 0号簇
    plt.scatter(x.values[y_pred == 1, 0], x.values[y_pred == 1, 1])  # 1号簇
    plt.scatter(x.values[y_pred == 2, 0], x.values[y_pred == 2, 1])  # 2号簇
    plt.scatter(x.values[y_pred == 3, 0], x.values[y_pred == 3, 1])  # 3号簇
    plt.scatter(x.values[y_pred == 4, 0], x.values[y_pred == 4, 1])  # 4号簇


    #6.绘制五个簇 质心-》散点图
    print(estimator.cluster_centers_)   #5个质心的坐标点
    plt.scatter(estimator.cluster_centers_[:, 0], estimator.cluster_centers_[:, 1])

    #7.设置标题, x轴, y轴 ,标签
    plt.title('Cluusters of Customers')
    plt.xlabel('Annual Income(k$)')
    plt.ylabel('Spending Score (1 - 100)')
    plt.legend()
    plt.show()

3.完整代码

#导包
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs
from sklearn.metrics import calinski_harabasz_score, silhouette_score
import matplotlib
matplotlib.use('TkAgg')   # 解决后端错误
import pandas as pd
import numpy as np


#1.找聚类的  质心数
def dm01_find_k():
    #1.加载数据集
    df = pd.read_csv('./data/customers.csv')
    # df.info()

    #抽取特征
    x = df.iloc[:, 3:5]
    print(x)

    #2.定义ssc_list sc_list 记录:不同K值,评估效果
    sse_list = []   #sse:只考虑簇内, 越小越好
    sc_list = []    #sc:考虑簇内和簇间 越大越好
    #3.设置for循环,测试不同k的值,评估效果
    for k in range(2, 20):
        #4.创建模型对象
        estimator = KMeans(n_clusters=k, max_iter=100, random_state=23)
        #5.模型训练
        estimator.fit(x)
        #6.模型预测
        y_pred = estimator.predict(x)
        #分别把评分添加到对应的列表中
        sse_list.append(estimator.inertia_)
        sc_list.append(silhouette_score(x,y_pred))
    #4.绘制折线图,看看k值,哪个最好
    plt.figure(figsize=(20, 10))
    plt.plot(range(2, 20), sse_list, label='SSE')
    plt.show()

    plt.figure(figsize=(20, 10))
    plt.plot(range(2, 20), sc_list, label='SC')
    plt.show()

#2.模型训练、预测、评估
def dm02_train_predict_evaluate():
    # 1.加载数据集
    df = pd.read_csv('./data/customers.csv')
    # df.info()

    # 2.抽取特征
    x = df.iloc[:, 3:5]
    #3.模型训练
    estimator = KMeans(n_clusters=5, max_iter=100, random_state=23)
    estimator.fit(x)

    #4.模型预测
    y_pred = estimator.predict(x)

    #5.绘制五个簇 样本点 -》散点图
    plt.scatter(x.values[y_pred == 0, 0], x.values[y_pred == 0, 1], c='r', label='HG')  # 0号簇
    plt.scatter(x.values[y_pred == 1, 0], x.values[y_pred == 1, 1])  # 1号簇
    plt.scatter(x.values[y_pred == 2, 0], x.values[y_pred == 2, 1])  # 2号簇
    plt.scatter(x.values[y_pred == 3, 0], x.values[y_pred == 3, 1])  # 3号簇
    plt.scatter(x.values[y_pred == 4, 0], x.values[y_pred == 4, 1])  # 4号簇


    #6.绘制五个簇 质心-》散点图
    print(estimator.cluster_centers_)   #5个质心的坐标点
    plt.scatter(estimator.cluster_centers_[:, 0], estimator.cluster_centers_[:, 1])

    #7.设置标题, x轴, y轴 ,标签
    plt.title('Cluusters of Customers')
    plt.xlabel('Annual Income(k$)')
    plt.ylabel('Spending Score (1 - 100)')
    plt.legend()
    plt.show()
#测试
if __name__ == '__main__':
    #dm01_find_k()
    dm02_train_predict_evaluate()

    # #代码 x.values[y_pred == 0, 0] 解释
    # x = [[15, 39], [15, 81], [16, 6], [16, 77], [17, 40], [17, 76]]
    # x2 = np.array(x)    #模拟x.values
    # print(x2)
    #
    # #模拟x.values[y_pred == 0]
    # result = x2[[True, False, True, False, False, True]]
    #
    # print(result)
    # #模拟:x.values[y_pred == 0 , 0]
    # result2 = x2[[True, False, True, False, False, True], 0]
    # print(result2)
    # # 模拟:x.values[y_pred == 0 , 1]
    # result3 = x2[[True, False, True, False, False, True], 1]
    # print(result3)

三.总结

通过本案例,实际应用了聚类的评价指标,并且成功对用户进行了分类,加强了对于聚类算法的认识。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐