在 R 中生成多项式特征

数据挖掘 r 特征工程
2022-02-13 08:26:01

是否有一种优化的方法可以在 R 中执行此功能“ PolynomialFeatures ”?我有兴趣创建多项式特征矩阵,即所有列之间的两列之间的交互,但我找不到在 R 中最佳执行此操作的基本函数或包,我不想从 Python 脚本导入数据在 R中使用 sklearn 的PolynomialFeatures函数。

这个想法是改变这个:

array([[0, 1],
       [2, 3],
       [4, 5]])

进入这个:

array([[ 1.,  0.,  1.,  0.,  0.,  1.],
       [ 1.,  2.,  3.,  4.,  6.,  9.],
       [ 1.,  4.,  5., 16., 20., 25.]])

拦截和仅交互选项很好,可选。我可以自己扩展-省略那些。

1个回答

您可以使用两种方法:一种采用公式参数,或者如果您不使用公式,您可以使用model.matrix.

您可以执行以下操作:

# Using the same data from the question:
data <- data.table(A = c(0, 2, 4), 
                   B = c(1, 3, 5))

> data

   A B
1: 0 1
2: 2 3
3: 4 5

如果只需要原始数据和交互

formula = y ~ .^2 

model.matrix(formula, data=data)
  (Intercept) A B A:B
1           1 0 1   0
2           1 2 3   6
3           1 4 5  20

如果需要原始数据、平方列、交互和截距,就像问题一样

您可以对所有变量使用以下公式:

formula = y ~ .^2 + poly(var, 2, raw=TRUE)[, 2] ... etc

此外,您可以自动粘贴变量名称。基于这篇文章的公式

formula <- as.formula(paste(' ~ .^2 + ',paste('poly(',colnames(data),',2, raw=TRUE)[, 2]',collapse = ' + ')))

> formula 

~.^2 + poly(A, 2, raw = TRUE)[, 2] + poly(B, 2, raw = TRUE)[, 2]

> model.matrix(formula, data=data)

  (Intercept) A B poly(A, 2, raw = TRUE)[, 2] poly(B, 2, raw = TRUE)[, 2] A:B
1           1 0 1                           0                           1   0
2           1 2 3                           4                           9   6
3           1 4 5                          16                          25  20

生成的数据框与问题中的数组相同。

如果是平方列,则需要交互和截距。

> formula <- as.formula(paste(' ~ A:B + ',paste('poly(',colnames(data),',2, raw=TRUE)[, 2]',collapse = ' + ')))

> formula
~A:B + poly(A, 2, raw = TRUE)[, 2] + poly(B, 2, raw = TRUE)[, 2]

>  model.matrix(formula, data=data)
  (Intercept) poly(A, 2, raw = TRUE)[, 2] poly(B, 2, raw = TRUE)[, 2] A:B
1           1                           0                           1   0
2           1                           4                           9   6
3           1                          16                          25  20