我有一个包含一些分类列的数据集。这是一个小样本:
Temp precip dow tod
-20.44 snow 4 14.5
-22.69 snow 4 15.216666666666667
-21.52 snow 4 17.316666666666666
-21.52 snow 4 17.733333333333334
-20.51 snow 4 18.15
这里,dow 和 precip 是分类的,而其他的是连续的。
有没有一种方法可以为这些列创建 OneHotEncoder?我不想使用 pd.get_dummies 因为除非每个 dow 和 precip 都以正确的格式放置数据在新数据中。
请您参考如下方法:
您可以检查两件事:sklearn-pandas正如@Grr pipelines 所提到的有了这个好intro .
所以我更喜欢管道,因为它们是一种整洁的方式,可以轻松地与 grid-seach 之类的东西一起使用,避免交叉验证中折叠之间的泄漏等。所以我通常最终会得到这样的管道(假设你有 precip LabelEncoded优先):
from sklearn.pipeline import Pipeline, FeatureUnion, make_pipeline, make_union
from sklearn.preprocessing import OneHotEncoder
from sklearn.base import BaseEstimator, TransformerMixin
from sklearn.linear_model import LinearRegression
class Columns(BaseEstimator, TransformerMixin):
def __init__(self, names=None):
self.names = names
def fit(self, X, y=None, **fit_params):
return self
def transform(self, X):
return X[self.names]
class Normalize(BaseEstimator, TransformerMixin):
def __init__(self, func=None, func_param={}):
self.func = func
self.func_param = func_param
def transform(self, X):
if self.func != None:
return self.func(X, **self.func_param)
else:
return X
def fit(self, X, y=None, **fit_params):
return self
cat_cols = ['precip', 'dow']
num_cols = ['Temp','tod']
pipe = Pipeline([
("features", FeatureUnion([
('numeric', make_pipeline(Columns(names=num_cols),Normalize())),
('categorical', make_pipeline(Columns(names=cat_cols),OneHotEncoder(sparse=False)))
])),
('model', LinearRegression())
])
