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

Min*_*inu 3 python classification decision-tree scikit-learn valueerror

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

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
Run Code Online (Sandbox Code Playgroud)

我把它分成训练和测试数据。我试图从训练数据训练的分类器中将测试数据分为两类。我想要训练和测试数据集中的标识符,以便我可以将预测映射回 IDs
有没有一种方法可以像我们在 Azure ML Studio 或 SAS 中所做的那样,将标识符列分配为 ID 或非预测变量?

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

from sklearn import tree

clf = tree.DecisionTreeClassifier()
clf = clf.fit(traindata, trainlabels)
Run Code Online (Sandbox Code Playgroud)

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

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

Grr*_*Grr 7

不知道您是如何进行拆分的,我建议您确保该ID列不包含在您的训练数据中。可能是这样的:

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

这将仅拆分来自 DataFrame的值,而不是在值中ID或值中,并为值拆分。ResponseXResponsey

但是您仍然无法将 用于DecisionTreeClassifier此数据,因为它包含字符串。您需要将具有分类数据的任何列(即TypeA和 )TypeB转换为数字表示形式。在我看来,对 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
Run Code Online (Sandbox Code Playgroud)