问题描述
我有一个包含两个分类列和一个数字列的 DataFrame X_Train,例如:
A | 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)))
A | 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”视为与 X_Test 中的“b1”相同的变量?这意味着,如果 X_Test 中存在任何不在 X_Train 中的 B 值,则应删除该 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