【问题标题】:Label encoding with possible unseen data带有可能看不见的数据的标签编码
【发布时间】:2020-10-13 09:06:16
【问题描述】:

我有一个包含多个需要标签编码的列的数据框。 问题是测试组将来可能包含看不见的数据(类)。 我希望将这些类标记为它们自己的组,以便在我预测新数据集时代码不会崩溃。

我尝试使用 sklearn labelencoder 但收到了。

ValueError: y contains previously unseen labels: 'rat'

我还需要可重复使用的编码器,这意味着我将能够使用相同的值对未来的数据集进行编码。

有没有办法做到这一点?

【问题讨论】:

标签: python machine-learning xgboost


【解决方案1】:

我稍微更新了Sayan Dey'sidea:

第1步:对标签编码器中存在的类进行标签编码。 第2步:拟合标签编码器,然后将所有不在编码器中的测试类设置为-1。

i='browser'
le = LabelEncoder()
train[i] = le.fit_transform(train[i])
#Set classes in test which don't exist in the encoder to -1
test.loc[~test[i].isin(le.classes_),i] = -1    
#Encode classes that exist in the encoder
test.loc[test[i].isin(le.classes_),i] = le.transform(test[i][test[i].isin(le.classes_)])

【讨论】:

  • 如果您的数据框中没有-1,那么这很好。
  • 正确!还需要对编码器类进行编码,然后才进行编码,否则一切都可能得到-1。我对代码进行了更改。
【解决方案2】:

我多次遇到同样的困难。

我的解决方法有点贵

le=LabelEncoder()
le.fit(trainDf)

le.classes_=np.array([-99999] + le.classes_.tolist())
testDf[~testDf.isin(le.classes_)]=-99999 #anything that is not used in your dataframe and the same datatype (here int64)

le.transform(testDf)

【讨论】:

  • 仍然收到错误消息。这是我使用的代码: for i in cat_feats: print(i) le = LabelEncoder() le.fit_transform(train[i]) le.classes_ = np.array([np.nan]+ le.classes_.tolist() ) test.loc[~test[i].isin(le.classes_),i] = np.nan le.transform(test[i]) 获取 ValueError: y contains previous unseen labels: nan
  • 我的错,np.nan没有被识别,现在尝试-99999,检查编辑。
【解决方案3】:

可以用 scikit-learn 解决的是使用类 OneHotEncoder 和参数 handle_unknown='ignore'

from sklearn.preprocessing import OneHotEncoder

encoder = OneHotEncoder(handle_unknown='ignore')
encoder.fit(train)

encoder.transform(train)

【讨论】:

  • 谢谢,但我宁愿不使用 onehot 编码
猜你喜欢
  • 2021-07-30
  • 1970-01-01
  • 1970-01-01
  • 2021-05-27
  • 1970-01-01
  • 2019-02-21
  • 2018-04-04
  • 2021-02-21
  • 1970-01-01
相关资源
最近更新 更多