@just_data_science July 04, 2018
Наткнулся на наглядную статью про Машинное Обучение. Не моя, но годно. Авторы взяли в качестве примера задачу - построить модель, которая определяет, где находится дом - в Нью-Йорке (NY) или в Сан-Франциско (SF)? Есть красивые "живые" графики, с помощью которых авторы поясняют процесс - обязательно посмотрите. А ниже - мой вольный пересказ статьи со своими комментами.
Итак...
Есть база данных с информацией о домах: город, площадь, стоимость, цена за квадрат, возвышение (высота основания дома над уровнем моря), год постройки, количество ванных, спален.
И как же определить город?
Сначала любая задача требует использования своего мозга, а потом уже можно подключать машинное обучение. Открываем базу, глазами смотрим колоночки, графики рисуем. В общем, выясняем что вообще у нас за данные, заодно пытаемся найти зависимости, сами, без всяких машин. Всё это дело называется EDA - Exploratory Data Analysis (Разведочный Анализ Данных).
Делаем EDA
Делаем так:
1. На первом графике в статье (не считая заглавной картинки) - сравниваем возвышенность домов. И увидим, что все дома с основанием выше 73 метров над уровнем моря - в NY. Потому что в SF - высокие холмы, а в NY физически невозможно найти возвышенность для постройки дома.
2. Далее построим график зависимости высоты и цены за квадратный метр. И оказалось, что график делится на 3 сектора - возвышенность выше 73 м это все NY, а вот дороже 19 килобаксов за метр - это SF (да, там правда недвижка дороже). Сложнее с домами, которые стоят на высоте ниже 73м и стоят дешевле 19k$.
3. Копаем дальше. В предыдущем шаге был сделан график зависимости двух признаков - высоты и цены за метр. Теперь построим такие же для всех остальных пар признаков. Получился целый массив графиков, из которого в целом ничего не понятно - и это нормально :) Редко когда в данных есть столь явные зависимости, как в пунктах 1-2.
В итоге пришли к логичному выводу - лучше всего отталкиваться от высоты дома.
Строим простейшую модель
На этом месте EDA этап окончен и пора делать модель. Для начала построим модель, которая будет классифицировать исключительно по возвышению: всё что выше 73 м - NY, ниже - SF. И ожидаемо облажались, ведь не все дома на высоте ниже 73 - в NY.
Далее модель "подкручиваем" - решили классифицировать не цифре 73, а 28. Ибо это - "Оптимальная точка разбиения" (если брать выше/ниже - то точность предсказания становится хуже). Как именно вывели эту цифру - авторы оригинальной статьи не углубляются, шлют в гугл с запросом "Коэффициент Джини и энтропия". А т.к. там сплошная математика - просто поверим им на слово, не будем в данной статье усложнять объяснения ;)
Точность определения с 28 метрами повысилась, но все равно низкая. Ещё раз убедились, что классифицировать исключительно по высоте - недостаточно для точного определения.
Усложняем модель
Теперь строится Дерево Классификации - ведь именно этот алгоритм выбрали авторы статьи. На данный момент у нас модель состоит только из корня дерева - с условиями "высота основания меньше/больше 28 м". Получается, данные разбиты на 2 множества - выше и ниже этой точки. Для каждого из этих множеств нужно проделать процедуру поиска оптимальной точки разбиения среди всех пар признаков. Получилось еще куча подмножеств. Проделывается поиск очередных оптимальный точек еще раз. И ещё. И ещё. И так - пока не получится дерево, полностью правильно определяющее город. Вот оно на картинке.
Ура, 100% точная модель?
Нет, потому что 100% точности прогнозирования в природе не бывает. Всё это время модель строилась на некоторых обучающих данных, и очевидно, что если их прогнать через модель - точность может быть и 100%. Но как правило слишком "точные" модели - признак переобучения, когда модель слишком заточена на особенности обучающих данных.
И если запустить другие данные (тестовые данные), которые мы не видели при обучении модели, то окажется, что из всех наших правил есть исключения. И чем больше учтено особенностей обучающей выборки, которые не повторяются в тестовой, тем хуже определяет город наша модель.
Поэтому построение максимально точной модели - это палка о двух концах, нужно и зависимости в данных постараться найти, и не переобучить при этом. Поэтому при обучении моделей часто обучающую выборку разбивают на несколько частей, и обучают модель заново по каждой части. После чего находят оптимальные средние параметры.
Напоследок
Примерно так решается любая задача машинного обучения. Часто есть еще один этап - построение простых моделей с помощью разных алгоритмов. После чего сравнивается точность и принимается решение, с помощью какого алгоритма копать дальше. Может оказаться, что нейросеть или случайный лес будет эффективнее дерева решений (и чаще всего - так и оказывается).
И, конечно же, все этим модели делаются не руками, а готовыми программными пакетами. Которые сами ищут зависимости, с какого признака начинать классификацию, подбирают оптимальные точки/параметры модели.
Источник: http://www.r2d3.us/Наглядное-Введение-в-Теорию-Машинного-Обучения/
http://www.r2d3.us/%D0%9D%D0%B0%D0%B3%D0%BB%D1%8F%D0%B4%D0%BD%D0%BE%D0%B5-%D0%92%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5-%D0%B2-%D0%A2%D0%B5%D0%BE%D1%80%D0%B8%D1%8E-%D0%9C%D0%B0%D1%88%D0%B8%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE-%D0%9E%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D1%8F/EDIT