OneHot Encoder在转换单列时的trick
你是否也遇到了“ValueError: Expected 2D array, got 1D array instead: ” error?
OneHot Encoder在应用于单列时需要注意的事项:
OneHot Encoder的fit_transform(self, X, y=None)函数说明如图所示,X需要是一个Shape为(a, b)的array-like argument,所以在我们将OH encoder应用在单列上时,由于pd.Series的shape为(a,)并非(a,1),所以常会导致shape不对,出现"expect 2D, but 1D is taken"类似错误,要求reshape(-1,1)的错误提示,这时的解决方法如下:
1. oh.fit_transform(X_train['somecol']) -> oh.fit_transform(X_train['somecol'].to_numpy().reshape(-1,1))
2. oh.fit_transform(X_train['somecol']) -> oh.fit_transform(pd.DataFrame(X_train['somecol']))
reshape(-1,1)做了什么的?
reshape是用来改变矩阵行列数目的,这里的1顾名思义是将目标矩阵变为1列,那-1呢?numpy官方文档里有提到,-1意味着“unspecified value”, 意思就是如果我们将列或行的数目定下,不用再计算需要的对应的行或列的数目,而用-1即可,numpy会自动帮我们算出应赋予的行或列的数目。
而在对pandas的Series类型(shape为(a,))进行reshape(-1,1)时,Series的结构其实并未被改变,只不过shape从(a,)变到了(a,1),使其可以与OneHot Encoder的参数定义相匹配。