我有一个具有唯一标识符和其他特征的数据集。看起来像这样
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
最佳答案
不知道您是如何拆分的,我建议您确保 ID
列不包含在您的训练数据中。也许是这样的:
X_train, X_test, y_train, y_test = test_train_split(df.ix[:, ~df.columns.isin(['ID', 'Response'])].values, df.Response)
这将只拆分 DataFrame 中不在 ID
或 Response
中的值作为 X
值,并拆分 Response
用于 y
值。
但是您仍然无法将 DecisionTreeClassifier
用于此数据,因为它包含字符串。您需要将任何包含分类数据的列(即 TypeA
和 TypeB
)转换为数字表示形式。我认为 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
关于python - 将预测映射回 ID - Python Scikit Learn DecisionTreeClassifier,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43549034/