4

我有一个具有唯一标识符和其他功能的数据集。看起来像这样

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
有没有一种方法可以像在 Azure ML Studio 或 SAS 中那样将标识符列分配为 ID 或非预测变量?

我正在使用DecisionTreeClassifier来自 Scikit-Learn 的。这是我用于分类器的代码。

from sklearn import tree

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

如果我只是将 ID 包含在 中traindata,则代码会引发错误:

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

4

2 回答 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 中的值而不是值ID或值,并拆分值。ResponseXResponsey

但是您仍然无法将DecisionTreeClassifier与此数据一起使用,因为它包含字符串。您将需要将任何具有分类数据的列转换TypeATypeB数字表示。在我看来,对于 sklearn,最好的方法是使用LabelEncoder. 使用它会将分类字符串标签['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
于 2017-04-21T21:26:07.007 回答
0

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

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

  1. df_test使用“id”列创建数据框
  2. 创建df_test2没有“id”列 df_test2 = df_test.drop(["id"], axis=1)
  3. 输入df_test2模型进行预测pred = model.predict(df_test2)
  4. df_pred_final从 df_test 的“id”列创建df_pred_final = df_test[["id"]]
  5. 将列“目标”添加到df_pred_final. 对 id-target 应该正确映射df_pred_final["target"] = pred

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

于 2022-01-19T08:06:37.850 回答