微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决在python中跨多个数据帧使用分类编码

我有一个包含两个分类列和一个数字列的 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)))

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。