Skip to main content
 首页 » 编程设计

python之我怎样才能对列的子集进行热编码

2025年05月04日13mq0036

我有一个包含一些分类列的数据集。这是一个小样本:

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()) 
])