Чому я отримую дерево рішень на 100% точності?


38

Я отримую 100% точність для свого дерева рішень. Що я роблю неправильно?

Це мій код:

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
Чому ти вважаєш, що робиш щось не так? Можливо, ваші дані такі, що ви зможете досягти ідеальної
класифікації

64
Між іншим, +1 за цікавість, чи не так зі 100% точністю. Занадто багато людей просто думають, що їхня модель чудова ...
С. Коласа - Відновлення Моніки

1
У R є пакет (карета) для автоматичного поділу набору даних на дві групи: одна для тренувальних даних, а друга для тестування даних. Я називаю процес як розділ даних. Я вважаю, що в Python є подібний пакет для досягнення розділу даних.
Анастасія-Романова 秀

Корисне фонове читання: Загальні підводні камені в ML
smci

3
@ Анастасія-Романова 秀 Насправді кожна серйозна бібліотека ML містить цю функціональність, включаючи та, яку використовує ОП (ОП навіть імпортував відповідну функціональність, і просто не використовував її чомусь).
Конрад Рудольф

Відповіді:


79

Ваш тестовий зразок - це підмножина вашого навчального зразка:

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]

2
Було б краще використовувати, sklearn.model_selection.train_test_splitяк пропонує Хуан Ігнасіо Гіл, оскільки це також переміщує набори і уникає занепокоєнь, якщо набір даних не випадковий при впорядкуванні. Це також зрозуміліше, оскільки він демонструє наміри та автоматично обробляє зміни розміру набору даних.
Джек Едлі

1
@JackAidley: Я згоден (і підтримав відповідь Хуана кілька днів тому). Ще краще було б зробити розбиття детермінованим для налагодження, встановивши насіння випадкових чисел .
S. Kolassa - Відновіть Моніку

@StephanKolassa Привіт, я налаштовувався на набір даних Iris, і після використання GridSearchCVданих тренувань для точності тестування я отримую 100% KNeighborsClassifier. Я використовував test_train_splitдля поділу набору даних. Що я міг зробити тут неправильно?
Сндн

19

Ви отримуєте 100% точність, оскільки використовуєте частину навчальних даних для тестування. На час навчання дерево рішень отримало знання про ці дані, і тепер, якщо ви дасте ті самі дані, щоб передбачити, воно надасть абсолютно однакове значення. Тому дерево рішень щоразу дає правильні результати.

Для будь-якої проблеми машинного навчання слід розділити набір даних для навчання та тестів. Точність моделі можна визначити лише тоді, коли ми вивчимо, як вона прогнозується для невідомих значень.


17

Як вам сказали інші користувачі, ви використовуєте в якості тестового набору підмножину набору поїздів, і дерево рішень дуже схильне до накладання.

У вас це було майже при імпорті

from sklearn.cross_validation import train_test_split

Але тоді ви не використовуєте цю функцію. Ви повинні були зробити:

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

отримати випадкові набори поїздів і тестів


2

Як вказували @Stephan Kolassa та @Sanjay Chandlekar, це пов’язано з тим, що ваш тестовий зразок є підмножиною вашого навчального зразка.

Однак для відбору цих зразків більш доречним буде вибіркове вибіркове забезпечення, щоб обидва зразки були репрезентативними. Залежно від вашої структури даних, ви також можете розглянути стратифіковану випадкову вибірку.

Я не вільно володію Python, але будь-яке статистичне програмне забезпечення повинно дозволяти вибіркові вибірки; деякі підказки також доступні для SO .


0

Просто хочете прислухатися до інтуїції, чому вам потрібно чітко розділити навчальні та тестові зразки.

ннн-1н=2

Це називається надмірним розміщенням, оскільки цей процес розщеплення навряд чи може передбачити точки даних, які мають відношення до вашої проблеми, але яких ви ще не спостерігали .

Звичайно, весь сенс побудови цих платформ прогнозування полягає у створенні інструментів, які можна застосувати до ніколи не бачених даних; розбиття даних, які ми маємо, на навчальні та тестові зразки - це спроба моделювати це самозасліплювальне та відштовхувати наші моделі від переоснащення вищевказаним способом.


0

Вам не потрібна 100% точність, щоб отримати надмірну обробку. Маючи достатньо відра, ви можете отримати невідтворювані результати (те, що виглядало б жахливо поза вибіркою).

Дивіться цю витягнуту статтю з Lancet, де описаний спосіб подрібнення проби у відра, які занадто тонкі. Статистична сітка Мюнхаузена Це також основа для мультфільму XKCD Значне значення

Досягнення 100% точності - це лише короткий крок від пошуку класифікатора, який працює оманливо добре.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.