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

2024-10-01 17:27:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我主要从事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

假设我们要创建外观、温度和湿度之间的交互作用。有没有一种有效的方法可以做到这一点?我可以在熊猫身上手动执行以下操作:

^{pr2}$

enter image description here

我可以把它传给scikit学习一个热编码器,但是有可能有一个更好的、更少手动的方法来创建分类变量之间的交互,而不必逐级检查每个组合。在

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

Tags: csv方法importdfaspage分类手动
2条回答

现在面临着一个类似的问题,即需要一种简单的方法来整合来自文献中基线OLS模型的特定交互作用,以与ML appaches进行比较,我遇到了patsyhttp://patsy.readthedocs.io/en/latest/overview.html)和这个scikit-learn-integrationpatsylearnhttps://github.com/amueller/patsylearn)。在

下面,如何将交互变量传递给模型:

from patsylearn import PatsyModel
model = PatsyModel(sk.linear_model.LinearRegression(), "Play-Tennis ~ C(Outlook):C(Temperature) + C(Outlook):C(Humidity) + C(Outlook):C(Wind)")

注意,在这个公式中,这些变量是热的,请注意,这些变量在这个公式中是被编码的!但请在他们的文档(http://patsy.readthedocs.io/en/latest/categorical-coding.html)中了解更多。在

或者,您也可以使用PatsyTransformer,我更喜欢它,因为它允许轻松集成到scikit learn管道中:

^{pr2}$

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

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

将有重复的互动,它也将包含原始功能。在

任意顺序会使你的设计矩阵爆炸。如果你真的想这么做,那么你应该研究一下多项式核化,这样你就可以很容易地达到任意程度。在

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

^{pr2}$

列名存储在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)]

相关问题 更多 >

    热门问题