# 评估流程详细说明 ## 1. 推荐模式的选择方法 ### 1.1 模式挖掘阶段 在每轮迭代开始时,`run_one_round()` 方法会: 1. **挖掘所有候选模式**: ```python patterns = self.miner.mine_patterns( min_participation=0.6, max_pattern_size=5, priority='confidence' # 按置信度排序 ) ``` - 挖掘所有满足参与率阈值(≥0.6)的模式 - 按 `priority` 参数排序(默认是 `confidence`,即参与率) - 返回按置信度降序排列的模式列表 ### 1.2 模式筛选阶段 从挖掘出的所有模式中: ```python top_patterns = patterns[:20] # 取前20个模式用于评分 ``` **选择方法**: - 取置信度最高的前20个模式 - 这些模式已经按置信度(参与率)降序排列 ### 1.3 模式评分和排序阶段 对筛选出的20个模式进行用户偏好评分: ```python # 使用当前用户向量进行评分 scores = self.learner._score_with_vector(top_patterns, state.user_vector) # 按分数降序排序 ranked = sorted(zip(top_patterns, scores), key=lambda x: x[1], reverse=True) ranked_patterns = [p for p, _ in ranked] ``` **评分方法**: - **Baseline方法**:使用余弦相似度计算模式向量与用户向量的相似度 - **Contrastive方法**:使用训练后的 PreferenceEncoder 模型将模式向量和用户向量投影到新空间,然后计算余弦相似度 **最终推荐**: - 返回按用户偏好分数降序排列的模式 - 评估时取前 `top_k` 个(默认5个)作为推荐模式 ### 1.4 总结 **推荐模式的选择流程**: ``` 所有模式(按置信度排序) ↓ 取前20个高置信度模式 ↓ 使用用户向量进行偏好评分 ↓ 按偏好分数降序排序 ↓ 返回排序后的模式(评估时取前top_k个) ``` **选择依据**: 1. **置信度筛选**:先筛选出置信度(参与率)最高的20个模式 2. **用户偏好排序**:使用当前用户向量对这些模式进行评分 3. **综合排序**:最终推荐 = 置信度筛选 + 用户偏好排序 --- ## 2. 准确率不变的原因分析 ### 2.1 问题现象 从结果看,baseline 和 contrastive 的准确率在10轮中都保持不变: - Baseline: 0.7154(10轮相同) - Contrastive: 0.7177(10轮相同) ### 2.2 可能的原因 #### 原因1:阈值计算方式 使用**中位数作为动态阈值**: ```python threshold = np.median(scores) ``` **问题**: - 如果分数分布变化不大,中位数可能保持不变 - 导致预测结果(≥阈值 vs <阈值)基本不变 - 从而准确率保持不变 #### 原因2:模型训练效果不明显 - 训练轮数可能太少(每轮只训练5个epoch) - 模型参数更新幅度小,导致评分变化不明显 - 分数分布变化不足以改变中位数阈值 #### 原因3:用户向量更新但评分方式未变 - 虽然用户向量在更新(融合了反馈) - 但如果评分方式(baseline vs contrastive)没有真正区分,结果会相似 ### 2.3 验证方法 添加了详细的日志来追踪: 1. **分数统计**:每轮的分数最小值、最大值、均值、中位数、标准差 2. **预测统计**:每轮预测为正类的模式数量 3. **阈值变化**:每轮的动态阈值 通过这些日志可以判断: - 分数是否真的在变化 - 阈值是否在变化 - 预测结果是否在变化 ### 2.4 改进建议 1. **使用固定阈值或更敏感的阈值**: - 当前:使用中位数(可能变化不大) - 建议:使用固定阈值(如0.5)或基于分数分布的百分位数 2. **增加训练轮数**: - 当前:每轮训练5个epoch - 建议:增加到10-20个epoch,或根据loss变化动态调整 3. **检查模型是否真正更新**: - 验证训练后模型参数是否变化 - 验证评分时是否使用了训练后的模型 --- ## 3. 评估流程时序 ``` Round 1: 1. 挖掘所有模式(按置信度排序) 2. 取前20个模式 3. 使用初始用户向量(LLM意图)评分 4. 推荐前top_k个模式 5. 模拟反馈(喜欢/不喜欢) 6. 更新用户向量 + 训练模型(如果有contrastive) 7. 使用更新后的模型对所有模式评分 8. 计算准确率 Round 2: 1. 挖掘所有模式(按置信度排序)← 注意:重新挖掘,但结果相同 2. 取前20个模式 3. 使用更新后的用户向量评分 ← 这里应该不同 4. 推荐前top_k个模式 ← 推荐应该不同 5. 模拟反馈 6. 更新用户向量 + 训练模型 7. 使用更新后的模型对所有模式评分 ← 这里应该不同 8. 计算准确率 ← 应该变化 ``` **关键点**: - 每轮都会重新挖掘模式(但结果相同,因为数据没变) - 每轮使用**更新后的用户向量**进行评分(应该不同) - 每轮使用**训练后的模型**进行评分(如果有contrastive,应该不同) - 准确率应该随用户向量和模型的变化而变化