baseline это машинное обучение
What does «baseline» mean in the context of machine learning?
What does «baseline» mean in the context of machine learning and data science?
Hint: An appropriate baseline will give an RMSE of approximately 200.
I don’t get this. Does he mean that if my predictive model on the training data has a RMSE below 500, it’s good?
And what could be a «baseline approach»?
3 Answers 3
A baseline is the result of a very basic model/solution. You generally create a baseline and then try to make more complex solutions in order to get a better result. If you achieve a better score than the baseline, it is good.
A baseline is a method that uses heuristics, simple summary statistics, randomness, or machine learning to create predictions for a dataset. You can use these predictions to measure the baseline’s performance (e.g., accuracy)— this metric will then become what you compare any other machine learning algorithm against.
A machine learning algorithm tries to learn a function that models the relationship between the input (feature) data and the target variable (or label). When you test it, you will typically measure performance in one way or another. For example, your algorithm may be 75% accurate. But what does this mean? You can infer this meaning by comparing with a baseline’s performance.
Typical baselines include those supported by scikit-learn’s «dummy» estimators:
This is useful for metrics that evaluate a non-majority class.
In general, you will want your approach to outperform the baselines you have selected. In the example above, you would want your 75% accuracy to be higher than any baseline you have run on the same data.
Как реализовать базовые алгоритмы машинного обучения с нуля с Python
Дата публикации 2016-10-21
Важно установить базовую производительность по проблеме прогнозного моделирования.
Базовая линия обеспечивает точку сравнения для более продвинутых методов, которые вы оцените позже.
В этом руководстве вы узнаете, как реализовать базовые алгоритмы машинного обучения с нуля в Python.
После завершения этого урока вы узнаете:
Описание
Есть много алгоритмов машинного обучения на выбор. Сотни на самом деле.
Вы должны знать, хороши ли прогнозы для данного алгоритма или нет. Но как ты узнал?
Ответ заключается в использовании базового алгоритма прогнозирования. Алгоритм базового прогнозирования предоставляет набор прогнозов, которые вы можете оценить так же, как и любые прогнозы для вашей проблемы, такие как точность классификации или RMSE.
Оценки по этим алгоритмам обеспечивают требуемую точку сравнения при оценке всех других алгоритмов машинного обучения по вашей проблеме.
Установив это, вы можете прокомментировать, насколько лучше данный алгоритм по сравнению с наивным базовым алгоритмом, предоставив контекст о том, насколько хорош данный метод на самом деле.
Два наиболее часто используемых базовых алгоритма:
Когда вы начинаете с новой проблемы, которая является более сложной, чем обычная проблема классификации или регрессии, хорошей идеей будет сначала разработать алгоритм случайного прогнозирования, который является специфическим для вашей проблемы прогнозирования. Позже вы можете улучшить это и разработать алгоритм с нулевым правилом.
Давайте реализуем эти алгоритмы и посмотрим, как они работают.
Руководство
Этот урок разделен на 2 части:
Эти шаги обеспечат основы, необходимые для реализации и расчета базовой производительности для ваших алгоритмов машинного обучения.
1. Алгоритм случайного прогнозирования
Алгоритм случайного предсказания предсказывает случайный результат, как это наблюдается в данных обучения.
Это, пожалуй, самый простой алгоритм для реализации.
Это требует, чтобы вы сохранили все отдельные значения результатов в данных обучения, которые могут быть большими при проблемах регрессии с большим количеством различных значений.
Поскольку для принятия решений используются случайные числа, рекомендуется зафиксировать начальное число случайных чисел перед использованием алгоритма. Это сделано для того, чтобы мы получали одинаковый набор случайных чисел и, в свою очередь, принимали одинаковые решения при каждом запуске алгоритма.
Ниже приведена реализация алгоритма случайного прогнозирования в функции с именемrandom_algorithm (),
Функция принимает как обучающий набор данных, который включает выходные значения, так и тестовый набор данных, для которого выходные значения должны быть предсказаны.
Функция будет работать для задач классификации и регрессии. Предполагается, что выходное значение в обучающих данных является последним столбцом для каждой строки.
Во-первых, набор уникальных выходных значений собирается из обучающих данных. Затем случайно выбранное выходное значение из набора выбирается для каждой строки в тестовом наборе.
Мы можем проверить эту функцию с небольшим набором данных, который содержит только выходной столбец для простоты.
Выходные значения в обучающем наборе данных: «0» или «1», что означает, что набор прогнозов, из которых будет выбирать алгоритм, равен <0, 1>. Набор тестов также содержит один столбец без данных, поскольку прогнозы не известны.
Выполнение примера вычисляет случайные прогнозы для тестового набора данных и печатает эти прогнозы.
Алгоритм случайного прогнозирования прост в реализации и быстр в запуске, но мы могли бы добиться большего успеха в качестве базовой линии.
2. Алгоритм нулевого правила
Алгоритм нулевого правила является лучшей базовой линией, чем случайный алгоритм.
Он использует больше информации о данной проблеме, чтобы создать одно правило для прогнозирования. Это правило отличается в зависимости от типа проблемы.
Давайте начнем с проблем классификации, предсказания метки класса.
классификация
Для задач классификации одно правило состоит в том, чтобы предсказать значение класса, которое является наиболее распространенным в наборе обучающих данных. Это означает, что если в учебном наборе данных имеется 90 экземпляров класса «0» и 10 экземпляров класса «1», он будет прогнозировать «0» и достигать базовой точности 90/100 или 90%.
Это намного лучше, чем алгоритм случайного предсказания, который в среднем достиг бы точности всего 82%. Подробнее о том, как рассчитывается эта оценка для случайного поиска, см. Ниже:
Ниже приведена функция с именемzero_rule_algorithm_classification ()который реализует это для случая классификации
Функция используетМаксимум()Функция с атрибутом ключа, который немного умный.
Учитывая список значений класса, наблюдаемых в данных обучения,Максимум()Функция принимает набор уникальных значений класса и вызывает счетчик в списке значений класса для каждого значения класса в наборе.
В результате он возвращает значение класса с наибольшим количеством наблюдаемых значений в списке значений класса, наблюдаемых в наборе обучающих данных.
Если все значения классов имеют одинаковое количество, то мы выберем первое значение класса, наблюдаемое в наборе данных.
После того, как мы выбрали значение класса, оно используется для прогнозирования каждой строки в наборе тестовых данных.
Ниже приведен рабочий пример с надуманным набором данных, который содержит 4 примера класса «0» и 2 примера класса «1». Мы ожидаем, что алгоритм выберет значение класса «0» в качестве прогноза для каждой строки в тестовом наборе данных.
Выполнение этого примера делает прогнозы и выводит их на экран. Как и ожидалось, значение класса «0» было выбрано и предсказано.
Теперь давайте рассмотрим алгоритм нулевого правила для задач регрессии.
регрессия
Проблемы регрессии требуют предсказания реальной стоимости.
Хорошим прогнозом по умолчанию для реальных значений является прогнозирование центральной тенденции. Это может быть среднее или медиана.
Хорошим значением по умолчанию является использование среднего значения (также называемого средним) выходного значения, наблюдаемого в данных обучения.
Вероятно, это будет иметь меньшую погрешность, чем случайный прогноз, который вернет любое наблюдаемое выходное значение.
Ниже приведена функция для этогоzero_rule_algorithm_regression (), Он работает путем расчета среднего значения для наблюдаемых выходных значений.
После расчета среднее значение прогнозируется для каждой строки в данных обучения.
Эта функция может быть проверена на простом примере.
Мы можем создать небольшой набор данных, в котором среднее значение, как известно, равно 15.
Ниже приведен полный пример. Мы ожидаем, что среднее значение 15 будет предсказано для каждой из 4 строк в тестовом наборе данных.
При выполнении примера вычисляются прогнозируемые выходные значения, которые будут напечатаны. Как и ожидалось, среднее значение 15 прогнозируется для каждой строки в тестовом наборе данных.
расширения
Ниже приведены несколько расширений базовых алгоритмов, которые вы, возможно, захотите исследовать, как дополнение к этому учебнику.
Обзор
В этом руководстве вы узнали о важности расчета базового показателя производительности для вашей проблемы машинного обучения.
У вас есть вопросы?
Задайте свои вопросы в комментариях, и я сделаю все возможное, чтобы ответить.
Открытый курс машинного обучения. Тема 1. Первичный анализ данных с Pandas
Открытый курс машинного обучения mlcourse.ai сообщества OpenDataScience – это сбалансированный по теории и практике курс, дающий как знания так и навыки (необходимые, но не достаточные) машинного обучения уровня Junior Data Scientist. Нечасто встретите и подробное описание математики, стоящей за используемыми алгоритмами, и соревнования Kaggle, и примеры бизнес-применения машинного обучения в одном курсе. С 2017 по 2020 годы yorko и большая команда ODS проводили живые запуски курса дважды в год – с домашними заданиями, соревнованиями и общим рейтингом учатсников (имена героев все еще запечатлены тут). Верим, что силами ODS такой формат возродится, а пока, на август 2021, курс – в режиме самостоятельного прохождения.
Опубликован план самостоятельного прохождения курса (англ.) – https://mlcourse.ai/roadmap.
Список статей серии
План этой статьи
1. О курсе
Мы не ставим себе задачу разработать еще один исчерпывающий вводный курс по машинному обучению или анализу данных (т.е. это не замена специализации Яндекса и МФТИ, дополнительному образованию ВШЭ и прочим фундаментальным онлайн- и оффлайн-программам и книжкам). Цель этой серии статей — быстро освежить имеющиеся у вас знания или помочь найти темы для дальнейшего изучения. Подход примерно как у авторов книги Deep Learning, которая начинается с обзора математики и основ машинного обучения — краткого, максимально ёмкого и с обилием ссылок на источники.
Если вы планируете пройти курс, то предупреждаем: при подборе тем и создании материалов мы ориентируемся на то, что наши слушатели знают математику на уровне 2 курса технического вуза и хотя бы немного умеют программировать на Python. Это не жёсткие критерии отбора, а всего лишь рекомендации — можно записаться на курс, не зная математики или Python, и параллельно навёрстывать:
Также про курс рассказано в этом анонсе.
Какое ПО нужно
Для прохождения курса нужен ряд Python-пакетов, большинство из них есть в сборке Anaconda с Python 3.6. Чуть позже понадобятся и другие библиотеки, об этом будет сказано дополнительно. Полный список можно посмотреть в Dockerfile.
Также можно воспользоваться Docker-контейнером, в котором все необходимое ПО уже установлено. Подробности – на странице Wiki репозитория.
2. Домашние задания в курсе
Каждая статья сопровождается домашним заданием в виде тетрадки Jupyter, в которую надо дописать код, и на основе этого выбрать правильный ответ в форме Google. Примеры домашних заданий приведены в статьях серии (в конце).
3. Демонстрация основных методов Pandas
Весь код можно воспроизвести в этом Jupyter notebook.
Основными структурами данных в Pandas являются классы Series и DataFrame. Первый из них представляет собой одномерный индексированный массив данных некоторого фиксированного типа. Второй – это двухмерная структура данных, представляющая собой таблицу, каждый столбец которой содержит данные одного типа. Можно представлять её как словарь объектов типа Series. Структура DataFrame отлично подходит для представления реальных данных: строки соответствуют признаковым описаниям отдельных объектов, а столбцы соответствуют признакам.
Будем показывать основные методы в деле, анализируя набор данных по оттоку клиентов телеком-оператора (скачивать не нужно, он есть в репозитории). Прочитаем данные (метод read_csv ) и посмотрим на первые 5 строк с помощью метода head :
В Jupyter-ноутбуках датафреймы Pandas выводятся в виде вот таких красивых табличек, и print(df.head()) выглядит хуже.
По умолчанию Pandas выводит всего 20 столбцов и 60 строк, поэтому если ваш датафрейм больше, воспользуйтесь функцией set_option :
Каждая строка представляет собой одного клиента – это объект исследования.
Столбцы – признаки объекта.
Название | Описание | Тип |
---|---|---|
State | Буквенный код штата | номинальный |
Account length | Как долго клиент обслуживается компанией | количественный |
Area code | Префикс номера телефона | количественный |
International plan | Международный роуминг (подключен/не подключен) | бинарный |
Voice mail plan | Голосовая почта (подключена/не подключена) | бинарный |
Number vmail messages | Количество голосовых сообщений | количественный |
Total day minutes | Общая длительность разговоров днем | количественный |
Total day calls | Общее количество звонков днем | количественный |
Total day charge | Общая сумма оплаты за услуги днем | количественный |
Total eve minutes | Общая длительность разговоров вечером | количественный |
Total eve calls | Общее количество звонков вечером | количественный |
Total eve charge | Общая сумма оплаты за услуги вечером | количественный |
Total night minutes | Общая длительность разговоров ночью | количественный |
Total night calls | Общее количество звонков ночью | количественный |
Total night charge | Общая сумма оплаты за услуги ночью | количественный |
Total intl minutes | Общая длительность международных разговоров | количественный |
Total intl calls | Общее количество международных разговоров | количественный |
Total intl charge | Общая сумма оплаты за международные разговоры | количественный |
Customer service calls | Число обращений в сервисный центр | количественный |
Целевая переменная: Churn – Признак оттока, бинарный признак (1 – потеря клиента, то есть отток). Потом мы будем строить модели, прогнозирующие этот признак по остальным, поэтому мы и назвали его целевым.
Посмотрим на размер данных, названия признаков и их типы.
Видим, что в таблице 3333 строки и 20 столбцов. Выведем названия столбцов:
Чтобы посмотреть общую информацию по датафрейму и всем признакам, воспользуемся методом info :
Метод describe показывает основные статистические характеристики данных по каждому числовому признаку (типы int64 и float64 ): число непропущенных значений, среднее, стандартное отклонение, диапазон, медиану, 0.25 и 0.75 квартили.
State | International plan | Voice mail plan | |
---|---|---|---|
count | 3333 | 3333 | 3333 |
unique | 51 | 2 | 2 |
top | WV | No | No |
freq | 106 | 3010 | 2411 |
Сортировка
DataFrame можно отсортировать по значению какого-нибудь из признаков. В нашем случае, например, по Total day charge ( ascending=False для сортировки по убыванию):
Сортировать можно и по группе столбцов:
спасибо за замечание про устаревший sort makkos
Индексация и извлечение данных
DataFrame можно индексировать по-разному. В связи с этим рассмотрим различные способы индексации и извлечения нужных нам данных из датафрейма на примере простых вопросов.
14,5% — довольно плохой показатель для компании, с таким процентом оттока можно и разориться.
Воспользуемся этим для ответа на вопрос: каковы средние значения числовых признаков среди нелояльных пользователей?
Скомбинировав предыдущие два вида индексации, ответим на вопрос: сколько в среднем в течение дня разговаривают по телефону нелояльные пользователи?
Какова максимальная длина международных звонков среди лояльных пользователей ( Churn == 0 ), не пользующихся услугой международного роуминга ( ‘International plan’ == ‘No’ )?
В первом случае мы говорим «передай нам значения для id строк от 0 до 5 и для столбцов от State до Area code», а во втором — «передай нам значения первых пяти строк в первых трёх столбцах».
Хозяйке на заметку: когда мы передаём slice object в iloc, датафрейм слайсится как обычно. Однако в случае с loc учитываются и начало, и конец слайса (ссылка на документацию, спасибо arkane0906 за замечание).
State | Account length | Area code | |
---|---|---|---|
0 | KS | 128 | 415 |
1 | OH | 107 | 415 |
2 | NJ | 137 | 415 |
3 | OH | 84 | 408 |
4 | OK | 75 | 415 |
5 | AL | 118 | 510 |
State | Account length | Area code | |
---|---|---|---|
0 | KS | 128 | 415 |
1 | OH | 107 | 415 |
2 | NJ | 137 | 415 |
3 | OH | 84 | 408 |
4 | OK | 75 | 415 |
Если нам нужна первая или последняя строчка датафрейма, пользуемся конструкцией df[:1] или df[-1:] :
Применение функций к ячейкам, столбцам и строкам
Применение функции к каждому столбцу: apply
Применение функции к каждой ячейке столбца: map
Например, метод map можно использовать для замены значений в колонке, передав ему в качестве аргумента словарь вида
Аналогичную операцию можно провернуть с помощью метода replace :
Группировка данных
В общем случае группировка данных в Pandas выглядит следующим образом:
Группирование данных в зависимости от значения признака Churn и вывод статистик по трём столбцам в каждой группе.
Сделаем то же самое, но немного по-другому, передав в agg список функций:
Сводные таблицы
Voice mail plan | No | Yes |
---|---|---|
Churn | ||
0 | 0.602460 | 0.252625 |
1 | 0.120912 | 0.024002 |
Мы видим, что большинство пользователей лояльны и при этом пользуются дополнительными услугами (международного роуминга / голосовой почты).
Давайте посмотрим среднее число дневных, вечерних и ночных звонков для разных Area code:
Total day calls | Total eve calls | Total night calls | |
---|---|---|---|
Area code | |||
408 | 100.496420 | 99.788783 | 99.039379 |
415 | 100.576435 | 100.503927 | 100.398187 |
510 | 100.097619 | 99.671429 | 100.601190 |
Преобразование датафреймов
Как и многое другое в Pandas, добавление столбцов в DataFrame осуществимо несколькими способами.
Например, мы хотим посчитать общее количество звонков для всех пользователей. Создадим объект total_calls типа Series и вставим его в датафрейм:
Добавить столбец из имеющихся можно и проще, не создавая промежуточных Series:
4. Первые попытки прогнозирования оттока
Посмотрим, как отток связан с признаком «Подключение международного роуминга» (International plan). Сделаем это с помощью сводной таблички crosstab, а также путем иллюстрации с Seaborn (как именно строить такие картинки и анализировать с их помощью графики – материал следующей статьи).
International plan | False | True | All |
---|---|---|---|
Churn | |||
0 | 2664 | 186 | 2850 |
1 | 346 | 137 | 483 |
All | 3010 | 323 | 3333 |
Видим, что когда роуминг подключен, доля оттока намного выше – интересное наблюдение! Возможно, большие и плохо контролируемые траты в роуминге очень конфликтогенны и приводят к недовольству клиентов телеком-оператора и, соответственно, к их оттоку.
Далее посмотрим на еще один важный признак – «Число обращений в сервисный центр» (Customer service calls). Также построим сводную таблицу и картинку.
Customer service calls | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | All |
---|---|---|---|---|---|---|---|---|---|---|---|
Churn | |||||||||||
0 | 605 | 1059 | 672 | 385 | 90 | 26 | 8 | 4 | 1 | 0 | 2850 |
1 | 92 | 122 | 87 | 44 | 76 | 40 | 14 | 5 | 1 | 2 | 483 |
All | 697 | 1181 | 759 | 429 | 166 | 66 | 22 | 9 | 2 | 2 | 3333 |
Может быть, по сводной табличке это не так хорошо видно (или скучно ползать взглядом по строчкам с цифрами), а вот картинка красноречиво свидетельствует о том, что доля оттока сильно возрастает начиная с 4 звонков в сервисный центр.
Churn | 0 | 1 | All |
---|---|---|---|
Many_service_calls | |||
0 | 2721 | 345 | 3066 |
1 | 129 | 138 | 267 |
All | 2850 | 483 | 3333 |
Объединим рассмотренные выше условия и построим сводную табличку для этого объединения и оттока.
Значит, прогнозируя отток клиента в случае, когда число звонков в сервисный центр больше 3 и подключен роуминг (и прогнозируя лояльность – в противном случае), можно ожидать около 85.8% правильных попаданий (ошибаемся всего 464 + 9 раз). Эти 85.8%, которые мы получили с помощью очень простых рассуждений – это неплохая отправная точка (baseline) для дальнейших моделей машинного обучения, которые мы будем строить.
В целом до появления машинного обучения процесс анализа данных выглядел примерно так. Прорезюмируем:
5. Домашнее задание №1
Далее курс будет проводиться на английском языке (статьи на Медиуме тоже есть). Следующий запуск – 1 октября 2018 г.
Для разминки/подготовки предлагается поанализировать демографические данные с помощью Pandas. Надо заполнить недостающий код в Jupyter-заготовке и выбрать правильные ответы в веб-форме (там же найдете и решение).
6. Обзор полезных ресурсов
Статья написана в соавторстве с yorko (Юрием Кашницким).