为什么我进入 Z1 2 列而不是 3 列以及如何使用 hotEncoder 修复它

why I get in Z1 2 columns instead of 3 and how to fix it using hotEncoder

我将 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 trap
X = 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 trap
X = X[:, 1:]

您通过转换第 6 列得到 Z1,但这不是原始数据的第 6 列。在前面的代码块中,在使用 hstack.

重新定义 X 时,您将第 5(原始)列的虚拟变量放在第一位

但是,一些通用的评论是有序的。

  • onehot-encoding前不需要label-encode;那是旧 sklearn 版本的产物。
  • 您可以一次性使用一个 OneHotEncoderfit_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)