在 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
我有一个 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