将预测结果映射回ID - Python Scikit Learn DecisionTreeClassifier

5
我有一个数据集,其中包含唯一标识符和其他特征。它看起来像这样:
ID      LenA TypeA LenB TypeB Diff Score Response
123-456  51   M     101  L     50   0.2   0
234-567  46   S     49   S     3    0.9   1
345-678  87   M     70   M     17   0.7   0
我将其分为训练和测试数据。我正在尝试使用在训练数据上训练的分类器将测试数据分类为两类。我想要在训练和测试数据集中有标识符,这样我就可以将预测结果映射回ID。
是否有一种方法可以将标识符列指定为ID或非预测变量,就像我们可以在Azure ML Studio或SAS中做的那样?
我正在使用Scikit-Learn中的DecisionTreeClassifier。这是我用于分类器的代码。
from sklearn import tree

clf = tree.DecisionTreeClassifier()
clf = clf.fit(traindata, trainlabels)

如果我仅仅将ID包含在traindata中,代码会抛出一个错误:

ValueError: invalid literal for float(): 123-456


你是如何进行训练集和测试集的划分的? - Grr
@Grr... 目前,我只是将其分成两半,并单独将CSV文件加载为训练数据和测试数据。 - Minu
2个回答

6

不知道您如何进行分割,建议确保在训练数据中不包括ID列。可能可以像这样:

X_train, X_test, y_train, y_test = test_train_split(df.ix[:, ~df.columns.isin(['ID', 'Response'])].values, df.Response)

这将仅从DataFrame中不包含IDResponse的值中拆分X值,并拆分Response以获取y值。

但您仍然无法使用DecisionTreeClassifier来处理此数据,因为它包含字符串。您需要将任何具有分类数据的列(即TypeATypeB)转换为数字表示。在我看来,使用LabelEncoder是使用sklearn的最佳方法。使用它将把分类字符串标签['M','S']转换为[1,2],可以与DecisionTreeClassifier一起实现。如果您需要一个示例,请查看将分类数据传递给sklearn决策树

更新

根据您的评论,我现在理解您需要映射回ID。在这种情况下,您可以利用pandas。将ID设置为数据的索引,然后进行拆分,这样您就可以保留所有训练和测试数据的ID值。假设您的数据已经在一个pandas数据帧中。
df = df.set_index('ID')
X_train, X_test, y_train, y_test = test_train_split(df.ix[:, ~df.columns.isin(['Response'])], df.Response)
print(X_train)
         LenA TypeA  LenB TypeB  Diff  Score
ID
345-678    87     M    70     M    17    0.7
234-567    46     S    49     S     3    0.9

那怎么能帮我将预测结果映射到ID上呢?如果我使用上述代码使用train_test_split函数来拆分数据,数据集中仍然没有ID,对吧? - Minu
假设我在这里运行 clf.predict(X_test),那么我的结果会和 X_test 具有相同的索引吗?如果是这样的话,我可以按照索引将结果数据框和 X_test 数据框合并,对吗? - Minu
@Minu 他们不会分享确切的索引。例如,我的示例中X_test的索引将是Index(['345-678'], dtype='object', name='ID'),而predict的结果将没有明确的索引。但是,顺序仍然是相同的,因此您可以“连接”它们,只是不能使用pandas.DataFrame.join方法。类似这样的东西会起作用:X_test['predicted'] = results - Grr
在这种情况下,没有必要将ID设置为索引,对吧?我可以根据行的顺序连接X_test数据和预测结果,即使没有索引作为ID。 - Minu
另外,当我尝试使用索引= ID进行OneHot编码时,出现错误:IndexError:数组用作索引必须是整数(或布尔)类型 - Minu
您没有理解这个问题。这个问题是关于如何将预测结果与 ID 合并,而不是通过 ID 分割数据集。(例如,某些用例:要提交到 Kaggle,您的提交是 ID-预测对)。 - Haha TTpro

0

pandas dataframe在进行转换时保持其顺序(除了创建/删除行的join/merge)。

因此,以下是逐步操作:

  1. 使用'id'列创建'df_test'数据框
  2. 创建不包含'id'列的'df_test2' df_test2 = df_test.drop(["id"], axis=1)
  3. 将'df_test2'输入模型进行预测 pred = model.predict(df_test2)
  4. 从df_test的'id'列创建'df_pred_final' df_pred_final = df_test[["id"]]
  5. 将'target'列添加到'df_pred_final'。id-target对应关系应正确映射 df_pred_final["target"] = pred

请查看我的kaggle笔记本。您可能会有所启发。 https://www.kaggle.com/tthien/20210412-complex-drop-c10-c2


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接