Python 如何将sklearn预处理交互变量的输出连接回原始数据帧?

Python 如何将sklearn预处理交互变量的输出连接回原始数据帧?,python,pandas,scikit-learn,logistic-regression,Python,Pandas,Scikit Learn,Logistic Regression,我试图为逻辑回归模型创建交互变量。我有70多个功能,其中我只想对其中6个功能执行预处理。有人知道如何从fit_transform获取numpy数组并将这些交互连接回原始数据帧吗?还有,是否有一种优雅的方式来标记交互,以便我知道我在看什么?我想我会使用numpy数组,通过pd.DateFrame转换成dataframe,但是在那之后我有点迷路了。先谢谢你。我发现了下面的问题,但对于我的特定用例,我仍然有些困惑 到目前为止,我的代码如下 # Subset of dataframe to creat

我试图为逻辑回归模型创建交互变量。我有70多个功能,其中我只想对其中6个功能执行预处理。有人知道如何从fit_transform获取numpy数组并将这些交互连接回原始数据帧吗?还有,是否有一种优雅的方式来标记交互,以便我知道我在看什么?我想我会使用numpy数组,通过pd.DateFrame转换成dataframe,但是在那之后我有点迷路了。先谢谢你。我发现了下面的问题,但对于我的特定用例,我仍然有些困惑

到目前为止,我的代码如下

# Subset of dataframe to create interaction variables from 
df_interactions = df[['x1','x2','x3','x4','x5','x6']]

from sklearn.preprocessing import PolynomialFeatures
poly = PolynomialFeatures(interaction_only=True)
df_interactions_T = poly.fit_transform(degrees=2, df_interactions)
简短回答 您的列的格式如下所示:

[1,
 'x1',
 'x2',
 'x3',
 'x4',
 'x5',
 'x6',
 'x1 * x2',
 'x1 * x3',
 'x1 * x4',
 'x1 * x5',
 'x1 * x6',
 'x2 * x3',
 'x2 * x4',
 'x2 * x5',
 'x2 * x6',
 'x3 * x4',
 'x3 * x5',
 'x3 * x6',
 'x4 * x5',
 'x4 * x6',
 'x5 * x6']
如果将这些值赋给
gen\u col\u names
变量,并转换为DataFrame,则可以看到发生了什么

pd.DataFrame(df_interactions_T,columns=gen_col_names)
长话短说 让我们访问源代码,看看发生了什么:

组合的源代码如下所示:

from itertools import chain, combinations
from itertools import combinations_with_replacement as combinations_w_r

def _combinations(n_features, degree, interaction_only, include_bias):
    comb = (combinations if interaction_only else combinations_w_r)
    start = int(not include_bias)
    return chain.from_iterable(comb(range(n_features), i)
                                   for i in range(start, degree + 1))
n_features = 6
degree = 2
interaction_only = True
include_bias = True
创建数据:

import numpy as np
import pandas as pd
np.random.seed(0)
cols = ['x1','x2','x3','x4','x5','x6']
df = pd.DataFrame()

for col in cols:
    df[col] = np.random.randint(1,10,100)

df_interactions = df[['x1','x2','x3','x4','x5','x6']]

from sklearn.preprocessing import PolynomialFeatures
poly = PolynomialFeatures(interaction_only=True,degree=2)
df_interactions_T = poly.fit_transform(df_interactions)
您的参数如下所示:

from itertools import chain, combinations
from itertools import combinations_with_replacement as combinations_w_r

def _combinations(n_features, degree, interaction_only, include_bias):
    comb = (combinations if interaction_only else combinations_w_r)
    start = int(not include_bias)
    return chain.from_iterable(comb(range(n_features), i)
                                   for i in range(start, degree + 1))
n_features = 6
degree = 2
interaction_only = True
include_bias = True
您可以使用此信息生成列名:

gen_col_names = []
for i in combs:
    if i == ():
        gen_col_names.append(1)
    if len(i) == 1:
        gen_col_names.append(cols[i[0]])
    if len(i) == 2:
        gen_col_names.append(cols[i[0]] + ' * ' + cols[i[1]])

gen_col_names
[1,
 'x1',
 'x2',
 'x3',
 'x4',
 'x5',
 'x6',
 'x1 * x2',
 'x1 * x3',
 'x1 * x4',
 'x1 * x5',
 'x1 * x6',
 'x2 * x3',
 'x2 * x4',
 'x2 * x5',
 'x2 * x6',
 'x3 * x4',
 'x3 * x5',
 'x3 * x6',
 'x4 * x5',
 'x4 * x6',
 'x5 * x6']

只需将其设置为以下列:
df[['x1','x2','x3','x4','x5','x6']]=poly.fit_变换(度数=2,df[['x1','x2','x3','x4','x5','x6'])