形状不匹配时,一位热编码训练和测试数据。 Train_Data同时采用与管道get_dummies比TEST_DATA多的伪列,

问题描述 投票:0回答:3

我试图创建一个get_dummies类为我的数据,我想在以后管道使用它:

class Dummies(BaseEstimator, TransformerMixin):
     def transform(self, df):
           dummies=pd.get_dummies(df[self.cat],drop_first=True) ## getting dummy cols
           df=pd.concat([df,dummies],axis=1) ## concatenating our dummies
           df.drop(self.cat,axis=1,inplace=True) ## dropping our original cat_cols

     def fit(self, df):
           self.cat=[]    
           for i in df.columns.tolist():    
               if i[0]=='c': ## My data has categorical cols start with 'c'  
                  self.cat.append(i)  ## Storing all my categorical_columns for dummies
              else:
                continue

现在,当我打电话fit_transform上X_train然后变换X_test

z=Dummies()
X_train=z.fit_transform(X_train)
X_test=z.transform(X_test)

在X_train和X_test的形状列是不同​​的:

X_train.shape
X_test.shape

输出:

(10983, 1797) (3661, 1529)

还有在X_train更傻瓜比我X_test。很显然,我的X_test具有大类X_train少。我怎样写逻辑在我的课,使得X_test类别广播X_train的形状?我想X_test有相同数量的虚拟变量作为我X_train的。

python scikit-learn pipeline one-hot-encoding
3个回答
0
投票

你想在这里使用的(我认为)是什么scikit学习的OneHotEncoder

from sklearn.preprocessing import OneHotEncoder
encoder = OneHotEncode(categories = "auto")
X_train_encoded = encoder.fit_transform("X_train")
X_test_encoded = encoder.transform("X_test")

这使fit_transform语法,并确保X_test_encoded具有相同的形状X_train_encoded。它也可以在管道正如你所提到的,而不是Dummies()使用。例:

pipe1=make_pipeline(OneHotEncoder(categories = "auto"), StandardScaler(), PCA(n_components=7), LogisticRegression())

0
投票

你可以添加这两种dataframes然后做get_dummies()。


0
投票

如果我们开始用两个小例子dataframes:

train = pd.DataFrame({'job=carpenter': [0, 1, 0],
                   'job=plumber': [0, 0, 1],
                   'job=electrician': [1, 0, 0]})

    job=carpenter   job=plumber  job=electrician
0               0             0                1
1               1             0                0
2               0             1                0


test = pd.DataFrame({'job=carpenter': [0, 1, 0],
                   'job=plumber': [1, 1, 0]})

    job=carpenter   job=plumber
0               0             1
1               1             1
2               0             0

我们可以使用字典解析来获得在列车组从测试集中缺少每一列,并为其分配一个0值,这将被用来在特定的列添加到测试集,并用零填充它(因为在试验组没有行包含这些缺失类别的开始与):

train_cols = list(train.columns)
test_cols = list(test.columns)
cols_not_in_test = {c:0 for c in train_cols if c not in test_cols}
test = test.assign(**cols_not_in_test)

这给了我们以下测试数据框:

test

   job=carpenter   job=plumber  job=electrician
0              0             1                0
1              1             1                0
2              0             0                0
© www.soinside.com 2019 - 2024. All rights reserved.