【问题标题】:Using categorical encoding across multiple dataframes in python在 python 中跨多个数据帧使用分类编码
【发布时间】:2023-03-18 06:20:01
【问题描述】:

我有一个带有两个分类列和一个数值列的 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_Train 中的相同 bcat 分类用于 X_Test,以便线性回归将 X_Train 中的“b1”视为与 X_Test 中的“b1”相同的变量?这意味着,如果 X_Test 中有任何 B 值不在 X_Train 中,则应该删除该 B 值,因为没有从该 B 值中学习,因此无法从中进行预测。

【问题讨论】:

  • 您在一个问题中有多个问题,最好将它们分开并为每个子问题创建一个新问题,例如稀疏矩阵部分。
  • 谢谢!但稀疏矩阵部分不是问题。我只是解释了为什么我需要编码。

标签: python scikit-learn linear-regression sparse-matrix categorical-data


【解决方案1】:

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

示例:

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

【讨论】:

  • 谢谢!在我的应用程序中,训练和测试已经分开。为了实现您的解决方案,我可以合并它们,生成分类,然后再次拆分它们。我会试试的。
  • @JafarSadeq,让我知道它是否有效,如果它回答了,请随时投票并接受答案,这将有助于未来的读者并给我几点。快乐编码!
  • 对不起,我还是个菜鸟。是的,它确实解决了它。我接受了答案,但我的选票尚未计算在内。再次感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-15
  • 2018-04-18
  • 2017-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多