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