Почему я получаю дерево решений со 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)
Nadjla
источник
4
Почему вы думаете, что делаете что-то не так? Возможно, ваши данные таковы, что вы можете достичь идеальной
классификации
64
Кстати, +1 за вопрос, что-то не так со 100% точностью. Слишком много людей будут думать, что их модель великолепна ...
С. Коласса - Восстановить Монику
1
В R есть пакет (каретка) для автоматического разделения набора данных на две группы: одна для обучающих данных, а другая для тестирования данных. Я называю процесс разделом данных. Я считаю, что в Python есть аналогичный пакет для разделения данных.
Анастасия-Романова
Полезное справочное чтение: общие ловушки в ML
smci
3
@ Anastasiya-Romanova 秀 Практически каждая серьезная библиотека ML содержит эту функцию, включая ту, которая используется OP (OP даже импортировала соответствующую функциональность, и по какой-то причине просто не использовала ее).
Конрад Рудольф

Ответы:

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: я согласен (и проголосовал за ответ Хуана несколько дней назад). Еще лучше было бы сделать разделение детерминированным для отладки, установив начальное число случайных чисел .
С. Коласса - Восстановить Монику
@StephanKolassa Привет, я настраивал набор данных Iris, и после использования GridSearchCVс данными тренировок, для точности тестирования я получаю 100% KNeighborsClassifier. Я использовал test_train_splitдля разделения набора данных. Что я мог сделать не так здесь?
Sndn
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 .

nghauran
источник
0

Просто хочу вмешаться в интуицию о том, почему вам нужно явно разделить обучение и тестировать образцы.

NNN-1Nзнак равно2

Это называется переоснащением, потому что этот процесс разделения крайне маловероятен для прогнозирования точек данных, которые имеют отношение к вашей проблеме, но которые вы еще не наблюдали .

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

MichaelChirico
источник
0

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

Смотрите эту выдержку из ланцета, описывающую метод нарезки образца на ведра, которые слишком хороши. Мюнхгаузен Статистическая Сетки Она также является основой для XKCD мультфильма Значимого

Достижение 100% точности - это всего лишь короткий шаг от поиска классификатора, который работает обманчиво хорошо.

НСБ
источник