0

我有一个具有唯一标识符和其他功能的数据集。它看起来像这样将预测映射回ID - Python Scikit学习DecisionTreeClassifier

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

+0

你是如何让你的火车/测试分裂? – Grr

+0

@Grr ..现在,我把它分成两半,分别加载CSV作为traindata和testdata。 – Minu

回答

1

不知道你是怎样使你的分,我建议只是确保不包括ID列在你的训练数据中。像这样的事情也许:

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

将从数据帧不IDResponseX值仅分裂的价值观,并为y值分割Response

但是您仍然无法将DecisionTreeClassifier与此数据一起使用,因为它包含字符串。您需要将任何列与分类数据(即TypeATypeB)转换为数字表示。在我看来sklearn的最佳做法是使用LabelEncoder。使用这将把分类字符串标签['M', 'S']转换为[1, 2],这可以用DecisionTreeClassifier实现。如果您需要示例,请查看Passing categorical data to sklearn decision tree

更新

根据您的评论我现在明白了,你需要映射回ID。在这种情况下,你可以利用熊猫来获得优势。将ID设置为数据的索引,然后进行拆分,这样您将保留所有火车和测试数据的ID值。假设您的数据已经在熊猫数据框中。

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 
+0

这是如何帮助我将预测映射到ID的?如果我使用上面的代码使用trian_test_split函数分割数据,我仍然不会在数据集中拥有ID,对吗? – Minu

+0

@Minu查看更新的答案 – Grr

+0

可以说我在这里运行'clf.predict(X_test)',我的结果是否与X_test具有相同的索引?如果是这样,我可以在索引上合并结果数据框和X_test数据框,对吗? – Minu