使用k-means算法实现聚类模型
数据集地址:
https://www.kaggle.com/competitions/instacart-market-basket-analysis/overview
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.feature_selection import VarianceThreshold
from sklearn.decomposition import PCA
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score
# 1. 读取数据
order_product = pd.read_csv("./data/order_products__train.csv")
products = pd.read_csv("./data/products.csv")
orders = pd.read_csv("./data/orders.csv")
aisles = pd.read_csv("./data/aisles.csv")
# 2. 数据基本处理
#2.1 合并表格
# on:标签或列表。要连接的列或索引级别名称。这些必须在两个 DataFrame 中都能找到。
#如果 on 为 None 并且未在索引上合并,则默认为两个 DataFrame 中列的交集。
table_1 = pd.merge(order_product, products, on=["product_id", "product_id"])
table_2 = pd.merge(table_1, orders, on=["order_id", "order_id"])
table = pd.merge(table_2, aisles, on=["aisle_id", "aisle_id"])
#交叉表(Cross Tabulations)是一种常用的分类汇总表格,用于频数分布统计,主要价值在于描述了变量间关系的深刻含义。
#2.2 交叉表合并
table = pd.crosstab(table["user_id"], table["aisle_id"])
table.head()
#2.3 数据截取
table_clip = table[:1000]
table_clip.head()
#3. 特征工程:PCA主成分分析
transfer = PCA(n_components=0.9) # 保留90%的信息
data = transfer.fit_transform(table_clip)
data
print("降维前特征数量为:", table_clip.shape)
print("降维后特征数量为:", data.shape)
import os
os.environ["OMP_NUM_THREADS"] = "4"
# 4. 机器学习:K-means聚类
estimator = KMeans(n_clusters=8, random_state=22) # 分为8类
pred = estimator.fit_predict(data)
# 5. 模型评估
score = silhouette_score(data, pred)
score