获取ValueError:使用scikit Learn的LabelEncoder时y包含新标签
machine-learning
python
scikit-learn
9
0

我有一个类似的系列:

df['ID'] = ['ABC123', 'IDF345', ...]

我正在使用scikit的LabelEncoder将其转换为数值,以将其输入到RandomForestClassifier

在培训期间,我的工作如下:

le_id = LabelEncoder()
df['ID'] = le_id.fit_transform(df.ID) 

但是,现在为了进行测试/预测,当我传入新数据时,我想基于le_id从此数据中转换“ ID”,即,如果存在相同的值,则根据上述标签编码器对其进行转换,否则分配一个新的数值。

在测试文件中,我正在执行以下操作:

new_df['ID'] = le_dpid.transform(new_df.ID)

但是,我收到以下错误: ValueError: y contains new labels

我该如何解决??谢谢!

更新:

因此,我要做的任务是使用下面的示例数据作为训练数据,并为新的BankNum ID组合预测'High', 'Mod', 'Low'值。该模型应从训练数据集中学习给出“高”,给出“低”的特征。例如,当存在多个具有相同BankNum和不同ID的条目时,将在“高”下方给出。

df = 

BankNum   | ID    | Labels

0098-7772 | AB123 | High
0098-7772 | ED245 | High
0098-7772 | ED343 | High
0870-7771 | ED200 | Mod
0870-7771 | ED100 | Mod
0098-2123 | GH564 | Low

然后根据以下内容进行预测:

BankNum   |  ID | 

00982222  | AB999 | 
00982222  | AB999 |
00981111  | AB890 |

我正在做这样的事情:

df['BankNum'] = df.BankNum.astype(np.float128)

    le_id = LabelEncoder()
    df['ID'] = le_id.fit_transform(df.ID)

X_train, X_test, y_train, y_test = train_test_split(df[['BankNum', 'ID'], df.Labels, test_size=0.25, random_state=42)
    clf = RandomForestClassifier(random_state=42, n_estimators=140)
    clf.fit(X_train, y_train)
参考资料:
Stack Overflow
收藏
评论
共 2 个回答
高赞 时间 活跃

您可以尝试使用“ sklearn.LabelEncoder,具有从未见过的值”解决方案https://stackoverflow.com/a/48169252/9043549事情是用字典创建类,而不是映射列,并用一些“已知值”填充新类

from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
suf="_le"
col="a"
df[col+suf] = le.fit_transform(df[col])
dic = dict(zip(le.classes_, le.transform(le.classes_)))
col='b'
df[col+suf]=df[col].map(dic).fillna(dic["c"]).astype(int) 
收藏
评论

我认为错误消息非常清楚:您的测试数据集包含ID标签,这些ID标签尚未包含在您的训练数据集中。对于此项目, LabelEncoder无法找到合适的数值来表示。有几种方法可以解决此问题。您可以尝试平衡数据集,以确保每个标签不仅出现在测试中,而且出现在训练数据中。否则,您可以尝试遵循此处介绍的想法之一。

一种可能的解决方案是, LabelEncoder开始搜索数据集,获取所有唯一ID值的列表,在此列表上训练LabelEncoder ,并保留其余代码。

另一种可能的解决方案是,检查测试数据是否只有在训练过程中看到的标签。如果有一个新标签,则必须将其设置为某个后备值,例如unknown_id (或类似的东西)。这样,您将所有新的未知ID放在一个类中。对于此项目,预测将失败,但是您可以像现在一样使用其余代码。

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号