机器学习——基于K-means的用户分类
·
一.案例介绍

选取性别和年收入作为特征,基于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)
三.总结
通过本案例,实际应用了聚类的评价指标,并且成功对用户进行了分类,加强了对于聚类算法的认识。
更多推荐

所有评论(0)