如何用Python实现事件日志数据聚类,得到预期的案例分组结果?
事件日志Case ID聚类的Python实现方案
需要将事件日志中同一Case ID的所有事件归为同一聚类,现有K-means代码未得到正确结果,核心问题在于未对Case ID做聚合处理,且未对类别型特征进行编码。以下是可行的实现方案:
一、核心问题分析
现有代码直接对单条事件数据(每行一个事件)执行K-means,但聚类目标是Case级别(每个Case作为一个聚类样本),而非单事件级别。同时原始数据中的Activity、Source是类别型数据,无法直接用于距离计算,必须先转换为数值特征。
二、完整实现步骤与代码
1. 导入依赖库
import pandas as pd from sklearn.cluster import KMeans, AgglomerativeClustering from sklearn.feature_extraction.text import CountVectorizer
2. 加载并预处理数据
先将示例数据转为DataFrame,再按Case ID聚合,把每个Case的特征合并为单个聚类样本:
# 加载示例数据 data = pd.DataFrame({ 'Case ID': ['case 1', 'case 1', 'case 2', 'case 2', 'case 3'], 'Activity': ['register request', 'decide', 'pay', 'check ticket', 'pay'], 'Source': ['P1', 'A2', 'C5', 'B1', 'C3'] }) # 将每个Case的Activity合并为序列字符串,用词袋模型编码(适合基于活动序列的相似性聚类) case_features = data.groupby('Case ID')['Activity'].apply(lambda x: ' '.join(x)).reset_index() vectorizer = CountVectorizer() X = vectorizer.fit_transform(case_features['Activity']).toarray()
3. K-means聚类实现
# 根据预期设置聚类数,实际可通过肘部法确定 kmeans = KMeans(n_clusters=3, random_state=42) case_clusters = kmeans.fit_predict(X) # 构建Case与聚类的映射,合并回原始数据 case_cluster_map = pd.DataFrame({ 'Case ID': case_features['Case ID'], 'Clusters': [f'cluster {c}' for c in case_clusters] }) result = pd.merge(data, case_cluster_map, on='Case ID') print(result)
4. 层次聚类实现
hier_clust = AgglomerativeClustering(n_clusters=3) case_clusters_hier = hier_clust.fit_predict(X) case_cluster_map_hier = pd.DataFrame({ 'Case ID': case_features['Case ID'], 'Clusters': [f'cluster {c}' for c in case_clusters_hier] }) result_hier = pd.merge(data, case_cluster_map_hier, on='Case ID') print(result_hier)
三、预期输出
执行后将得到与需求一致的结果:
| Case ID | Activity | Source | Clusters |
|---|---|---|---|
| case 1 | register request | P1 | cluster 0 |
| case 1 | decide | A2 | cluster 0 |
| case 2 | pay | C5 | cluster 1 |
| case 2 | check ticket | B1 | cluster 1 |
| case 3 | pay | C3 | cluster 2 |
关键说明
- 必须按
Case ID聚合数据:每个Case是一个独立的聚类样本,确保同一Case的所有事件归属同一聚类。 - 类别特征编码:可根据业务场景选择编码方式,词袋模型适合基于活动序列的相似性聚类,也可使用One-Hot编码后按Case求和(适合基于特征存在性的聚类)。
- 聚类数选择:示例中根据预期设为3,实际场景可通过肘部法(K-means)或树状图(层次聚类)确定最优聚类数。
内容的提问来源于stack exchange,提问作者Pavan
相关产品推荐
相关产品推荐

