我正在尝试将分类数据转换为二进制数据,以便能够使用逻辑回归等算法进行分类。我想过使用'sklearn.preprocessing'模块中的OneHotEncoder,但问题是数据帧条目是A,B对不同长度的数组,每一行都有一对相同长度的数组,不等于其他行中的数组长度。 OneHotEncoder不接受像我这样的数据帧
在 [34] 中:data.index
Out[34]: Index([train1, train2, train3, ..., train7829, train7830, train7831], dtype=object)
In [35]: data.columns
Out[35]: Index([A, B], dtype=object)
SampleID A B
train1 [2092.0, 1143.0, 390.0, ...] [5651.0, 4449.0, 4012.0...]
train2 [3158.0, 3158.0, 3684.0, 3684.0....] [2.0, 4.0, 2.0, 1.0...]
train3 [1699.0, 1808.0 ,...] [0.0, 1.0...]
所以,我想再次强调每个 A 和 B 对具有相同的长度,但长度在不同对之间是可变的。Dataframe 包含数字、分类和二进制值。我有另一个 csv 文件,其中包含有关每种条目类型的信息。我读取文件过滤掉两列中的分类条目,如下所示:
info=data_io.read_train_info()
col1=info.columns[0]
col2=info.columns[1]
info=info[(info[col1]=='Categorical')&(info[col2]=='Categorical')]
然后我info.index
用来过滤我的训练数据框
filtered = data.loc[info.index]
比我写了一个实用函数来改变每个数组的维度,以便我以后可以对它们进行编码
def setDim(df):
for item in x[x.columns[0]].index:
df[df.columns[0]][item].shape=(1,df[df.columns[0]][item].shape[0])
df[df.columns[1]][item].shape=(1,df[df.columns[1]][item].shape[0])
setDim(filtered)
然后我想将每对数组组合成 2 行矩阵,以便我可以将其传递给编码器,然后在编码后再次将它们分开,如下所示:
import numpy as np
from sklearn.preprocessing import OneHotEncoder
def makeSparse(df):
enc = OneHotEncoder()
for i in df.index:
cd=np.append(df['A'][i],df['B'][i],axis=0)
a=enc.fit_transform(cd)
df['A'][i] = a[0,:]
df['B'][i] = a[1,:]
makeSparse(filtered)
在所有这些步骤之后得到一个稀疏的数据帧。我的问题是:
- 这是编码这个数据帧的正确方法吗?(我非常怀疑)
- 如果没有,那么您提供哪些替代方案?
非常感谢您花时间帮助我。