如何使用python处理测试数据集中看不见的分类值?

时间:2017-01-19 04:52:18

标签: python machine-learning feature-extraction categorical-data one-hot-encoding

假设我有位置功能。在列车数据集中,其独特的价值是“纽约”,“芝加哥”。但在测试集中,它有“纽约”,“芝加哥”,“伦敦”等。 因此,在创建一个热门编码时如何忽略'伦敦'? 换句话说,如何不对仅出现在测试集中的类别进行编码?

3 个答案:

答案 0 :(得分:0)

假设这是你的名单

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

答案 1 :(得分:0)

通常您永远不想消除信息。您想在模型中先包装这些信息。例如,您可能有一些具有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')

现在,考虑到“正常”类别的足够实例,伦敦将被推入“罕见”类别。无论可能出现多少个新类别,它们都会被归为“稀有”类别。在未决之前,它们仍然是罕见的实例,不会成为主要类别。

答案 2 :(得分:0)

您可以通过一种热编码方式使用参数handle_unknown。

ohe = OneHotEncoder(handle_unknown=‘ignore’)

这不会显示错误,并且可以执行。

有关更多信息,请参见文档 https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.OneHotEncoder.html