如何获取Scikit-learn中OrdinalEncoder各特征取值的笛卡尔积
问题原因
itertools.product 要求传入多个独立的可迭代对象作为笛卡尔积的计算维度,你直接传入 oe.categories_(本质是包含3个numpy数组的列表)时,函数会将整个列表视为单个可迭代对象,仅遍历列表内的3个数组生成结果,不会对数组内部的取值做组合计算。
解决方法
给传入的 oe.categories_ 加上解包符*,将列表内的3个数组拆分为3个独立参数传给itertools.product即可。
修改后的代码片段如下:
import itertools import pandas as pd from sklearn import preprocessing data = pd.read_csv("data.csv") feature_cols = ['country', 'city', 'pay_type'] X = data[feature_cols] y = data.label oe = preprocessing.OrdinalEncoder() X = oe.fit_transform(X) print(oe.categories_) # 仅修改这一行,添加*解包 for element in itertools.product(*oe.categories_): print(element)
修改后会输出162=12组符合要求的笛卡尔积结果,格式如下:
('Saudi Arabia', 'Dammam', 'COD') ('Saudi Arabia', 'Dammam', 'PREPAID') ('Saudi Arabia', 'Jeddah', 'COD') ...后续其他组合
如果需要将生成的笛卡尔积直接转为DataFrame使用,可以用以下代码:
cross_df = pd.DataFrame(itertools.product(*oe.categories_), columns=feature_cols)
内容的提问来源于stack exchange,提问作者Sayalic
相关产品推荐
相关产品推荐

