KMeans聚类稳定性测试报错:样本数量不一致问题排查
错误原因排查与修复方案
核心错误点
- 标签样本数不匹配:迭代代码中,你没有保存新周期数据的预测标签,反而错误调用
model_init.labels_获取初始训练数据的标签(28876个样本),而新周期数据仅2050个样本,两者长度不一致,触发adjusted_rand_score的样本数校验错误。 - 标准化逻辑错误:新周期数据使用
scaler_init.fit_transform()会重新拟合标准化器,导致数据尺度与初始模型训练时不一致,预测结果失去参考价值。 - ARI计算逻辑偏差:ARI用于衡量同一组样本的两次聚类结果一致性,当前代码直接对比不同批次样本的标签,结果无业务意义,必须对齐同一客户后再计算。
修复后的完整迭代代码
ari_scores = [] total_periods = 25 # 提前构建初始客户-标签映射(假设数据含customer_id字段) initial_customer_labels = pd.DataFrame({ 'customer_id': initial_period_data['customer_id'], 'initial_label': model_init_labels }).drop_duplicates(subset='customer_id') for p in range(2, total_periods + 1, 2): current_period_end = initial_period_end + pd.DateOffset(weeks=p) data_period = data_init[(data_init['order_purchase_timestamp'] >= initial_period_end) & (data_init['order_purchase_timestamp'] < current_period_end)] # 修正:保存处理后的数据 data_period_group = process_data(data_period) data_period_num = data_period_group.select_dtypes(include="number").fillna(0) # 修正:使用初始拟合的scaler做标准化,不重新拟合 data_period_scaled = scaler_init.transform(data_period_num) # 修正:获取新周期数据的预测标签 p_labels = model_init.predict(data_period_scaled) # 修正:对齐同一客户,仅保留两个周期都存在的样本 period_customer_labels = pd.DataFrame({ 'customer_id': data_period_group['customer_id'], 'period_label': p_labels }).drop_duplicates(subset='customer_id') merged_labels = pd.merge(initial_customer_labels, period_customer_labels, on='customer_id') # 用对齐后的标签计算ARI ari_p = adjusted_rand_score(merged_labels['initial_label'], merged_labels['period_label']) ari_scores.append([p, ari_p])
额外注意事项
- 初始数据处理代码中
process_data(initial_period_data)未赋值,需改为initial_period_data = process_data(initial_period_data),否则后续特征处理不会生效。 - 若
process_data函数包含客户聚合逻辑(如按客户ID汇总订单特征),需确保初始数据和新周期数据的聚合规则完全一致,避免特征维度不匹配。
内容的提问来源于stack exchange,提问作者Naina
相关产品推荐
相关产品推荐

