однострочники пайтон. Однострочники Python лаконичный и содержательный код by Кристи. Однострочники
Скачать 4.44 Mb.
|
137 без меток классов. Например, у вас могут быть данные о покупателях (до- пустим, их возраст и уровень дохода), но никаких меток классов для точек данных. Чтобы извлечь полезную информацию из подобных данных, понадо- бится еще одна разновидность машинного обучения: машинное обучение без учителя. А точнее, мы научимся искать кластеры схожих точек данных — это важное подмножество машинного обучения без учителя. Кластеризация методом k-средних в одной строке кода Если и есть алгоритм кластеризации, который пригодится и обычному спе- циалисту в области компьютерных наук, и исследователю данных, и специ- алисту по машинному обучению, то это алгоритм кластеризации методом k-средних (k-means algorithm). В текущем разделе мы обсудим общую идею, а также рассмотрим, когда и как использовать его с помощью всего одной строки кода на Python. Общее описание В предыдущем примере мы рассматривали обучение с учителем, при котором обучающие данные маркированы, то есть известны выходные значения для всех входных признаков в обучающих данных. Но на практике так бывает далеко не всегда. Зачастую исследователи сталкиваются с немаркированными данными, особенно в приложениях аналитической обработки данных, когда непонятно, какой выходной сигнал будет «оптимальным». В подобном слу- чае предсказать что-либо невозможно (поскольку отсутствует эталонный выходной сигнал), но все равно можно извлечь из этих немаркированных наборов данных немало полезной информации (например, найти кластеры схожих немаркированных данных). Модели, работающие с немаркирован- ными данными, относятся к категории моделей машинного обучения без учителя (unsupervised learning). В качестве примера представьте, что работаете над стартапом, обслуживаю- щим различную целевую аудиторию, разного возраста и с разным доходом. Ваш начальник просит найти определенное количество персон, лучше всего соответствующих вашей целевой аудитории. Для выявления усредненных персон заказчиков в вашей компании можно воспользоваться методами кластеризации. На рис. 4.10 приведен пример. 138 Глава 4. Машинное обучение Рис. 4.10. Наблюдаемые данные о заказчиках в двумерном пространстве На данном рисунке можно с легкостью выделить три типа персон различ- ного уровня доходов и возраста. Но как сделать это алгоритмически? Тут-то и вступают в дело алгоритмы кластеризации наподобие очень популярного алгоритма кластеризации методом k-средних. При заданном наборе дан- ных и целом числе k алгоритм кластеризации методом k-средних находит k кластеров данных, таких что расстояние между центром кластера (так на- зываемым центроидом) и данными в этом кластере минимально. Другими словами, путем выполнения алгоритма кластеризации методом k-средних можно найти различные персоны в ваших наборах данных, как показано на рис. 4.11. Центры кластеров (черные точки) отмечают кластеризованные данные о заказчиках. Каждый центр кластера можно считать одной персоной за- казчика. Таким образом, у нас есть три персоны: 20-летний заказчик с до- ходом в 2000 долларов, 25-летний с доходом в 3000 долларов и 40-летний с доходом в 4000 долларов. Замечательно то, что алгоритм кластеризации методом k-средних находит эти центры кластеров даже в многомерном Кластеризация методом k-средних в одной строке кода 139 Рис. 4.11. Данные о заказчиках с персонами заказчиков (центроидами кластеров) в двумерном пространстве пространстве (в котором найти их визуально для человека было бы не- просто). Алгоритм кластеризации методом k-средних требует на входе «количество центров кластеров k». В данном случае мы смотрим на данные и каким-то чудесным образом выбираем k = 3. Более продвинутые алгоритмы могут на- ходить количество центров кластеров автоматически (например, взгляните на статью Learning the k in K-Means 2004 года, написанную Грегом Хамерли и Чарльзом Илканом). Как же работает алгоритм кластеризации методом k-средних? По существу, он сводится к следующей процедуре: Задать случайные начальные значения для центров кластеров (центроидов) Повторять до достижения сходимости Распределить все точки данных по ближайшим к ним центрам кластеров Повторить вычисление всех центров кластеров, приписанных к ним всех точек данных как центроидов 140 Глава 4. Машинное обучение Все это приводит к многочисленным итерациям цикла: сначала данные приписываются к k центрам кластеров, а затем каждый центр кластера пере- считывается как центроид приписанных к нему данных. Реализуем его! Рассмотрим следующую задачу: найти в данном наборе двумерных данных о зарплатах (отработанные часы, заработанные деньги) два кластера со- трудников, работающих одинаковое количество часов и зарабатывающих примерно одинаковые деньги. Код Как реализовать все это в одной строке кода? К счастью, библиотека scikit- learn Python включает готовую эффективную реализацию алгоритма кла- стеризации методом k-средних. Листинг 4.3 демонстрирует фрагмент кода с однострочником, выполняющим кластеризацию методом k-средних. Листинг 4.3. Кластеризация методом k-средних в одной строке ## Зависимости from sklearn.cluster import KMeans import numpy as np ## Данные (Отработано (ч) / Зарплата ($)) X = np.array([[35, 7000], [45, 6900], [70, 7100], [20, 2000], [25, 2200], [15, 1800]]) ## Однострочник kmeans = KMeans(n_clusters=2).fit(X) ## Результат cc = kmeans.cluster_centers_ print(cc) Каковы же будут результаты выполнения этого фрагмента кода? Попро- буйте догадаться, даже если не понимаете некоторых нюансов синтаксиса. Это поможет вам осознать пробелы в своих знаниях и намного лучше под- готовиться к восприятию алгоритма. Принцип работы В первых строках мы импортируем модуль KMeans из пакета sklearn. cluster . Этот модуль отвечает за саму кластеризацию. Необходимо также Кластеризация методом k-средних в одной строке кода 141 импортировать библиотеку NumPy, поскольку модуль KMeans использует в своей работе ее массивы. Наши данные — двумерные, они соотносят количество отработанных часов с зарплатой некоторых работников. На рис. 4.12 показаны шесть точек дан- ных из этого набора данных. Рис. 4.12. Данные по зарплатам сотрудников Задача — найти два центра кластеров, лучше всего удовлетворяющих этим данным: ## Однострочник kmeans = KMeans(n_clusters=2).fit(X) В этом однострочнике создается новый объект KMeans , который отвечает за выполнение алгоритма. При создании объекта KMeans описывается ко- личество центров кластеров с помощью аргумента функции n_clusters А затем мы просто вызываем метод экземпляра fit(X) для выполнения алгоритма кластеризации методом k-средних на входных данных X . Теперь 142 Глава 4. Машинное обучение все результаты содержатся в объекте KMeans . Осталось только извлечь эти результаты из его атрибутов: cc = kmeans.cluster_centers_ print(cc) Обратите внимание, что по соглашению в пакете sklearn в некоторых на- званиях атрибутов в конце указывается подчеркивание (например, cluster_ centers_ ), означающее, что эти атрибуты были созданы динамически на этапе обучения (в ходе вызова функции fit() ). До этого их не существовало. Для Python такое соглашение не является стандартным (к подчеркиванию в конце названий прибегают обычно лишь во избежание конфликтов на- званий с ключевыми словами Python — например, переменная list_ вместо list ). Однако когда вы привыкнете, то почувствуете удобство согласован- ного использования атрибутов в пакете sklearn . Какие же будут центры кластеров и вообще результат работы данного фрагмента кода? Взгляните на рис. 4.13. Рис. 4.13. Данные по зарплатам сотрудников с центрами кластеров в двумерном пространстве Метод k-ближайших соседей в одной строке кода 143 На рисунке видны два центра кластеров: (20, 2000) и (50, 7000). Это также результат нашего однострочника Python. Эти кластеры соответствуют двум персонам сотрудников: первый работает 20 часов в неделю и зарабатывает 2000 долларов в месяц, а второй работает 50 часов в неделю и зарабатывает 7000 долларов в месяц. Эти два типа персон неплохо удовлетворяют на- шим данным. Следовательно, результат выполнения нашего однострочного фрагмента кода выглядит так: ## Результат cc = kmeans.cluster_centers_ print(cc) ''' [[ 50. 7000.] [ 20. 2000.]] ''' Резюмируя: в этом разделе вы познакомились с важным подвидом ма- шинного обучения без учителя: кластеризацией. Алгоритм кластеризации методом k-средних — простой, эффективный и популярный способ вы- деления k кластеров из многомерных данных. «Под капотом» алгоритм в цикле пересчитывает центры кластеров и перераспределяет все точки данных по ближайшим к ним центрам кластеров, пока не будут найдены оптимальные кластеры. Однако кластеры не всегда идеально подходят для поиска схожих элементов данных. Многие наборы данных не про- являют кластерной организации, но информацию о расстоянии все равно хотелось бы использовать для машинного обучения и предсказания. Не будем покидать многомерное пространство и рассмотрим еще один способ задействовать (евклидово) расстояние между значениями данных: алго- ритм k-ближайших соседей. Метод k-ближайших соседей в одной строке кода Популярный алгоритм k-ближайших соседей (K-Nearest Neighbors, KNN) используется для регрессии и классификации во многих приложениях, в частности в рекомендательных системах, а также при классификации изо- бражений и финансовом прогнозе. На нем основаны многие продвинутые алгоритмы машинного обучения (например, предназначенные для инфор- мационного поиска). Вне всякого сомнения, понимание KNN — важный элемент качественного обучения в сфере computer science. 144 Глава 4. Машинное обучение Общее описание Алгоритм KNN — надежный, простой и популярный метод машинного обу- чения. Несмотря на простоту реализации, это конкурентоспособная и бы- страя методика машинного обучения. Во всех прочих моделях машинного обучения, обсуждавшихся выше, обучающие данные использовались для вычисления представления исходных данных, на основе которого затем можно будет предсказывать, классифицировать или кластеризовать новые данные. Например, в алгоритмах линейной и логистической регрессии опи- сываются параметры обучения, в то время как в алгоритме кластеризации вычисляются центры кластеров, исходя из обучающих данных. Алгоритм KNN отличается в этом отношении. В отличие от других подходов, в нем не вычисляется новая модель (или представление), а используется в качестве модели весь набор данных целиком. Да, все правильно. Модель машинного обучения — всего лишь набор на- блюдений. Каждый элемент обучающих данных — часть модели. У такого подхода есть свои преимущества и недостатки. Неудобен он тем, что разме- ры модели могут резко увеличиваться с ростом объема обучающих данных, а значит, может понадобиться предварительный этап обработки — филь- трации или выборки. Большое преимущество его, впрочем, в относитель- ной простоте этапа обучения (достаточно просто добавить в модель новые значения данных). Кроме того, алгоритм KNN можно использовать как для предсказания, так и для классификации. При заданном входном векторе x алгоритм выглядит следующим образом. 1. Найти k ближайших соседей x (в соответствии с заранее выбранной метрикой расстояния). 2. Агрегировать k ближайших соседей в одно значение предсказания или классификации. При этом может использоваться любая агрегирующая функция, например взятие среднего, максимального или минималь- ного значения. Посмотрим для примера на компанию, торгующую недвижимостью. У нее есть большая база покупателей и цен на дома (рис. 4.14). В один прекрасный момент клиент спрашивает, сколько может стоить дом площадью 52 м 2 . Вы запрашиваете свою модель KNN и немедленно получаете ответ: 33 167 дол- ларов. И действительно, в ту же неделю клиент находит дом за 33 489 дол- ларов. Как же системе KNN удалось произвести настолько безошибочное предсказание? Метод k-ближайших соседей в одной строке кода 145 Рис. 4.14. Вычисление цены дома D на основе цен его трех ближайших соседей A, B и C Прежде всего, система KNN просто вычисляет k = 3 ближайших соседей для запроса D = 52 м 2 (при использовании евклидового расстояния). Три ближайших соседа: A, B и C с ценами 34 000, 33 500 и 32 000 долларов со- ответственно. Далее эти три ближайших соседа агрегируются, а именно вычисляется их среднее арифметическое значение. А поскольку в этом примере k = 3, мы назовем нашу модель 3NN. Конечно, можно использовать различные функции подобия, параметр k и метод агрегирования, получая в результате все более изощренные прогностические модели. Еще одно преимущество KNN — легкость его адаптации к поступающим но- вым наблюдениям, что справедливо не для всех моделей машинного обу чения. Из этого следует очевидный его недостаток — рост вычислительной сложности поиска k-ближайших соседей по мере добавления новых точек данных. Чтобы решить эту проблему, можно непрерывно исключать из модели устаревшие значения. Как я уже упоминал, с помощью KNN можно также решать за- дачи классификации. Вместо усреднения по k ближайшим соседям можно использовать механизм голосования: все ближайшие соседи «голосуют» за свои классы, и побеждает класс, за который «отдано больше всего голосов». Код Посмотрим, как можно использовать KNN на языке Python — в одной строке кода (листинг 4.4). 146 Глава 4. Машинное обучение Листинг 4.4. Выполнение алгоритма KNN с помощью одной строки кода на Python ## Зависимости from sklearn.neighbors import KNeighborsRegressor import numpy as np ## Данные (площадь дома (в квадратных метрах) / цена дома ($)) X = np.array([[35, 30000], [45, 45000], [40, 50000], [35, 35000], [25, 32500], [40, 40000]]) ## Однострочник KNN = KNeighborsRegressor(n_neighbors=3).fit(X[:,0].reshape(-1,1), X[:,1]) ## Результат res = KNN.predict([[30]]) print(res) Каковы же будут результаты выполнения этого фрагмента кода? Принцип работы Чтобы наглядно представить результат, построим график данных по ценам на жилье (рис. 4.15). Рис. 4.15. Данные по ценам на жилье Метод k-ближайших соседей в одной строке кода 147 Видите общую тенденцию? Можно предположить, что с ростом площади дома его рыночная стоимость также будет линейно расти. Вдвое больше квадратных метров — вдвое больше цена. В коде (см. листинг 4.4) клиент запрашивает предсказание цены для дома площадью 30 квадратных метров. Что же предскажет KNN при k = 3 (то есть 3NN)? Взгляните на рис. 4.16. Рис. 4.16. Данные о стоимости домов в двумерном пространстве с предсказанием цены дома для новой точки данных (площадь дома равна 30 м 2 ) с помощью алгоритма KNN Красота, правда? Алгоритм KNN находит три ближайших по площади дома и возвращает предсказанную стоимость дома как среднее k = 3 ближайших соседей. Таким образом, в результате получается 32 500 долларов. Если вам не вполне понятны преобразования данных в этом однострочнике, то я вкратце поясню их: KNN = KNeighborsRegressor(n_neighbors=3).fit(X[:,0].reshape(-1,1), X[:,1]) 148 Глава 4. Машинное обучение Прежде всего мы создаем новую модель машинного обучения — KNeigh- borsRegressor . Если нужно использовать KNN для классификации, то следует применить KNeighborsClassifier Далее мы обучаем модель с помощью функции fit() с двумя параметрами, первый из которых определяет входной сигнал (размер дома), а второй — выходной сигнал (стоимость дома). Оба параметра должны представлять собой массивоподобные структуры данных. Например, если нужно передать значение 30 в качестве входных данных, то следует передать его в виде [30] Дело в том, что входные данные могут быть многомерными, а не только одномерными. Поэтому мы меняем форму входного сигнала: print(X[:,0]) "[35 45 40 35 25 40]" print(X[:,0].reshape(-1,1)) """ [[35] [45] [40] [35] [25] [40]] """ Обратите внимание, что при использовании этого одномерного массива NumPy в качестве входных данных функции fit() она не будет работать, поскольку ожидает массив (массивоподобных) наблюдений, а не массив целых чисел. Резюмируя: из этого однострочника вы узнали, как создать первый KNN- регрессор одной строкой кода. Если у вас много меняющихся данных и об- новлений модели, то KNN — как раз для вас! А теперь перейдем к безумно популярной сейчас модели машинного обучения: нейронным сетям. Нейросетевой анализ в одной строке кода В последние годы популярность нейронных сетей сильно возросла. В част- ности, благодаря усовершенствованию алгоритмов и методик обучения в этой сфере, но также и вследствие усовершенствования аппаратного обе- спечения и возникновения технологии универсальных GPU (GPGPU). В этом разделе мы расскажем вам о многослойном перцептроне (multilayer Нейросетевой анализ в одной строке кода 149 perceptron, MLP) — одном из самых популярных нейросетевых представ- лений. Прочитав раздел, вы сможете создать собственную нейронную сеть в одной строке кода Python! Общее описание Для этого однострочника я вместе с коллегами по посвященной Python рас- сылке подготовил специальный набор данных. Я ставил перед собой задачу создания правдоподобного набора данных, так что попросил своих подписчи- ков поучаствовать в эксперименте по генерации данных для текущей главы. Данные Если вы читаете эту книгу, значит, вас интересует изучение Python. Для создания интересного набора данных я задал моим подписчикам шесть анонимных вопросов об их опыте работы с Python и доходах. Ответы на эти вопросы и будут играть роль обучающих данных для простого примера нейронной сети (реализованной в однострочнике Python). В основе обучающих данных лежат ответы на следующие шесть вопросов. 1. Сколько часов за последние семь дней вы работали с кодом на Python? 2. Сколько лет назад вы начали изучать компьютерные науки? 3. Сколько книг по написанию кода стоит на ваших полках? 4. Какой процент вашего времени, посвященного Python, вы тратите на работу над реальными проектами? 5. Сколько вы зарабатываете в месяц (округленно до тысяч долларов) благодаря своим профессиональным навыкам (в самом широком смысле)? 6. Какой у вас приблизительно рейтинг на Finxter, округленно до сотен баллов? Первые пять вопросов 1 — входной сигнал нейронной сети, а шестой — вы- ходной. В этом однострочнике мы производим регрессию на основе нейрон- ной сети. Другими словами, мы предсказываем числовое значение (уровень владения Python) по числовым входным признакам. Мы не станем изучать в нашей книге классификацию с помощью нейронных сетей — еще одну их сильную сторону. 1 Точнее, ответы на них. |