如何保留训练数据中的列以在 python 中进行预测

How to retain the columns from training data for prediction in python

我有一个如下所示的数据集:

| Amount   | Source | y |
| -------- | ------ | - |
| 285      | a      | 1 |
| 556      | b      | 0 | 
| 883      | c      | 0 |
| 156      | c      | 1 |
| 374      | a      | 1 |
| 1520     | d      | 0 |

'Source' 是分类变量。此字段中的类别是 'a'、'b'、'c' 和 'd'。因此,一个热编码列是 'source_a'、'source_b'、'source_c' 和 'source_d'。我正在使用这个模型来预测 y 的值。 用于预测的新数据不包含训练中使用的所有类别。它只有类别 'a'、'c' 和 'd'。当我对这个数据集进行热编码时,它缺少列 'source_b'。我如何将此数据转换为看起来像训练数据?

PS:我正在使用 XGBClassifier() 进行预测。

使用相同的编码器实例。假设您选择了 sklearn 的一个热编码器,您所要做的就是将其导出为泡菜,以便稍后在需要时使用它进行推理。

from sklearn.preprocessing import OneHotEncoder
import pickle
# blah blah blah

enc = OneHotEncoder(handle_unknown='ignore')
#assume X_train = the source column
X_train = enc.fit_transform(X_train)
pickle.dump(enc, open('onehot.pickle', 'wb'))

然后加载它进行推理:

import pickle
loaded_enc = pickle.load(open("onehot.pickle", "rb"))

那么你所要做的就是点击:

#X_test is the source column of your test data
X_test = loaded_enc.transform(X_test)

一般来说,在您将编码器安装到 X_train 之后,您所要做的就是简单地转换测试集。所以

X_test = loaded_enc.transform(X_test)

明确写下:

import pandas as pd
import numpy as np

# an example of your dataframe with no "b" source
df = pd.DataFrame({
                    "Amount" : [int(i) for i in np.random.normal(800,300, 10)],
                    "Source" : np.random.choice(["a", "c", "d"], 10),
                    "y"      : np.random.choice([1,0], 10)
                    })
# One Hot Encoding
df["source_a"] = np.where(df.Source == "a",1,0)

df["source_b"] = np.where(df.Source == "b",1,0)

df["source_c"] = np.where(df.Source == "c",1,0)

df["source_d"] = np.where(df.Source == "d",1,0)

数据帧的输出:

   Amount Source  y  source_a  source_b  source_c  source_d
0     685      d  0         0         0         0         1
1    1149      c  1         0         0         1         0
2    1220      a  0         1         0         0         0
3     834      c  0         0         0         1         0
4     780      c  0         0         0         1         0
5     502      a  0         1         0         0         0
6     191      c  1         0         0         1         0
7     637      c  0         0         0         1         0
8     701      d  0         0         0         0         1
9     941      c  1         0         0         1         0

对于一般规则,依赖性必须最小化...