gpt4 book ai didi

python - 如何将多项式变换应用于 scikit 学习中的特征子集

转载 作者:太空狗 更新时间:2023-10-29 22:10:23 25 4
gpt4 key购买 nike

Scikitlearn 的 PolynomialFeatures促进多项式特征生成。

这是一个简单的例子:

import numpy as np
import pandas as pd
from sklearn.preprocessing import PolynomialFeatures

# Example data:
X = np.arange(6).reshape(3, 2)


# Works fine
poly = PolynomialFeatures(2)
pd.DataFrame(poly.fit_transform(X))

0 1 2 3 4 5
0 1 0 1 0 0 1
1 1 2 3 4 6 9
2 1 4 5 16 20 25

问题:是否可以仅将多项式变换应用于指定的特征列表?

例如

# Use previous dataframe
X2 = X.copy()

# Categorical feature will be handled
# by a one hot encoder in another feature generation step
X2['animal'] = ['dog', 'dog', 'cat']

# Don't try to poly transform the animal column
poly2 = PolynomialFeatures(2, cols=[1,2]) # <-- ("cols" not an actual param)

# desired outcome:
pd.DataFrame(poly2.fit_transform(X))
0 1 2 3 4 5 'animal'
0 1 0 1 0 0 1 'dog'
1 1 2 3 4 6 9 'dog'
2 1 4 5 16 20 25 'cat'

这在使用 Pipeline 时特别有用feature 结合了一系列的特征生成和模型训练代码。

一种选择是使用您自己的转换器(Michelle Fullwood 的 great example),但我想其他人以前可能会偶然发现这个用例。

最佳答案

PolynomialFeatures与 sklearn 中的许多其他转换器一样,没有指定要应用数据的哪一列的参数,因此将其放入管道并期望工作并不简单。

一个更通用的方法,你可以使用 FeatureUnion并使用另一个管道为数据框中的每个功能指定转换器。

一个简单的例子可以是:

from sklearn.pipeline import FeatureUnion
from sklearn.preprocessing import PolynomialFeatures, OneHotEncoder, LabelEncoder
from sklearn.linear_model import LogisticRegression
from sklearn.pipeline import Pipeline


X = pd.DataFrame({'cat_var': ['a', 'b', 'c'], 'num_var': [1, 2, 3]})


class ColumnExtractor(object):
def __init__(self, columns=None):
self.columns = columns

def fit(self, X, y=None):
return self

def transform(self, X):
X_cols = X[self.columns]

return X_cols


pipeline = Pipeline([
('features', FeatureUnion([
('num_var', Pipeline([
('extract', ColumnExtractor(columns=['num_var'])),
('poly', PolynomialFeatures(degree=2))
])),
('cat_var', Pipeline([
('extract', ColumnExtractor(columns=['cat_var'])),
('le', LabelEncoder()),
('ohe', OneHotEncoder()),
]))
])),
('estimator', LogisticRegression())
])

关于python - 如何将多项式变换应用于 scikit 学习中的特征子集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47664061/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com