【问题标题】:Map predictions back to IDs - Python Scikit Learn DecisionTreeClassifier将预测映射回 ID - Python Scikit Learn DecisionTreeClassifier
【发布时间】:2017-09-18 19:54:41
【问题描述】:

我有一个具有唯一标识符和其他特征的数据集。看起来是这样的

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 .. 现在,我只是将其分成两半并将 CSV 分别加载为训练数据和测试数据。

标签: python scikit-learn classification decision-tree valueerror


【解决方案1】:

不知道您是如何进行拆分的,我建议您确保 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)转换为数字表示。在我看来,对于 sklearn,最好的方法是使用 LabelEncoder。使用它会将分类字符串标签['M', 'S'] 转换为[1, 2],这可以通过DecisionTreeClassifier 实现。如果您需要示例,请查看Passing categorical data to sklearn decision tree

更新

根据您的评论,我现在了解到您需要映射回 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?如果我使用上面的代码使用 trian_test_split 函数拆分数据,我仍然不会在数据集中有 ID,是吗?
  • 假设我在这里运行clf.predict(X_test),我的结果是否与 X_test 具有相同的索引?如果是这样,我可以在索引上合并结果数据帧和 X_test 数据帧,对吗?
  • @Mnu 他们不会分享确切的索引。例如,在我的示例中 X_test 的索引将是 Index(['345-678'], dtype='object', name='ID') 其中 predict 的结果将没有显式索引。但是,顺序仍然是相同的,因此您可以“加入”它们,而不是使用 pandas.DataFrame.join 方法。这样的事情会起作用:X_test['predicted'] = results
  • 在这种情况下,没有必要将 ID 设置为索引,对吗?即使索引不是 ID,我也可以根据行的顺序连接 X_test 数据和预测结果。
  • 另外,当我尝试使用 index = ID 进行 OneHotEncode 时,出现错误:IndexError: arrays used as indices must be of integer (or boolean) type
【解决方案2】:

当您进行转换时,pandas 数据框保持其顺序(创建/删除行的连接/合并除外)。

所以,这里是一步一步的:

  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 df_pred_final = df_test[["id"]] 的“id”列创建 df_pred_final
  5. 将“目标”列添加到df_pred_final。对 id-target 应该正确映射 df_pred_final["target"] = pred

请看一下我的 kaggle 笔记本。你可能明白了。 https://www.kaggle.com/tthien/20210412-complex-drop-c10-c2

【讨论】:

    猜你喜欢
    • 2014-11-30
    • 1970-01-01
    • 2015-03-11
    • 2016-04-01
    • 2019-05-23
    • 2016-12-07
    • 2017-04-23
    • 2016-04-03
    • 2018-01-14
    相关资源
    最近更新 更多