假设我具有位置信息功能。在火车数据集中,其唯一值是“NewYork”,“Chicago”。但在测试集中,它具有“NewYork”,“Chicago”,“London”。
因此,在创建一种热编码时,如何忽略“伦敦”呢?
换句话说,如何不对仅出现在测试集中的类别进行编码?
最佳答案
通常,您永远都不想消除信息。 您想在模型中预先包装此信息。例如,您可能有一些具有NaN值的数据:
train_data = ['NewYork', 'Chicago', NaN]
解决方案1
您是否有可能处理此问题,无论您是要插补,删除等,还是要根据问题自行决定。通常,您可以将NaN归为自己的类别,因为这也是信息。这样的事情就足够了:
# function to replace NA in categorical variables
def fill_categorical_na(df, var_list):
X = df.copy()
X[var_list] = df[var_list].fillna('Missing')
return X
# replace missing values with new label: "Missing"
X_train = fill_categorical_na(X_train, vars_with_na)
X_test = fill_categorical_na(X_test, vars_with_na)
因此,当您进入生产环境时,可以编写一个脚本,将看不见的类别插入您先前建立的“缺失”类别。
解决方案2
如果您对这个想法不满意,可以总是将这些异常情况变成一个新的独特类别,我们将其称为“稀有”,因为它并不经常出现。
train_data = ['NewYork', 'Chicago', 'NewYork', 'Chicago', 'London']
# let's capture the categorical variables first
cat_vars = [var for var in X_train.columns if X_train[var].dtype == 'O']
def find_frequent_labels(df, var, rare_perc):
df = df.copy()
tmp = df.groupby(var)['Target_Variable'].count() / len(df)
return tmp[tmp>rare_perc].index
for var in cat_vars:
frequent_ls = find_frequent_labels(X_train, var, 0.01)
X_train[var] = np.where(X_train[var].isin(frequent_ls), X_train[var], 'Rare')
X_test[var] = np.where(X_test[var].isin(frequent_ls), X_test[var], 'Rare')
现在,如果有足够的“正常”类别实例,伦敦将被插入“罕见”类别。不管可能出现多少个新类别,它们都会被归为“稀有”类别。在此之前,它们仍然是罕见的实例,并且不会成为主要类别。