在 python 中跨多个数据帧使用分类编码

Using categorical encoding across multiple dataframes in python

我有一个 DataFrame X_Train,其中包含两个分类列和一个数字列,例如:

一个 B N
'a1' 'b1' 0.5
'a1' 'b2' -0.8
'a2' 'b2' 0.1
'a2' 'b3' -0.2
'a3' 'b4' 0.4

在将其发送到 sklearn 的线性回归之前,我将其更改为稀疏矩阵。为此,我需要将分类数据更改为数字索引,如下所示:

X_Train['acat'] = pd.factorize(X_Train['A'])[0]
X_Train['bcat'] = pd.factorize(X_Train['B'])[0]

然后我把它改成稀疏矩阵:

X_Train_Sparse = scipy.sparse.coo_matrix((X_Train.N, (X_Train.acat, X_Train.bcat)))

我还有一个类似的DataFrame,X_Test,例如:

一个 B N
'a4' 'b3' 0.6
'a5' 'b5' -0.1
'a6' 'b2' -0.1
'a6' 'b1' -0.5
'a6' 'b3' 0.3

我还需要将其更改为稀疏矩阵。如何对 X_Test 使用 X_Train 中的相同 bcat 分类,以便线性回归将 X_Train 中的 'b1' 视为与 'b1' 中的相同变量158=]?这意味着,如果 X_Test 中有任何 B 值不在 X_Train 中,则应删除该 B 值,因为没有从该 B 值中学习,因此无法进行预测它。

您必须在拆分前应用分类编码:

样本:

import pandas as pd
df = pd.DataFrame({'A': {0: "'a1'",  1: "'a1'",  2: "'a2'",  3: "'a2'",  4: "'a3'",  5: "'a4'",  6: "'a5'",  7: "'a6'",  8: "'a6'",  9: "'a6'"}, 'B': {0: "'b1'",  1: "'b2'",  2: "'b2'",  3: "'b3'",  4: "'b4'",  5: "'b3'",  6: "'b5'",  7: "'b2'",  8: "'b1'",  9: "'b3'"}, 'N': {0: 0.5,  1: -0.8,  2: 0.1,  3: -0.2,  4: 0.4,  5: 0.6,  6: -0.1,  7: -0.1,  8: -0.5,  9: 0.3}})

代码:

# Encode categories
df['B'] = pd.Categorical(df['B'])
# Split data into train/test
df_train, df_test = df.iloc[:5], df.iloc[5:]

结果:

df_train['B'].cat.codes

Out[58]: 
0    0
1    1
2    1
3    2
4    3
dtype: int8

df_test['B'].cat.codes

Out[59]: 
5    2
6    4
7    1
8    0
9    2
dtype: int8