ML算法与代码实现——Kmeans(案例)

案例一:探究用户对物品类别的喜好细分

1.获取数据

import pandas as pd

from sklearn.decomposition import PCA

from sklearn.cluster import KMeans

from sklearn.metrics import silhouette_score   #轮廓系数

aisles = pd.read_csv('aisles.csv')

ord_prod_prior = pd.read_csv('order_products__prior.csv')

order = pd.read_csv('orders.csv')

products = pd.read_csv('products.csv')

可以看见数据被拆分成了4个表格,先合并表格。

2.数据基本处理

2.1 合并表格

df = pd.merge(ord_prod_prior,products,how='left',on=["product_id", "product_id"])

df1 = pd.merge(df,order,on=['order_id','order_id'])

df2 = pd.merge(df1,aisles,on=['aisle_id','aisle_id'])

df2.head()


2.2 交叉表合并

为了对客户的购物行为分析,将每个客户购买过的商品进行统计,用crosstab可以方便的做到。

df_cross = pd.crosstab(df2["user_id"], df2["aisle"])

df_cross.head()


crossTable

上表中有134个特征,对如此多的特征进行聚类会发生维度灾难,这时候我们考虑特征降维。


二十万条数据太多,现在取其中1万条用户信息

#使用PCA特征降维,保留90%的特征

transfer = PCA(n_components=0.9) 

data = transfer.fit_transform(df_cross_tiny) 

data.shape 

Out:(10000, 26)

这里降维后剩下了26个特征,损失了10%的信息。

接下来用Kmeans聚类

#使用k-means进行聚类,并使用轮廓系数评估

from sklearn.metrics import silhouette_score

def plot_by_n(n_clusters,data):

     pre_data = KMeans(n_clusters=n_clusters).fit_predict(data)

     sb.scatterplot(data[:,0],data[:,1],hue=pre_data)

     plt.show()

     # 用silhouette_score评估的聚类分数

     print(silhouette_score(data, pre_data))

#从n=2到n=10

for n in range(2,10): plot_by_n(n,data)

OUT:

n= 2 0.692336964374765

n= 3 0.551931038460353

n= 4 0.45253050151292484

n= 5 0.4513994310665167

n= 6 0.4181297258813439

n= 7 0.3722567845705036

n= 8 0.37251302801272024

n= 9 0.36138371002101033

轮廓系数处于[-1,1]之间,越接近于1,聚类效果越好,上述结果发现效果不太明显,不太能确定分为多少类。


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容