我使用hotEncoder处理一个包含5个值的列,结果得到了5列(用于Z)。这没问题。现在我有另一个包含3个值的列,但在Z1中得到了2列而不是3列。我需要在代码中做些什么来修复这个问题,以便在Z1中得到3列?
另外,我还想了解hotEncoder代码的解释。为什么在这里必须使用np.hstack?非常感谢!!
X = df.iloc[:, :-1].values Y = df.iloc[:, -1].values labelencoder_X5 = LabelEncoder()labelencoder_X6 = LabelEncoder()X[:, 5] = labelencoder_X5.fit_transform(X[:, 5])X[:, 6] = labelencoder_X6.fit_transform(X[:, 6])onehotencoder = OneHotEncoder(sparse=False)Z= onehotencoder.fit_transform(X[:, [5]])X = np.hstack(( Z, X[:,:5] , X[:,6:])).astype('float')#handling the dummy variable trapX = X[:, 1:]onehotencoder = OneHotEncoder(sparse=False)Z1= onehotencoder.fit_transform(X[:, [6]])X = np.hstack(( Z1, X[:,:6] , X[:,7:])).astype('float')#handling the dummy variable trapX = X[:, 1:]
回答:
您通过转换第六列获得Z1
,但这并不是原始数据中的第六列。在之前的代码块中,您在重新定义X
时使用hstack
将第五列(原始)的虚拟变量放在了前面。
但是一些通用的评论是必要的。
- 您不需要在onehot-encoding之前进行标签编码;这是旧版sklearn的遗留问题。
- 您可以使用单个
OneHotEncoder
并一次性fit_transform
您的所有分类列。 - 您可以使用参数
drop='first'
在OneHotEncoder
内部“处理虚拟变量陷阱”。 - 您可以使用
ColumnTransformer
来避免手动使用hstack
。
也就是说,我建议使用以下方法:
tfmr = ColumnTransformer( transformers=[('ohe', OneHotEncoder(drop='first', sparse=False), [5,6])], remainder='passthrough' )X_preproc = tfmr.fit_transform(X)