如何在Orange中对跨列商品值做独热编码用于购物篮分析
你当前使用的「continous discrete variables - one feature per line」功能仅适用于单列存储多值特征的场景,你的原始数据是多列分别存储单个商品,所以无法得到预期结果,可参考以下操作方案:
Orange平台操作步骤
- 第一步:通过
File组件导入你的CSV数据源,导入后确认数据类型:C#列设置为元数据列(不作为建模特征),其余存储商品的列均设置为分类特征。 - 第二步:添加
Unpivot组件和File组件相连,在Unpivot配置页中,将C#列设为保持列,其余所有存储商品的列设为待转换列,运行后会生成「顾客ID + 对应商品」的长格式表,商品为空的行会自动过滤。 - 第三步:添加
Pivot组件和Unpivot组件相连,配置规则:行索引选择C#列,列索引选择Unpivot生成的商品值列,值聚合方式选择计数,运行后直接生成你需要的独热编码矩阵,存在对应商品的单元格值为1,不存在的为0。 - 第四步(可选):如果存在同一顾客重复购买同一款商品的情况,可添加
Discretize组件,将所有数值列按照「≥1为1、<1为0」的规则离散化,保证所有值都是二分类标识。
其他工具快速处理方案
Excel/WPS 表格操作
- 先将原始表中多列存储的商品整理为单列,每行仅保留「顾客ID + 单个商品」的组合,删除商品为空的行。
- 选中全量数据插入数据透视表,行字段设置为
C#,列字段设置为商品名,值字段设置为「计数」,将透视表空白单元格默认填充为0即可得到目标格式。
Python Pandas 处理
如果掌握基础代码操作,可通过以下代码快速转换:
import pandas as pd # 导入原始CSV数据 df = pd.read_csv("你的本地文件路径.csv") # 宽表转长表,删除无商品的空行 df_long = df.melt(id_vars="C#", value_name="item").dropna(subset=["item"]) # 生成独热编码矩阵 df_onehot = pd.crosstab(df_long["C#"], df_long["item"]).reset_index() # 导出结果 df_onehot.to_csv("独热编码结果.csv", index=False)
内容的提问来源于stack exchange,提问作者bchooxg
相关产品推荐
相关产品推荐

