【问题标题】:How to quickly generate quadratic numeric features in a dataframe in python?如何在python的数据框中快速生成二次数值特征?
【发布时间】:2018-11-03 19:33:20
【问题描述】:

我想使用 python 和标准库为机器学习模型(分类器或回归器)快速生成交互功能。因为手工进行特征工程可能很耗时,所以我正在寻找可以半自动化某些过程的标准 python 库和方法。例如,要生成用于分析的二次特征,我有以下代码:

import pandas as pd
import numpy as np

df = pd.DataFrame({'a': ['abc', 'def', 'ghi', 'kjl'],
                   'b': [2, 5, 7, 8],
                   'c': [1.2, 3, 4, 6]})
num_cols = [col for col in df.columns if df[col].dtype in [np.int64, np.float64]]
quadratic_cols = [tuple(sorted((i,j))) for i in num_cols for j in num_cols]
quad_col_pairs = list(set(quadratic_cols))

for col_pair in quad_col_pairs:
    col1, col2 = col_pair
    quadratic_col = '{}*{}'.format(*col_pair)
    df[quadratic_col] = df[col1] * df[col2]

我想简化这段代码,因为这种特征工程应该更加标准化和快速部署。 它还不够,因为它需要更多的代码行来生成从特征列之间的加法、减法或除法的派生特征。

如何简化上述代码?是否有标准的 Python 方法或库可以更有效地生成用于构建模型的派生特征?

【问题讨论】:

  • 一个简化是您可以直接使用集合而不是列表推导式quad_col_pairs = {tuple(sorted((i,j))) for i in num_cols for j in num_cols}
  • 是的,这简化了用于获取二次特征的数字列的列表。它本身并不需要通过加、减、乘或除来派生特征。

标签: python pandas scikit-learn feature-engineering


【解决方案1】:

由于您使用 scikit-learn 明确标记它:您可以使用 PolynomialFeatures:

from sklearn.preprocessing import PolynomialFeatures
pf = PolynomialFeatures(include_bias=False)
pf.fit_transform(df._get_numeric_data()) 

#array([[ 2.  ,  1.2 ,  4.  ,  2.4 ,  1.44],
#       [ 5.  ,  3.  , 25.  , 15.  ,  9.  ],
#       [ 7.  ,  4.  , 49.  , 28.  , 16.  ],
#       [ 8.  ,  6.  , 64.  , 48.  , 36.  ]])

它还为您提供了使用高阶多项式的选项,并且只包含交互项。

【讨论】:

  • 是的,这简化了高阶特征的推导。它本身并不需要通过加法、减法、除法来获得特征。
【解决方案2】:

试试这个来避免循环获取所需的列,

import itertools
L=df.select_dtypes(include=[np.number]).columns.tolist()
quad_col_pairs =  list(itertools.combinations_with_replacement(L,2))

for col_pair in quad_col_pairs:
    col1, col2 = col_pair
    quadratic_col = '{}*{}'.format(*col_pair)
    df[quadratic_col] = df[col1] * df[col2]

【讨论】:

  • 是的,这简化了用于获取二次特征的数字列的列表。它本身并不需要通过加、减、乘或除来派生特征。
猜你喜欢
  • 2017-05-09
  • 2020-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-31
  • 2019-01-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多