假设我有位置功能。在火车数据集中,它的唯一值是“NewYork”、“Chicago”。但在测试集中,它有“NewYork”、“Chicago”、“London”。那么在创建一种热门编码时如何忽略“伦敦”?换句话说,如何不对只出现在测试集中的类别进行编码?
问问题
3722 次
3 回答
1
通常,您永远不想消除信息。您希望在模型中预先包装此信息。例如,您可能有一些具有 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')
现在,如果有足够多的“正常”类别实例,伦敦将被推入“稀有”类别。无论出现多少新类别,它们都将被归入“稀有”类别;等待它们仍然是罕见的情况,并且不会成为主导类别。
于 2019-05-06T02:37:42.607 回答
0
您可以在一种热编码中使用参数 handle_unknown。
ohe = OneHotEncoder(handle_unknown=‘ignore’)
这不会显示错误并让执行发生。
有关更多信息,请参阅文档 https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.OneHotEncoder.html
于 2020-12-12T18:55:24.323 回答
-1
假设这是你的清单
train_data = ['NewYork', 'Chicago']
test_set = ['NewYork', 'Chicago', 'London']
根据您的问题:
如何不对只出现在测试集中的类别进行编码?
for each in test_set:
if filter(lambda element: each in element, train_data):
print each
这输出NewYork
& Chicago
,这意味着London
被跳过。
于 2017-01-19T05:31:51.060 回答