Neden% 100 doğrulukta karar ağacı alıyorum?


38

Karar ağacım için% 100 doğruluk elde ediyorum. Neyi yanlış yapıyorum?

Bu benim kodum:

import pandas as pd
import json
import numpy as np
import sklearn
import matplotlib.pyplot as plt


data = np.loadtxt("/Users/Nadjla/Downloads/allInteractionsnum.csv", delimiter=',')


x = data[0:14]
y = data[-1]


from sklearn.cross_validation import train_test_split

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


from sklearn.tree import DecisionTreeClassifier
tree = DecisionTreeClassifier()
tree.fit(x_train.astype(int), y_train.astype(int))


from sklearn.metrics import accuracy_score

y_predicted = tree.predict(x_test.astype(int))
accuracy_score(y_test.astype(int), y_predicted)

4
Neden yanlış bir şey yaptığını düşünüyorsun? Belki veri ... size mükemmel SINIFLANDIRMA elde edebilirsiniz şekildedir
Knarpie

64
Bu arada, bir şey% 100 doğrulukla yanlış olup olmadığını merak için +1. Çok fazla sayıda insan sadece onların modeli ... harika düşünürdüm
S. Kolassa - Eski Monica

1
R'de, bir veri setini otomatik olarak, biri eğitim verisi için diğeri veri testi için iki gruba ayırmak için bir paket (şapka) bulunur. Süreci veri bölümü olarak adlandırıyorum. Python'da da bir veri bölümü elde etmek için benzer bir paket olduğuna inanıyorum.
Anastasiya-Romanova

Yararlı arka plan okuma:
ML'deki

3
@ Anastasiya-Romanova 秀 Hemen hemen her ciddi ML kütüphanesi, OP tarafından kullanılanlar da dahil olmak üzere, bu işlevselliği içerir (OP, ilgili işlevselliği bile ithal etti ve bir nedenden dolayı kullanmadı).
Konrad Rudolph

Yanıtlar:


79

Test örneğiniz, eğitim örneğinizin bir alt kümesidir :

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

Bu, modelinizi eğitim verilerinizin bir parçası üzerinde değerlendiriyorsunuz, yani örnek bir değerlendirme yapıyorsunuz demektir. Numune içi doğruluk, numune dışı doğruluğun bilinmeyen derecede zayıf bir göstergesidir ve numune içi doğruluğun en üst düzeye çıkarılması aşırı sarmaya neden olabilir. Bu nedenle, bir model her zaman eğitim verilerinden tamamen bağımsız olan gerçek bir holdout örneği üzerinde değerlendirilmelidir.

Eğitiminizin ve test verilerinizin ayrık olmadığından emin olun, örneğin,

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

2
sklearn.model_selection.train_test_splitJuan Ignacio Gil'in önerdiği gibi kullanmak daha iyi olacaktır , çünkü bu aynı zamanda kümeleri karıştırır ve veri kümesinin sıralamada rastgele olmaması durumunda endişeleri önler. Niyeti gösterdiği için daha açıktır ve veri kümesi boyutundaki değişiklikleri otomatik olarak işler.
Jack Aidley

1
@ JackAidley: Katılıyorum (ve birkaç gün önce Juan'ın cevabını değiştirdim ). Daha da iyisi , rasgele sayı tohumunu ayarlayarak bölünmüş hata ayıklama için deterministik yapmak olacaktır .
S. Kolassa - Monica,

@StephanKolassa Merhaba, Iris veri setiyle ince ayar yaptım ve GridSearchCVeğitim verileriyle kullandıktan sonra , test doğruluğunu sağlamak için% 100 ile alıyorum KNeighborsClassifier. test_train_splitVeri kümesini bölmek için kullandım . Burada ne yanlış yapabilirdim?
Sndn

19

% 100 doğruluk elde ediyorsunuz çünkü test için eğitim verilerinin bir bölümünü kullanıyorsunuz. Eğitim zamanında, karar ağacı bu veriler hakkında bilgi edindi ve şimdi tahmin etmek için aynı verileri verirseniz, tam olarak aynı değeri verecektir. Bu yüzden karar ağacı her zaman doğru sonuçlar veriyor.

Herhangi bir makine öğrenmesi problemi için, eğitim ve test veri seti birbirinden ayrılmalıdır. Modelin doğruluğu ancak bilinmeyen değerler için nasıl tahmin ettiğini incelediğimizde belirlenebilir.


17

Diğer kullanıcıların da söylediği gibi, test seti olarak, tren setinin bir alt kümesini kullanıyorsunuz ve bir karar ağacı çok fazla takılmaya yatkın.

Neredeyse içe aktarırken alıyordun

from sklearn.cross_validation import train_test_split

Fakat o zaman işlevi kullanmazsınız. Yapmalıydın:

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

rastgele tren ve test setleri almak


2

@Stephan Kolassa ve @Sanjay Chandlekar'ın belirttiği gibi, bunun nedeni test numunesinin eğitim numaranızın bir alt kümesi olması.

Bununla birlikte, bu örneklerin seçimi için, her iki örneğin da temsili olduğundan emin olmak için rastgele örnekleme daha uygun olacaktır. Veri yapınıza bağlı olarak, tabakalı rasgele örneklemeyi de düşünebilirsiniz.

Python'da akıcı değilim ama herhangi bir istatistiksel yazılım rastgele örneklemeye izin vermelidir; Bazı ipuçları üzerinde de mevcuttur SO .


0

Eğitimi neden bölüştürmeniz ve örnekleri açık bir şekilde test etmeniz gerektiğine dair sezgilerinize kulak verin.

nnn1n=2

Buna fazladan donanım denir, çünkü bu bölme işleminde, sorununuzla ilgili olan ancak henüz gözlemlememiş olduğunuz veri noktalarının öngörüsü olma olasılığı çok düşüktür .

Tabii ki bu tahmin platformlarını inşa etmenin amacı, daha önce hiç görülmemiş verilere uygulanabilecek araçlar oluşturmak; Elimizdeki verileri eğitim ve test örneklerine bölmek, bu kendi kendini körleştirmeyi simüle etme girişimidir ve modellerimizi yukarıdaki şekilde abartmaktan alıkoymaktır.


0

Fazla takılmak için% 100 doğruluk gerekmez. Yeterince kova ile tekrarlanamayan sonuçlar elde edebilirsiniz (örnek dışı korkunç görünen bir şey).

Lancet'in bu alıntı makalesine bakın, bir örneği çok fazla iyi olan kovalara doğrama yöntemini açıkladı. Munchausen İstatistiksel Izgara Ayrıca XKCD karikatür temelidir önemli

% 100 doğruluk elde etmek, aldatıcı bir şekilde çalışan bir sınıflandırıcı bulmaktan sadece kısa bir adımdır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.