Python — машинное обучение

#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)».