Xav*_*ier 9 python encoding machine-learning scikit-learn categorical-data
我有一个系列,如:
df['ID'] = ['ABC123', 'IDF345', ...]
Run Code Online (Sandbox Code Playgroud)
我正在使用 scikitLabelEncoder将其转换为要输入到RandomForestClassifier.
在培训期间,我的做法如下:
le_id = LabelEncoder()
df['ID'] = le_id.fit_transform(df.ID)
Run Code Online (Sandbox Code Playgroud)
但是,现在为了测试/预测,当我传入新数据时,我想根据le_id即从该数据转换“ID” ,如果存在相同的值,则根据上述标签编码器对其进行转换,否则分配一个新的数字价值。
在测试文件中,我的操作如下:
new_df['ID'] = le_dpid.transform(new_df.ID)
Run Code Online (Sandbox Code Playgroud)
但是,我收到以下错误: ValueError: y contains new labels
我该如何解决??谢谢!
更新:
所以我的任务是使用以下(例如)作为训练数据并预测'High', 'Mod', 'Low'新 BankNum、ID 组合的值。模型应该学习从训练数据集中给出“高”和“低”的特征。例如,当存在多个具有相同 BankNum 和不同 ID 的条目时,会在“High”下方给出。
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
Run Code Online (Sandbox Code Playgroud)
然后根据以下内容对其进行预测:
BankNum | ID |
00982222 | AB999 |
00982222 | AB999 |
00981111 | AB890 |
Run Code Online (Sandbox Code Playgroud)
我正在做这样的事情:
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)
Run Code Online (Sandbox Code Playgroud)
我认为错误消息非常清楚:您的测试数据集包含ID未包含在您的训练数据集中的标签。对于这些项目,LabelEncoder找不到合适的数值来表示。有几种方法可以解决这个问题。您可以尝试平衡数据集,以确保每个标签不仅存在于您的测试中,而且存在于您的训练数据中。否则,您可以尝试遵循此处提出的想法之一。
一种可能的解决方案是,您在开始时搜索数据集,获取所有唯一ID值的LabelEncoder列表,在此列表上训练,并保持其余代码保持当前状态。
另一种可能的解决方案是,检查测试数据是否只有在训练过程中见过的标签。如果有新标签,您必须将其设置为一些后备值unknown_id(或类似的值)。这样做,你把所有新的、未知的IDs 放在一个类中;对于这些项目,预测将失败,但您可以像现在一样使用其余的代码。