基于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
相关产品推荐
相关产品推荐

