Python 如何在scikitlearn中对特征子集应用多项式变换
Scikitlearn有助于多项式特征生成 下面是一个简单的例子:Python 如何在scikitlearn中对特征子集应用多项式变换,python,scikit-learn,Python,Scikit Learn,Scikitlearn有助于多项式特征生成 下面是一个简单的例子: 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(
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
问题:是否有能力仅将多项式变换应用于指定的特征列表
e、 g
当使用该特性来组合一系列的特性生成和模型训练代码时,这将特别有用
一种选择是由Michelle Fullwood推出您自己的transformer,但我认为其他人以前可能会偶然发现这个用例。和sklearn中的许多其他transformer一样,并没有指定要应用哪些数据列的参数,因此,将其投入管道并期望其发挥作用并非易事
更一般的方法是,您可以使用另一个管道为数据帧中的每个功能使用和指定转换器
一个简单的例子是:
从sklearn.pipeline导入功能联合
从sklearn.preprocessing导入多项式特征、OneHotEncoder、LabelEncoder
从sklearn.linear_模型导入逻辑回归
从sklearn.pipeline导入管道
数据帧{'cat_var':['a','b','c'],'num_var':[1,2,3]}
类ColumnExtractorobject:
def _init__self,列=无:
self.columns=列
def fitself,X,y=无:
回归自我
def transformself,X:
X_cols=X[self.columns]
返回X_cols
管道=管道[
“特色”,特色联盟[
“num_var”,管道[
“extract”,ColumnExtractorcolumns=['num_var'],
“多边形”,多项式特征梯度=2
],
“cat_var”,管道[
“extract”,ColumnExtractorcolumns=[“cat_var”],
“le”,LabelEncoder,
“ohe”,一个热编码器,
]
],
“估计量”,逻辑回归
]
是的,有,退房
这应该行得通——应该有一个更优雅的解决方案,但现在无法测试:
from sklearn.preprocessing import PolynomialFeatures
from sklearn_pandas import DataFrameMapper
X2.columns = ['col0', 'col1', 'col2', 'col3', 'col4', 'col5', 'animal']
mapper = DataFrameMapper([
('col0', PolynomialFeatures(2)),
('col1', PolynomialFeatures(2)),
('col2', PolynomialFeatures(2)),
('col3', PolynomialFeatures(2)),
('col4', PolynomialFeatures(2)),
('col5', PolynomialFeatures(2)),
('Animal', None)])
X3 = mapper.fit_transform(X2)
作为对黄彭军回答的回应,该方法非常好,但实施过程中存在问题。 这应该是一个评论,但有点长。还有,没有足够的饼干 我试图使用代码,但遇到了一些问题。在胡闹了一会儿之后,我找到了原来问题的以下答案。 主要问题是ColumnExtractor需要继承BaseEstimator和TransformerMixin,以将其转换为可与其他sklearn工具一起使用的估计器 我的示例数据显示了两个数值变量和一个分类变量。 我使用pd.get_假人进行了一次热编码,以保持管道的畅通 更简单。另外,我省略了管道的最后一个阶段——估计器,因为我们没有y数据来拟合;重点是显示select、单独处理和join 享受 M
对@plumpus_花束代码的改进:
from sklearn.preprocessing import PolynomialFeatures
from sklearn_pandas import DataFrameMapper
X2.columns = ['col0', 'col1', 'col2', 'animal']
degree = 2
mapper = DataFrameMapper(
(['col0', 'col1', 'col2'], PolynomialFeatures(degree))
)
X3 = mapper.fit_transform(X2)
我更喜欢的另一种方法是使用sklearn.compose。我发现它很容易在管道中使用
对于选择列,有多种方法。其中一些方法是:
基于列名
基于数据类型包括和排除选项
索引位置
切片
正则表达式
看。这太棒了。我接受这个答案是因为它不依赖于额外的图书馆。真的很感谢你,莱昂卡托!在哪里可以指定此代码中应该使用的模型?
import pandas as pd
import numpy as np
from sklearn.pipeline import FeatureUnion
from sklearn.preprocessing import PolynomialFeatures
from sklearn.pipeline import Pipeline
from sklearn.base import BaseEstimator, TransformerMixin
X = pd.DataFrame({'cat': ['a', 'b', 'c'], 'n1': [1, 2, 3], 'n2':[5, 7, 9] })
cat n1 n2
0 a 1 5
1 b 2 7
2 c 3 9
# original version had class ColumnExtractor(object)
# estimators need to inherit from these classes to play nicely with others
class ColumnExtractor(BaseEstimator, TransformerMixin):
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
# Using pandas get dummies to make pipeline a bit simpler by
# avoiding one-hot and label encoder.
# Build the pipeline from a FeatureUnion that processes
# numerical and one-hot encoded separately.
# FeatureUnion puts them back together when it's done.
pipe2nvars = Pipeline([
('features', FeatureUnion([('num',
Pipeline([('extract',
ColumnExtractor(columns=['n1', 'n2'])),
('poly',
PolynomialFeatures()) ])),
('cat_var',
ColumnExtractor(columns=['cat_b','cat_c']))])
)])
# now show it working...
for p in range(1, 4):
pipe2nvars.set_params(features__num__poly__degree=p)
res = pipe2nvars.fit_transform(pd.get_dummies(X, drop_first=True))
print('polynomial degree: {}; shape: {}'.format(p, res.shape))
print(res)
polynomial degree: 1; shape: (3, 5)
[[1. 1. 5. 0. 0.]
[1. 2. 7. 1. 0.]
[1. 3. 9. 0. 1.]]
polynomial degree: 2; shape: (3, 8)
[[ 1. 1. 5. 1. 5. 25. 0. 0.]
[ 1. 2. 7. 4. 14. 49. 1. 0.]
[ 1. 3. 9. 9. 27. 81. 0. 1.]]
polynomial degree: 3; shape: (3, 12)
[[ 1. 1. 5. 1. 5. 25. 1. 5. 25. 125. 0. 0.]
[ 1. 2. 7. 4. 14. 49. 8. 28. 98. 343. 1. 0.]
[ 1. 3. 9. 9. 27. 81. 27. 81. 243. 729. 0. 1.]]
from sklearn.preprocessing import PolynomialFeatures
from sklearn_pandas import DataFrameMapper
X2.columns = ['col0', 'col1', 'col2', 'animal']
degree = 2
mapper = DataFrameMapper(
(['col0', 'col1', 'col2'], PolynomialFeatures(degree))
)
X3 = mapper.fit_transform(X2)