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

基于Python的数据集关联模式挖掘与ML选型技术咨询

问题与解决方案

需求说明

  • 当初始列值为1时,分别针对整体数据及按星期划分的数据,找出常见列对/组和罕见列对/组
  • 针对CSV文件的奇偶(O/E)、高低(H/L)、求和(SUM)、日期(Date)、星期(Day)字段,以及XLSX文件的0-1行数据,提供模式识别/预测的机器学习选型建议

文件结构

CSV文件字段

  • Date:格式为YYYY-MM-DD(如2024-12-31)
  • Day:星期标识
  • Picks:由20个唯一数字组成的字符串,以-分隔
  • O/E:奇偶分类字段
  • H/L:高低分类字段
  • SUM:求和数值字段

XLSX文件结构

  • 包含Date字段及1-70列,每列值为0或1
  • 每行固定只有20列值为1,其余为0,数字随机选取

现有代码问题

已实现DataProcessor类完成基础统计功能,但处理10+年的每日大数据集时,无法有效挖掘列之间的关联模式,需优化改进。

现有代码:

import pandas as pd
import json
import os
from datetime import datetime

# 补充缺失的星期列表定义
days_of_week = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"]

class DataProcessor:
    def __init__(self, stats_dir, combined_file, graph_file):
        self.stats_dir = stats_dir
        self.combined_file = combined_file
        self.graph_file = graph_file
        self.days_of_week = days_of_week

    def get_frequent_values(self):
        df = pd.read_excel(self.graph_file)
        df["Date"] = pd.to_datetime(df["Date"])
        column_frequencies_overall = {
            col: df[col].sum() / len(df) for col in df.columns[1:]
        }
        column_frequencies_per_day = {
            col: {
                day: data[col].sum() / len(data)
                for day, data in df.groupby(df["Date"].dt.day_name())
            }
            for col in df.columns[1:]
        }
        return column_frequencies_overall, column_frequencies_per_day

    def top_10_common_columns(self, column_num):
        column_num = f"{column_num}"
        df = pd.read_excel(self.graph_file)
        df["Date"] = pd.to_datetime(df.iloc[:, 0])
        df["Day Name"] = df["Date"].dt.day_name()

        specified_column = df[column_num]
        specified_column_ones = df[df[column_num] == 1]

        # 整体数据的Top10关联列
        overall_top_10 = (
            specified_column_ones.select_dtypes(include=["int", "float"])
            .drop(columns=[column_num])
            .sum()
            .nlargest(10)
        )

        # 分星期的Top10关联列
        day_of_week_top_10 = {}
        for day in df["Day Name"].unique():
            day_of_week_data = specified_column_ones[specified_column_ones["Day Name"] == day]
            top_10 = (
                day_of_week_data.select_dtypes(include=["int", "float"])
                .drop(columns=[column_num])
                .sum()
                .nlargest(10)
            )
            day_of_week_top_10[day] = top_10

        return overall_top_10, day_of_week_top_10

    def create_json_files(self):
        for num in range(1, 71):
            self.process_json_file(num)

    def process_json_file(self, num):
        overall, daily = self.get_frequent_values()
        overall_key = list(overall.keys())[int(num) - 1]
        overall_value = overall[overall_key]
        daily_key = list(daily.keys())[int(num) - 1]
        daily_value = daily[daily_key]
        hot_overall, hot_daily = self.top_10_common_columns(num)
        hot_items = {
            "Overall": hot_overall,
            "Daily": hot_daily,
        }
        created_date = datetime.now().isoformat()
        json_data = {
            "Created": created_date,
            "Overall": {overall_key: overall_value},
            "Daily": {daily_key: daily_value},
            "Hot": hot_items,
            "Cold": "soon",
        }

        json_file = os.path.join(self.stats_dir, f"{num}.json")
        if os.path.exists(json_file):
            with open(json_file, "r") as existing_json:
                existing_data = json.load(existing_json)
                existing_created_date = existing_data.get("Created")
                if existing_created_date and datetime.fromisoformat(existing_created_date) >= datetime.now():
                    print(f"{num}.json up-to-date\n")
                    return
        else:
            os.makedirs(self.stats_dir, exist_ok=True)
            with open(json_file, "w") as jsonfile:
                json.dump(json_data, jsonfile, indent=4)
            print(f"{num}.json file created\n")

    def json_create_func(self):
        self.create_json_files()

解决方案

一、关联模式挖掘优化(常见/罕见列对/组)

现有代码仅统计单列频率,要挖掘列对/组的关联,需使用关联规则算法(如Apriori),针对大数据集可优化效率:

1. 核心改进思路

  • 将XLSX的0-1矩阵每行转换为项集(值为1的列名集合)
  • 用Apriori算法挖掘频繁项集(常见列组),通过支持度筛选罕见项集
  • 按星期分组重复上述操作,得到分维度的关联模式

2. 代码实现示例

from mlxtend.frequent_patterns import apriori, association_rules
from mlxtend.preprocessing import TransactionEncoder
import pandas as pd

def find_association_patterns(df, min_support=0.05, day_filter=None):
    # 筛选指定星期的数据
    if day_filter:
        df = df[df["Date"].dt.day_name() == day_filter]
    
    # 提取0-1列并转换为项集格式
    item_cols = df.columns[1:]
    transactions = df[item_cols].apply(lambda row: list(item_cols[row == 1]), axis=1).tolist()
    
    # 转换为算法所需的编码格式
    te = TransactionEncoder()
    te_ary = te.fit(transactions).transform(transactions)
    df_encoded = pd.DataFrame(te_ary, columns=te.columns_)
    
    # 挖掘频繁项集(常见列组)
    frequent_itemsets = apriori(df_encoded, min_support=min_support, use_colnames=True)
    # 生成关联规则(列对关联关系)
    rules = association_rules(frequent_itemsets, metric="confidence", min_threshold=0.7)
    
    # 筛选罕见项集:支持度远低于平均水平的项集
    avg_support = frequent_itemsets["support"].mean()
    rare_itemsets = frequent_itemsets[frequent_itemsets["support"] < avg_support * 0.1]
    
    return frequent_itemsets, rules, rare_itemsets

# 在DataProcessor中新增关联模式挖掘方法
class DataProcessor:
    # ... 原有方法 ...
    
    def get_association_patterns(self, min_support=0.05):
        df = pd.read_excel(self.graph_file)
        df["Date"] = pd.to_datetime(df["Date"])
        
        # 整体数据的关联模式
        overall_freq, overall_rules, overall_rare = find_association_patterns(df, min_support)
        
        # 按星期划分的关联模式
        daily_patterns = {}
        for day in self.days_of_week:
            freq, rules, rare = find_association_patterns(df, min_support, day_filter=day)
            daily_patterns[day] = {
                "frequent_itemsets": freq,
                "rules": rules,
                "rare_itemsets": rare
            }
        
        return {
            "overall": {
                "frequent": overall_freq,
                "rules": overall_rules,
                "rare": overall_rare
            },
            "daily": daily_patterns
        }

3. 性能优化建议

  • 分块读取XLSX文件,逐步统计项集支持度,降低内存占用
  • 使用mlxtend的low_memory=True参数优化内存使用
  • 超大数据集改用FP-Growth算法,比Apriori效率更高

二、机器学习选型建议

根据数据特征和需求,分场景选型:

1. 模式识别(分类/聚类)

  • CSV字段场景:
    • 分类任务(如预测O/E、H/L):逻辑回归(基线模型)、随机森林(处理非线性关联)、XGBoost(结合时间特征)
    • 聚类任务(如按SUM、Day分组):K-Means(简单高效)、DBSCAN(发现不规则簇)
  • XLSX 0-1矩阵场景:
    • 常见组合识别:关联规则算法(Apriori/FP-Growth)、PCA降维后聚类

2. 预测任务

  • 数值预测(SUM值):时间序列模型(ARIMA、Prophet)、梯度提升树(XGBoost/LightGBM,结合日期、星期特征)
  • 分类预测(0-1组合、O/E、H/L):
    • 离散组合预测:多层感知器(MLP)、Transformer模型(处理序列特征)
    • 标签分类:随机森林、CatBoost(自动处理类别特征)

内容的提问来源于stack exchange,提问作者Klang Kobert

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 08:39:53