#python #algorithm #pandas #machine-learning #scikit-learn
#python #алгоритм #pandas #машинное обучение #scikit-учиться
Вопрос:
в настоящее время я пытаюсь понять, как работают алгоритмы машинного обучения, и одна вещь, которую я действительно не понимаю, — это очевидная разница между вычисленной точностью предсказанных меток и матрицей визуальной путаницы. Я постараюсь объяснить как можно более ясно.
Вот фрагмент набора данных (здесь вы можете увидеть 9 образцов (около 4k в реальном наборе данных), 6 объектов и 9 меток (которые обозначают не числа, а некоторые значения и не могут быть сопоставлены как 7 > 4 > 1)):
f1 f2 f3 f4 f5 f6 label
89.18 0.412 9.1 24.17 2.4 1 1
90.1 0.519 14.3 16.555 3.2 1 2
83.42 0.537 13.3 14.93 3.4 1 3
64.82 0.68 9.1 8.97 4.5 2 4
34.53 0.703 4.9 8.22 3.5 2 5
87.19 1.045 4.7 5.32 5.4 2 6
43.23 0.699 14.9 12.375 4.0 2 7
43.29 0.702 7.3 6.705 4.0 2 8
20.498 1.505 1.321 6.4785 3.8 2 9
Ради любопытства я попробовал ряд алгоритмов (линейный, гауссовский, SVM (SVC, SVR), байесовский и т.д.). Насколько я понял руководство, в моем случае лучше работать с классификаторами (дискретными), а не с регрессией (непрерывной). Используя общие:
model.fit(X_train, y_train)
model.score(X_test, y_test)
Я получил:
Lin_Reg: 0.855793988736
Log_Reg: 0.463251670379
DTC: 0.400890868597
KNC: 0.41425389755
LDA: 0.550111358575
Gaus_NB: 0.391982182628
Bay_Rid: 0.855698151574
SVC: 0.483296213808
SVR: 0.647914795849
Непрерывные алгоритмы дали лучшие результаты. Когда я использовал матрицу путаницы для байесовского хребта (пришлось преобразовать float в целые числа), чтобы проверить ее результат, я получил следующее:
Pred l1 l2 l3 l4 l5 l6 l7 l8 l9
True
l1 23, 66, 0, 0, 0, 0, 0, 0, 0
l2 31, 57 1, 0, 0, 0, 0, 0, 0
l3 13, 85, 19 0, 0, 0, 0, 0, 0
l4 0, 0, 0, 0 1, 6, 0, 0, 0
l5 0, 0, 0, 4, 8 7, 0, 0, 0
l6 0, 0, 0, 1, 27, 36 7, 0, 0
l7 0, 0, 0, 0, 2, 15, 0 0, 0
l8 0, 0, 0, 1, 1, 30, 8, 0 0
l9 0, 0, 0, 1, 0, 9, 1, 0, 0
Что дало мне понимание того, что точность 85% неверна.
Как это можно объяснить? Это из-за преобразования float / int?
Был бы благодарен за любой прямой ответ / ссылку и т.д.
Комментарии:
1. Как именно вы вычисляли точность? Что-то вроде
sklearn.metrics.accuracy_score(y_test, model.predict(X_test))
?2. Если вы вручную сравните результаты
model.predict()
со своими метками, подсчитав, сколько записей равно, вы должны получить представление о том, является ли вычисленная точность или матрица путаницы неправильной. (или если оба отключены)
Ответ №1:
Вы смешиваете здесь две очень разные концепции машинного обучения: регрессию и классификацию. Регрессия обычно имеет дело с непрерывными значениями, например, температурой или стоимостью фондового рынка. Классификация, с другой стороны, может подсказать вам, какой вид птиц присутствует в записи — именно здесь вы бы использовали матрицу путаницы. Это сообщило бы вам, сколько раз алгоритм правильно предсказывал метку и где он допустил ошибки. SciPy, который вы используете, имеет отдельные разделы для обоих.
Как для задач классификации, так и для задач регрессии вы можете использовать разные показатели для их оценки, поэтому никогда не предполагайте, что они сопоставимы. Как указал @javad, «коэффициент детерминации» сильно отличается от точности. Я бы также рекомендовал прочитать о точности и отзыве.
В вашем случае у вас явно есть проблема с классификацией, и поэтому ее следует рассматривать. Также имейте в виду, что f6 выглядит так, как будто имеет дискретный набор значений.
Если вы хотите быстро поэкспериментировать с различными подходами, я могу порекомендовать, например, H2O, который, наряду с nice API, имеет отличный пользовательский интерфейс и допускает массовую параллельную обработку. XGBoost также превосходен.
Ответ №2:
Взгляните на документацию здесь.
Если вы вызовете score()
методы регрессии, они вернут «коэффициент детерминации R ^ 2 прогноза», а не точность.
Ответ №3:
Взгляните на это.
Используйте «model.score(X_test, y_test)».