Вы слышали, как люди говорят о машинном обучении, но имеют лишь смутное представление о том, что это значит? Вы устали кивать в разговоре с коллегами? Давай изменим это!
Это руководство предназначено для всех, кто интересуется машинным обучением, но не знает, с чего начать. Я полагаю, что есть много людей, которые пытались прочитать статью в Википедии, разочаровывались и отказывались желать, чтобы кто-то просто дал им подробное объяснение. Вот что это такое.
Цель - быть доступным для всех, а это значит, что есть много обобщений. Но кого это волнует? Если это заставит кого-то еще больше заинтересоваться машинным обучением, значит, миссия выполнена.
Что такое машинное обучение?
Идея машинного обучения заключается в том, что существуют общие алгоритмы, которые могут рассказать вам что-то интересное о наборе данных без необходимости писать какой-либо специальный код для конкретной проблемы. Вместо написания кода вы вводите данные в общий алгоритм, и он строит свою собственную логику на основе данных.
Например, одним из видов алгоритмов является алгоритм классификации. Он может помещать данные в разные группы. Тот же алгоритм классификации, который использовался для распознавания рукописных цифр, также можно использовать для классификации электронных писем на спам и не-спам без изменения строки кода. Это тот же алгоритм, но он использует разные обучающие данные, поэтому у него другая логика классификации.
Этот алгоритм машинного обучения представляет собой черный ящик, который можно повторно использовать для решения множества различных задач классификации.
«Машинное обучение» - это общий термин, охватывающий множество таких общих алгоритмов.
Два вида алгоритмов машинного обучения
Вы можете рассматривать алгоритмы машинного обучения как относящиеся к одной из двух основных категорий - обучение с учителем и обучение без учителя. Разница простая, но очень важная.
Контролируемое обучение
Допустим, вы агент по недвижимости. Ваш бизнес растет, поэтому вы нанимаете кучу новых агентов-стажеров, которые будут вам помогать. Но есть проблема: вы можете взглянуть на дом и иметь довольно хорошее представление о том, сколько стоит дом, но у ваших учеников нет вашего опыта, поэтому они не знают, как оценивать свои дома.
Чтобы помочь своим ученикам (и, возможно, освободить себя для отпуска), вы решаете написать небольшое приложение, которое может оценить стоимость дома в вашем районе на основе его размера, района и т. Д., А также того, за что были проданы подобные дома.
Так вы записываете каждый раз, когда кто-то продает дом в вашем городе на 3 месяца. Для каждого дома вы записываете кучу деталей - количество спален, размер в квадратных футах, район и т. Д. Но самое главное, вы записываете окончательную цену продажи:
Это наши «тренировочные данные».
Используя эти данные обучения, мы хотим создать программу, которая может оценить, сколько стоит любой другой дом в вашем районе:
Мы хотим использовать данные обучения для прогнозирования цен на другие дома.
Это называется обучением с учителем. Вы знали, сколько продается каждый дом, то есть, другими словами, вы знали ответ на проблему и могли работать в обратном направлении, чтобы выяснить логику.
Чтобы создать приложение, вы вводите данные о каждом доме в свой алгоритм машинного обучения. Алгоритм пытается выяснить, какие математические вычисления необходимо выполнить, чтобы числа работали.
Это как иметь ключ ответа на тест по математике со стертыми арифметическими символами:
О, нет! Коварный ученик стер арифметические символы с ключа ответа учителя!
Исходя из этого, вы сможете определить, какие математические задачи были на тесте? Вы знаете, что должны «что-то сделать» с числами слева, чтобы получить каждый ответ справа.
При обучении с учителем вы позволяете компьютеру определять эти отношения за вас. И как только вы узнаете, какая математика требовалась для решения этого конкретного набора задач, вы могли бы ответить на любую другую задачу того же типа!
Неконтролируемое обучение
Вернемся к нашему первоначальному примеру с агентом по недвижимости. Что, если бы вы не знали продажную цену каждого дома? Даже если все, что вы знаете, - это размер, расположение и т. Д. Каждого дома, оказывается, что вы все равно можете делать действительно классные вещи. Это называется обучением без учителя.
Даже если вы не пытаетесь предсказать неизвестное число (например, цену), вы все равно можете делать интересные вещи с помощью машинного обучения.
Это похоже на то, как кто-то дает вам список чисел на листе бумаги и говорит: «Я действительно не знаю, что означают эти числа, но, возможно, вы сможете выяснить, есть ли здесь шаблон, группировка или что-то в этом роде - удачи!»
Так что же делать с этими данными? Для начала, у вас может быть алгоритм, который автоматически определяет различные сегменты рынка в ваших данных. Возможно, вы обнаружите, что покупателям жилья в районе, расположенном рядом с местным колледжем, действительно нравятся небольшие дома с большим количеством спален, но покупатели жилья в пригороде предпочитают дома с 3 спальнями и большой площадью. Информация об этих разных типах клиентов может помочь направить ваши маркетинговые усилия.
Еще одна интересная вещь, которую вы можете сделать, - это автоматически идентифицировать любые дома, которые сильно отличаются от всего остального. Может быть, эти особняки представляют собой гигантские особняки, и вы можете сосредоточить внимание своих лучших продавцов на этих областях, потому что они получают более высокие комиссионные.
Обучение с учителем - это то, на чем мы сосредоточимся в оставшейся части этого поста, но это не потому, что обучение без учителя менее полезно или интересно. Фактически, неконтролируемое обучение становится все более важным по мере совершенствования алгоритмов, потому что его можно использовать без необходимости маркировать данные с правильным ответом.
Примечание: существует множество других типов алгоритмов машинного обучения. Но это неплохое место для начала.
Это круто, но действительно ли возможность оценить стоимость дома считается «обучением»?
Как человек, ваш мозг может подойти к любой ситуации и научиться справляться с ней без каких-либо явных инструкций. Если вы продаете дома в течение длительного времени, вы инстинктивно «почувствуете» правильную цену за дом, лучший способ продать этот дом, тип клиента, который будет заинтересован, и т. Д. Цель исследования Strong AI заключается в том, чтобы иметь возможность воспроизвести эту способность на компьютерах.
Но современные алгоритмы машинного обучения пока не так хороши - они работают только тогда, когда сосредоточены на очень конкретной и ограниченной проблеме. Возможно, лучшее определение для «обучения» в этом случае - «вычисление уравнения для решения конкретной проблемы на основе некоторых данных в качестве примера».
К сожалению, «Машина, вычисляющая уравнение для решения конкретной проблемы на основе некоторых примеров данных» - не лучшее название. Так что вместо этого мы остановились на «Машинном обучении».
Конечно, если вы читаете эту статью на 50 лет вперед, и мы выяснили алгоритм для Strong AI, то весь этот пост будет казаться немного странным. Может, перестань читать и иди скажи своему роботу-слуге, чтобы он сделал тебе бутерброд, будущий человек.
Напишем эту программу!
Итак, как бы вы написали программу для оценки стоимости дома, как в нашем примере выше? Подумайте об этом на секунду, прежде чем читать дальше.
Если бы вы ничего не знали о машинном обучении, вы, вероятно, попытались бы написать несколько основных правил оценки стоимости дома, например:
def estimate_house_sales_price(num_of_bedrooms, sqft, neighborhood): price = 0 # In my area, the average house costs $200 per sqft price_per_sqft = 200 if neighborhood == "hipsterton": # but some areas cost a bit more price_per_sqft = 400 elif neighborhood == "skid row": # and some areas cost less price_per_sqft = 100 # start with a base price estimate based on how big the place is price = price_per_sqft * sqft # now adjust our estimate based on the number of bedrooms if num_of_bedrooms == 0: # Studio apartments are cheap price = price — 20000 else: # places with more bedrooms are usually # more valuable price = price + (num_of_bedrooms * 1000) return price
Если вы возитесь с этим часами, у вас может получиться что-то в этом роде. Но ваша программа никогда не будет идеальной, и ее будет сложно поддерживать при изменении цен.
Разве не было бы лучше, если бы компьютер просто сообразил, как реализовать эту функцию за вас? Кого волнует, что именно делает функция, если она возвращает правильный номер:
def estimate_house_sales_price(num_of_bedrooms, sqft, neighborhood): price = <computer, plz do some math for me> return price
Один из способов подумать об этой проблеме состоит в том, что цена - это восхитительное тушеное мясо, а ингредиенты - это количество спален, квадратные метры и район. Если бы вы могли просто выяснить, насколько каждый ингредиент влияет на окончательную цену, возможно, существует точное соотношение ингредиентов, которые нужно перемешать, чтобы получить окончательную цену.
Это уменьшит вашу исходную функцию (со всеми этими сумасшедшими if ’и else’) до чего-то действительно простого, вроде этого:
def estimate_house_sales_price(num_of_bedrooms, sqft, neighborhood): price = 0 # a little pinch of this price += num_of_bedrooms * .841231951398213 # and a big pinch of that price += sqft * 1231.1231231 # maybe a handful of this price += neighborhood * 2.3242341421 # and finally, just a little extra salt for good measure price += 201.23432095 return price
Обратите внимание на магические числа, выделенные жирным шрифтом - .841231951398213, 1231.1231231, 2.3242341421 и 201.23432095. Это наши веса. Если бы мы могли просто вычислить идеальные веса, чтобы использовать эту работу для каждого дома, наша функция могла бы предсказывать цены на жилье!
Глупый способ определить лучший вес будет примерно таким:
Шаг 1:
Начните с каждого веса, установленного на 1.0:
def estimate_house_sales_price(num_of_bedrooms, sqft, neighborhood): price = 0 # a little pinch of this price += num_of_bedrooms * 1.0 # and a big pinch of that price += sqft * 1.0 # maybe a handful of this price += neighborhood * 1.0 # and finally, just a little extra salt for good measure price += 1.0 return price
Шаг 2:
Пройдите через свою функцию каждый дом, о котором вы знаете, и посмотрите, насколько далеко функция угадает правильную цену для каждого дома:
Используйте свою функцию, чтобы спрогнозировать цену для каждого дома.
Например, если первый дом действительно был продан за 250 000 долларов, но ваша функция предположила, что он был продан за 178 000 долларов, вы получите скидку на 72 000 долларов за этот единственный дом.
Теперь сложите возведенную в квадрат сумму, которую вы отключили, для каждого дома, который есть в вашем наборе данных. Допустим, в вашем наборе данных было 500 продаж домов, и квадрат того, насколько ваша функция была отключена для каждого дома, составляет в общей сложности 86 123 373 доллара. Вот насколько «неправильная» ваша функция сейчас.
Теперь возьмите эту сумму и разделите ее на 500, чтобы получить среднее значение того, как далеко вы находитесь для каждого дома. Назовите эту среднюю сумму ошибки стоимостью вашей функции.
Если бы вы могли уменьшить эту стоимость, играя с весами, ваша функция была бы идеальной. Это будет означать, что в любом случае ваша функция точно угадывает цену дома на основе входных данных. Так что наша цель - добиться как можно более низких затрат, пробуя разные веса.
Шаг 3:
Повторяйте шаг 2 снова и снова со всеми возможными комбинациями весов. Какая бы комбинация весов ни делала затраты ближе всего к нулю, это то, что вы используете. Когда вы найдете подходящие веса, вы решили проблему!
Время взрыва ума
Это довольно просто, правда? Хорошо, подумай о том, что ты только что сделал. Вы взяли некоторые данные, выполнили три общих, очень простых шага и в итоге получили функцию, которая может угадать цену любого дома в вашем районе. Осторожно, Зиллоу!
Но вот еще несколько фактов, которые поразят вас:
- Исследования во многих областях (например, лингвистика / перевод) за последние 40 лет показали, что эти общие алгоритмы обучения, которые «перемешивают числовое тушение» (фраза, которую я только что придумал), превосходят подходы, в которых реальные люди пытаются придумать явные правила сами. «Тупой» подход машинного обучения в конечном итоге превосходит человеческих экспертов.
- Функция, с которой вы столкнулись, совершенно тупая. Он даже не знает, что такое «квадратные метры» или «спальни». Все, что он знает, это то, что ему нужно размешать некоторое количество этих чисел, чтобы получить правильный ответ.
- Скорее всего, вы понятия не имеете, почему определенный набор весов. Итак, вы только что написали функцию, которую не совсем понимаете, но можете доказать, что она будет работать.
- Представьте, что вместо таких параметров, как «sqft» и «num_of_bedrooms», ваша функция прогнозирования принимает массив чисел. Допустим, каждое число представляет собой яркость одного пикселя изображения, снятого камерой, установленной на крыше вашего автомобиля. Теперь предположим, что вместо вывода прогноза, называемого «цена», функция выдала прогноз, называемый «градусы_вращения_вращения_весом». Вы только что создали функцию, которая может самостоятельно управлять автомобилем!
Довольно безумно, правда?
Как насчет всего этого бита «попробовать каждое число» на шаге 3?
Хорошо, конечно, вы не можете просто попробовать каждую комбинацию всех возможных весов, чтобы найти комбинацию, которая работает лучше всего. Это займет буквально целую вечность, потому что у вас никогда не кончится количество попыток.
Чтобы этого избежать, математики придумали множество умных способов быстро найти подходящие значения для этих весов, не пытаясь их слишком много. Вот один способ:
Во-первых, напишите простое уравнение, которое представляет шаг № 2 выше:
Это ваша функция затрат.
Теперь давайте перепишем точно такое же уравнение, но используя математический жаргон машинного обучения (который пока можно игнорировать):
θ - это то, что представляет ваш текущий вес. J (θ) означает «стоимость для вашего текущего веса».
Это уравнение показывает, насколько неверна наша функция оценки цены текущим установленным весам.
Если мы изобразим это уравнение затрат для всех возможных значений наших весов для number_of_bedrooms и sqft, мы получим график, который может выглядеть примерно так:
График нашей функции затрат выглядит как чаша. Вертикальная ось представляет стоимость.
На этом графике самая низкая точка синего цвета - это самая низкая цена, поэтому наша функция наименее ошибочна. В высших точках мы ошибаемся больше всего. Итак, если мы сможем найти веса, которые приведут нас к самой низкой точке на этом графике, мы получим ответ!
Поэтому нам просто нужно отрегулировать наши веса так, чтобы мы «спускались вниз» на этом графике к самой низкой точке. Если мы продолжаем вносить небольшие корректировки в наши веса, которые всегда будут приближаться к самой низкой точке, мы в конечном итоге добьемся этого без необходимости пробовать слишком много разных весов.
Если вы что-нибудь помните из исчисления, вы можете вспомнить, что если вы берете производную функции, она сообщает вам наклон касательной к функции в любой точке. Другими словами, он говорит нам, какой путь спускается для любой заданной точки на нашем графике. Мы можем использовать эти знания, чтобы идти под гору.
Итак, если мы вычислим частную производную нашей функции затрат по каждому из наших весов, то мы сможем вычесть это значение из каждого веса. Это сделает нас на один шаг ближе к подножию холма. Продолжайте делать это, и в конечном итоге мы достигнем подножия холма и получим наилучшие возможные значения для нашего веса. (Если это не имело смысла, не волнуйтесь и продолжайте читать).
Это краткое изложение одного из способов найти наилучшие веса для вашей функции, называемого пакетным градиентным спуском. Не бойтесь копать глубже, если вам интересно узнать подробности.
Когда вы используете библиотеку машинного обучения для решения реальной проблемы, все это будет сделано за вас. Но по-прежнему полезно иметь представление о том, что происходит.
Что еще вы удобно пропустили?
Описанный мной трехэтапный алгоритм называется многомерной линейной регрессией. Вы оцениваете уравнение для линии, которая проходит через все точки данных вашего дома. Затем вы используете это уравнение, чтобы угадать продажную цену домов, которые вы никогда раньше не видели, исходя из того, где этот дом будет отображаться в вашей строке. Это действительно мощная идея, и с ее помощью вы можете решить «настоящие» проблемы.
Но хотя подход, который я вам показал, может работать в простых случаях, он не будет работать во всех случаях. Одна из причин заключается в том, что цены на жилье не всегда достаточно просты, чтобы следовать непрерывной линии.
Но, к счастью, есть много способов справиться с этим. Существует множество других алгоритмов машинного обучения, которые могут обрабатывать нелинейные данные (например, нейронные сети или SVM с ядрами). Есть также способы более разумного использования линейной регрессии, которые позволяют подбирать более сложные линии. Во всех случаях применима одна и та же основная идея поиска лучших весов.
Кроме того, я игнорировал идею переобучения. Легко придумать набор весов, который всегда идеально подходит для прогнозирования цен на дома в исходном наборе данных, но на самом деле никогда не работает для любых новых домов, которых не было в исходном наборе данных. Но есть способы справиться с этим (например, регуляризация и использование набора данных перекрестной проверки). Изучение того, как справиться с этой проблемой, является ключевой частью обучения успешному применению машинного обучения.
Другими словами, хотя основная концепция довольно проста, необходимы определенные навыки и опыт, чтобы применить машинное обучение и получить полезные результаты. Но это навык, которому может научиться любой разработчик!
Магия машинного обучения?
Как только вы начнете понимать, насколько легко методы машинного обучения можно применить к задачам, которые кажутся действительно сложными (например, распознавание рукописного ввода), вы начинаете чувствовать, что можете использовать машинное обучение для решения любой проблемы и получения ответа, если у вас достаточно данные. Просто введите данные и наблюдайте, как компьютер волшебным образом вычисляет уравнение, соответствующее этим данным!
Но важно помнить, что машинное обучение работает только в том случае, если проблема действительно решается с помощью имеющихся данных.
Например, если вы построите модель, которая прогнозирует цены на жилье на основе типа горшечных растений в каждом доме, она никогда не сработает. Просто нет никакой связи между горшечными растениями в каждом доме и продажной ценой дома. Итак, как бы он ни старался, компьютер никогда не сможет установить связь между ними.
Вы можете моделировать только реально существующие отношения.
Так что помните: если специалист-человек не может использовать данные для решения проблемы вручную, компьютер, вероятно, тоже не сможет. Вместо этого сосредоточьтесь на проблемах, где человек может решить проблему, но где было бы здорово, если бы компьютер мог решить ее намного быстрее.
Как узнать больше о машинном обучении
На мой взгляд, самая большая проблема с машинным обучением сейчас заключается в том, что оно в основном живет в мире академических кругов и коммерческих исследовательских групп. Существует не так много легкого для понимания материала для людей, которые хотели бы получить широкое понимание, не становясь на самом деле экспертами. Но с каждым днем становится немного лучше.
Если вы хотите опробовать то, что вы узнали из этой статьи, я сделал курс, который проведет вас через каждый шаг этой статьи, включая написание всего кода. Попробуйте!
Если вы хотите углубиться, бесплатный курс Эндрю Нг Машинное обучение на Coursera станет отличным следующим шагом. Я очень рекомендую это. Он должен быть доступен всем, у кого есть Comp. Sci. степень и который запоминает очень минимальное количество математики.
Кроме того, вы можете поиграть с множеством алгоритмов машинного обучения, загрузив и установив SciKit-Learn. Это среда Python, в которой есть версии всех стандартных алгоритмов в виде «черного ящика».