100% точность классификатора при перетасовке строк данных - PullRequest
1 голос
/ 28 января 2020

Я работаю над набором данных по классификации грибов (находится здесь: https://www.kaggle.com/uciml/mushroom-classification)

Я провел некоторую предварительную обработку данных (удалены избыточные атрибуты, изменено категориальные данные в числовые), и я пытаюсь использовать мои данные для обучения классификаторов.

Всякий раз, когда я перетасовываю свои данные, либо вручную, либо с помощью train_test_split, все модели, которые я использую (XGB, MLP, LinearSV C, Decision Tree) имеют 100% точность. Всякий раз, когда я тестирую модели на данных без перемешивания, точность составляет около 50-85%.

Вот мои методы разделения данных:

x = testing.copy()
x_train, x_test, y_train, y_test = train_test_split(x,y, test_size=0.3, shuffle=True)

и вручную

x = testing.copy()
x = x.sample(frac=1)

testRatio = 0.3
testCount = int(len(x)*testRatio)

x_train = x[testCount:]
x_test = x[0:testCount]
y_train = y[testCount:]
y_test = y[0:testCount]

Есть ли что-то, что я делаю совершенно неправильно и отсутствует?

Редактировать: Единственное отличие, которое я вижу при разделении данных с перемешиванием строк и без них, - это распределение классов .

Без перемешивания:

x_train, x_test, y_train, y_test = train_test_split(x,y, test_size=0.3, shuffle=False)

print(y_test.value_counts())
print(y_train.value_counts())

Результатов:

0    1828
1     610
Name: class, dtype: int64
1    3598
0    2088
Name: class, dtype: int64

Во время перемешивания:

x_train, x_test, y_train, y_test = train_test_split(x,y, test_size=0.3, shuffle=True)

print(y_test.value_counts())
print(y_train.value_counts())

Результатов:

0    1238
1    1200
Name: class, dtype: int64
1    3008
0    2678
Name: class, dtype: int64

Я не понимаю, как это сильно повлияет на точность модели.

Edit2: Следуя советам PV8, я попытался проверить свои результаты, используя перекрестная проверка, и, похоже, все в порядке, поэтому я получаю гораздо более разумные результаты.

model = LinearSVC()
scores = cross_val_score(model,x,y,cv=5)
print(scores)
print("Accuracy: %0.2f (+/- %0.2f)" % (scores.mean(), scores.std() * 2))

Вывод:

[1.         1.         1.         1.         0.75246305]
Accuracy: 0.95 (+/- 0.20)

1 Ответ

1 голос
/ 28 января 2020

Это может быть нормальным поведением, сколько перемешиваний вы пробовали?

Это указывает на то, что ваши данные весьма нестабильны по отношению к тому, как вы их разбили. Я надеюсь, что вы измерили точность теста, а не поезда?

Я бы предложил вам использовать перекрестную проверку , это поможет вам проверить ваши общие результаты.

...