python - 如何从分类变量创建交互设计矩阵?

标签 python pandas scikit-learn

我主要从事 R 语言的统计建模/机器学习工作,并希望提高我在 Python 方面的技能。我想知道在 python 中创建分类交互(任意程度)设计矩阵的最佳方法。

玩具示例:

import pandas as pd
from urllib import urlopen
page = urlopen("http://www.shatterline.com/MachineLearning/data/tennis_anyone.csv")
df = pd.read_csv(page)
df.head(n=5)

enter image description here

假设我们想要在 Outlook、Temp 和 Humidity 之间创建交互。有没有一种有效的方法来做到这一点?我可以在 Pandas 中手动做这样的事情:

OutTempFact=pd.Series(pd.factorize(pd.lib.fast_zip([df.Outlook.values, df.Temperature.values]))[0],name='OutTemp')
OutHumFact=pd.Series(pd.factorize(pd.lib.fast_zip([df.Outlook.values, df.Humidity.values]))[0],name='OutHum')
TempHumFact=pd.Series(pd.factorize(pd.lib.fast_zip([df.Temperature.values, df.Humidity.values]))[0],name='TempHum')

IntFacts=pd.concat([OutTempFact,OutHumFact,TempHumFact],axis=1)
IntFacts.head(n=5)

enter image description here

然后我可以将其传递给 scikit-learn one-hot 编码器,但可能有一种更好、更少手动的方法来创建分类变量之间的交互,而无需逐步完成每个组合。

import sklearn as sk
enc = sk.preprocessing.OneHotEncoder()
IntFacts_OH=enc.fit_transform(IntFacts)
IntFacts_OH.todense()

最佳答案

如果您在设计矩阵上使用 OneHotEncoder 来获得单热设计矩阵,那么交互就是列之间的乘法。如果 X_1hot 是您的单热设计矩阵,其中样本是线,那么对于二阶交互,您可以编写

X_2nd_order = (X_1hot[:, np.newaxis, :] * X_1hot[:, :, np.newaxis]).reshape(len(X_1hot), -1)

将有重复的交互,它也将包含原始特征。

任意顺序将使您的设计矩阵爆炸。如果您真的想这样做,那么您应该研究使用多项式内核进行内核化,这会让您轻松地达到任意程度。

使用您提供的数据框,我们可以进行如下操作。首先,一种从数据框构建单热设计的手动方法:

import numpy as np
indicators = []
state_names = []
for column_name in df.columns:
    column = df[column_name].values
    one_hot = (column[:, np.newaxis] == np.unique(column)).astype(float)
    indicators.append(one_hot)
    state_names = state_names + ["%s__%s" % (column_name, state) for state in np.unique(column)]

X_1hot = np.hstack(indicators)

然后列名存储在 state_names 中,指标矩阵为 X_1hot。然后我们计算二阶特征

X_2nd_order = (X_1hot[:, np.newaxis, :] * X_1hot[:, :, np.newaxis]).reshape(len(X_1hot), -1)

为了知道二阶矩阵的列名,我们这样构造

from itertools import product
one_hot_interaction_names = ["%s___%s" % (column1, column2) 
                             for column1, column2 in product(state_names, state_names)]

关于python - 如何从分类变量创建交互设计矩阵?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23497512/

相关文章:

python - python中节点图的ASCII可视化

python - Python 中哪个更快, "while"或 "for xrange"

python - 读取 .xlsx 文件并将其转换为 csv 并连接

python - 如何将系列列表传递给 Pandas DataFrame?

python - 仅外部加入 python pandas

python - 了解 Python ReportLab 中的表格坐标系

python - Pandas groupby : *full* join result of groupwise operation on original index

python - 属性错误: 'Pipeline' object has no attribute 'partial_fit'

machine-learning - CART算法使用的离散化方法是什么?

numpy - 在 NumPy 中按类别划分训练数据