使用sklearn.preprocessing.LabelEncoder()在Python中编码多个分类数据在2D数组输入上花费太多的处理时间

mhd8tkvw  于 2022-12-21  发布在  Python
关注(0)|答案(1)|浏览(145)

假设由于某种原因,我正在尝试对一个特性进行编码,假设我的特性名称是title,对于title特性,对于一个记录,我可能有不同的单词:title = '苹果','工作'.让我举例说明一下:

ID      title  
0  ['Apple', 'Jobs']  
1  ['Wozniak']
2  ['Apple', 'Wozniak']
3  ['Jobs', 'Wozniak']

如你所见,我的独特价值观是:

unique = ['Apple','Jobs','Wozniak']

以前我使用标签编码器作为:

from sklearn.preprocessing import LabelEncoder

le.fit(unique)
for i in df['title'].index:
    df['title'][i] = le.transform(df['title'][i])

我曾经得到这样的东西:

ID      title  
0  [782, 256]  
1  [331]
2  [782, 331]
3  [256, 331]

这正是我想要的然而,这花费了太多的时间,因为我有太多的值要迭代和编码。2因此,我正在寻找一个更聪明的算法,最好具有更低的时间复杂度或更短的运行时间。

5lhxktic

5lhxktic1#

后来,我发现首先将title的元素划分为5列并应用标签编码可以解决我的问题。我现在分享一个解决方案示例:

def process(self):
    for i in range(self._MULHOTBEGIN,self._MULHOTEND):
        print("\tWorking on",self.df.columns[i])
        self._colnames.append(self.df.columns[i])
        self.df = pd.merge(self.df,self._processSubRoutine(i), left_index=True, right_index=True)
    print("\tCollecting garbage.")
    self._collectGarbage()

def _processSubRoutine(self, colindex):
    result = list()
    for i in range(self._len):
        truncated = self.df.iloc[i,colindex][:self._MAXLEN]
        padded = list(truncated) + ['0']*(self._MAXLEN-len(truncated))
        result.append(padded)
    colnames = self._createColNames(colindex)
    print("\t",colnames)
    return pd.DataFrame(result,columns=colnames, index=self.df.index)

这些进程在中的预处理文件内调用

M = MulHotProcessor(reorderedSource,mulhotBeginIndex2, mulhotEndIndex2, max_len_per_slot_2)
M.process()
sourceProc = M.getDataFrame()

entvals = pd.concat([sourceProc['title_0'],sourceProc['title_1'], \
              sourceProc['title_2'],sourceProc['title_3'], \
              sourceProc['title_4']]).unique()

最后,我们通过拟合唯一值来应用标签编码

le.fit(<unique_values>) # whatever you name your unique values

sourceProc['title_0']=le.transform(sourceProc['title_0'])
sourceProc['title_1']=le.transform(sourceProc['title_1'])
sourceProc['title_2']=le.transform(sourceProc['title_2'])
...

最后,你将在很短的时间内准备好问题中从第一个DF到第二个DF的转换。

相关问题