題:
為什麼我會得到100%精度的決策樹?
Nadjla
2018-03-22 16:54:20 UTC
view on stackexchange narkive permalink

我的決策樹準確性達到100%。我在做什麼錯了?

這是我的代碼:

 將pandas導入為pd
導入json
將numpy導入為np
導入sklearn
導入matplotlib.pyplot作為plt


數據= np.loadtxt(“ / Users / Nadjla / Downloads / allInteractionsnum.csv”,delimiter =',')


x =數據[0:14]
y =數據[-1]


從sklearn.cross_validation導入train_test_split

x_train = x [0:2635]
x_test = x [0:658]
y_train = y [0:2635]
y_test = y [0:658]


從sklearn.tree導入DecisionTreeClassifier
樹= DecisionTreeClassifier()
tree.fit(x_train.astype(int),y_train.astype(int))


從sklearn.metrics導入precision_score

y_predicted = tree.predict(x_test.astype(int))
precision_score(y_test.astype(int),y_predicted)
 
您為什麼認為自己做錯了什麼?也許您的數據可以使您獲得完美的分類...
順便說一句,+ 1表示您是否以100%的準確性懷疑是否有問題。太多的人會認為他們的模型很棒。
在R中,有一個程序包(脫字符號)可以將數據集自動分為兩組,一組用於訓練數據,另一組用於測試數據。我稱該過程為數據分區。我相信Python中也有類似的軟件包來實現數據分區。
有用的背景閱讀:[ML中的常見陷阱](http://danielnee.com/2015/01/common-pitfalls-in-machine-learning/)
@Anastasiya-Romanova秀幾乎每個嚴肅的ML庫都包含此功能,[包括OP使用的功能](http://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html)(OP甚至導入了相關功能,只是出於某種原因未使用它)。
啊,您說得對@KonradRudolph。正如Juan Ignacio Gil指出的那樣,OP並未使用函數“ train_test_split”進行隨機採樣。事實證明,在R中,您不必使用特殊的程序包即可拆分數據,只需使用“ sample”函數即可。
六 答案:
Stephan Kolassa
2018-03-22 17:02:10 UTC
view on stackexchange narkive permalink

您的測試樣本是培訓樣本的子集

  x_train = x [0:2635]
x_test = x [0:658]
y_train = y [0:2635]
y_test = y [0:658]
 

這意味著您需要在一部分訓練數據上評估模型,即您正在進行樣本內評估。眾所周知,樣本內準確性是衡量樣本外準確性的較差指標,而最大化樣本內準確性可能會導致過度擬合。因此,應該始終在完全獨立於訓練數據的真實保持樣本上評估模型。

確保您的培訓和測試數據不相交,例如

  x_train = x [659:2635]
x_test = x [0:658]
y_train = y [659:2635]
y_test = y [0:658]
 
最好像Juan Ignacio Gil所建議的那樣使用sklearn.model_selection.train_test_split,因為這也可以洗淨集合併避免擔心數據集在排序方面是否是非隨機的。它也更清晰,因為它顯示了意圖,並自動處理數據集大小的更改。
我同意@JackAidley:(幾天前贊成[Juan的回答](https://stats.stackexchange.com/a/336269/1352))。更好的辦法是通過[設置隨機數種子](https://stackoverflow.com/q/11526975/452096)使拆分具有確定性,以便進行調試。
@StephanKolassa嗨,我一直在調整Iris數據集,並且在對訓練數據使用了“ GridSearchCV”之後,為了測試準確性,我使用“ KNeighborsClassifier”得到了100%。我已經用`test_train_split`來分割數據集。我在這裡可能做錯了什麼?
Sanjay Chandlekar
2018-03-22 17:02:17 UTC
view on stackexchange narkive permalink

由於使用一部分訓練數據進行測試,因此您獲得了100%的準確性。在訓練時,決策樹獲得了有關該數據的知識,現在,如果您提供相同的數據進行預測,它將獲得完全相同的價值。這就是為什麼決策樹每次都能產生正確結果的原因。

對於任何機器學習問題,應將訓練和測試數據集分開。只有當我們檢查模型如何預測未知值時,才能確定模型的準確性。

Juan Ignacio Gil
2018-03-23 16:17:19 UTC
view on stackexchange narkive permalink

正如其他用戶告訴您的那樣,您正在使用訓練集的子集作為測試集,並且決策樹非常容易過擬合。

導入時幾乎就擁有了

來自sklearn.cross_validation的
 導入train_test_split
 

但是您不使用該功能。您應該已經完成:

  x_train,x_test,y_train,y_test = train_test_split(x,y,test_size = 0.33)
 

獲得隨機訓練和測試集

nghauran
2018-03-23 14:45:24 UTC
view on stackexchange narkive permalink

@Stephan Kolassa和@Sanjay Chandlekar指出,這是因為您的測試樣本是訓練樣本的一部分。

但是,對於選擇那些樣本,隨機抽樣將更適合確保兩個樣本都具有代表性。根據您的數據結構,您可能還會考慮分層隨機抽樣。

我不太懂Python,但任何統計軟件都應允許隨機抽樣;在 SO上也有一些提示。

MichaelChirico
2018-03-26 09:35:09 UTC
view on stackexchange narkive permalink

只是想了解直覺的原因,為什麼需要顯式拆分訓練和測試樣本。

如果您有$ n $個觀測值並對數據進行$ n $(實際上是$ n-1 $,甚至可能少得多)的拆分,則可以對每個點進行完美分類(如果尚不清楚,請寫列舉一些小例子,例如$ n = 2 $,並讓自己相信這一點。)

之所以稱為過擬合,是因為這種拆分過程非常不可能()來預測與您的問題相關但尚未觀察到的數據點。/ p>

當然,構建這些預測平台的全部目的是創建可應用於從未見過的數據的工具;將我們擁有的數據分為訓練樣本和測試樣本的嘗試是為了模擬這種自致盲現象,並防止我們的模型以上述方式過度擬合。

NBF
2018-07-30 20:30:18 UTC
view on stackexchange narkive permalink

您不需要100%的精度就可以過度擬合。有了足夠的存儲桶,您將獲得無法再現的結果(看起來超出樣本的情況太糟糕了。)

請參閱《柳葉刀》(Lancet)上的節錄文章,其中介紹了將樣品切碎到太細的桶中的方法。 蒙克豪森的統計表格 這也是XKCD卡通重要

的基礎

要實現100%的準確度,離尋找效果良好的分類器僅一步之遙。



該問答將自動從英語翻譯而來。原始內容可在stackexchange上找到,我們感謝它分發的cc by-sa 3.0許可。
Loading...