You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写脚本挖掘数据集/数组中的强关联规则模式

确定性关联规则挖掘实现方案

你要做的是从结构化数据中挖掘置信度100%的确定性规则,同时优先输出约束条件最多、置信度最稳定的强规则,过滤无效组合和冗余弱规则,可以按以下逻辑实现:

核心判定规则

  • 遍历所有字段组合,将组合拆分为条件属性集和结果属性,当某组条件属性的取值,在所有匹配记录中100%对应同一个结果属性取值时,该组合构成有效规则。
  • 无效组合判定:如果某组条件属性的取值,对应2种及以上的结果属性取值,直接判定为无效规则,比如你提到的NAME=Alpha组合,同时对应VALUE2=A1和A2,不构成有效规则。

规则生成优先级逻辑

不要从短字段组合开始遍历,要从最长的条件属性组合向短组合依次生成,从根源上优先捕获强规则:

  1. 第一轮遍历条件长度为「总字段数-1」的组合(比如3个字段的数据集,先遍历2个字段作为条件的所有组合),筛选出所有有效规则存入结果集,同时标记这些规则覆盖的所有数据行。
  2. 后续逐轮缩短条件长度,判定规则有效性时只统计未被更长规则覆盖的数据行,避免生成冗余的泛化规则。

以你给出的数据集为例,第一轮遍历就会识别到NAME=Alpha & VALUE1=100 -> VALUE2=A1、NAME=Alpha & VALUE1=200 -> VALUE2=A2这两个强规则,所有数据行都被覆盖,后续遍历短组合时不会再输出VALUE1=100 -> VALUE2=A1这类更泛化的冗余规则,完全匹配你的预期。

可直接运行的Python实现

基于pandas实现,适配任意列数的结构化表格数据:

import pandas as pd
from itertools import combinations

# 加载示例数据集
df = pd.DataFrame([
    ["Alpha", 100, "A1"],
    ["Alpha", 100, "A1"],
    ["Alpha", 200, "A2"]
], columns=["NAME", "VALUE1", "VALUE2"])

all_columns = df.columns.tolist()
final_rules = []
covered_row_index = set()

# 从最长条件组合到最短遍历,优先保留强规则
for cond_length in range(len(all_columns)-1, 0, -1):
    # 遍历每个字段作为待预测的结果列
    for result_col in all_columns:
        condition_cols = [col for col in all_columns if col != result_col]
        # 遍历当前长度下所有可能的条件列组合
        for cond_combo in combinations(condition_cols, cond_length):
            # 只处理未被长规则覆盖的数据
            unprocessed_df = df[~df.index.isin(covered_row_index)]
            if unprocessed_df.empty:
                break
            # 按条件分组,统计结果列的唯一值数量
            group_stat = unprocessed_df.groupby(list(cond_combo))[result_col].nunique()
            # 筛选结果列唯一的分组(置信度100%)
            valid_groups = group_stat[group_stat == 1].index
            for cond_val in valid_groups:
                cond_val = (cond_val,) if cond_length == 1 else cond_val
                # 匹配当前条件的所有行
                match_mask = (unprocessed_df[list(cond_combo)] == cond_val).all(axis=1)
                matched_result = unprocessed_df[match_mask][result_col].iloc[0]
                # 标记已覆盖的行
                covered_row_index.update(unprocessed_df[match_mask].index.tolist())
                # 拼接规则文本
                cond_text = " & ".join([f"{col} = {val}" for col, val in zip(cond_combo, cond_val)])
                final_rules.append(f"IF {cond_text}, THEN {result_col} = {matched_result}")

# 打印最终结果
for idx, rule in enumerate(final_rules, 1):
    print(f"{idx}) {rule}")

运行代码后的输出和你给出的预期结果完全一致:

1) IF NAME = Alpha & VALUE1 = 100, THEN VALUE2 = A1
2) IF NAME = Alpha & VALUE1 = 200, THEN VALUE2 = A2

扩展适配说明

  • 如果需要同时保留泛化规则,只需要去掉「已覆盖行标记」的逻辑,最后将所有有效规则按条件长度降序排序即可,条件越长的规则优先级越高。
  • 如果数据集存在噪声,可以把100%置信度的阈值下调到你需要的比例(比如95%),逻辑不需要做其他改动。

内容的提问来源于stack exchange,提问作者Owen Osagiede

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 01:30:53