однострочники пайтон. Однострочники Python лаконичный и содержательный код by Кристи. Однострочники
Скачать 4.44 Mb.
|
Общее описание Анализ ассоциаций основывается на данных об истории покупок, например, можно получить информацию о том, что «купившие товар X покупают и то- вар Y» на Amazon. Подобная связь различных товаров — один из важнейших принципов маркетинга, поскольку она не только связывает дополняющие друг друга товары, но и дает покупателю определенное социальное дока- зательство — знание о том, что другие люди тоже купили данный товар, делающее психологически более комфортной его покупку. А значит, это прекрасный инструмент для маркетологов. Рассмотрим практический пример на рис. 3.4. Простейший анализ ассоциаций: купившие товар X покупают и товар Y 113 Рис. 3.4. Матрица « Товар — Покупатель » : какой покупатель купил какие товары? Четыре покупателя — Алиса, Боб, Луи и Лариса — купили различные соче- тания товаров: книгу, игру, футбольный мяч, ноутбук и наушники. Пусть вам известны все продукты, купленные каждым из них, за исключением того, что Луи купил ноутбук. Как вы думаете, насколько вероятно, что Луи его купит? Анализ ассоциаций (коллаборативная фильтрация) дает ответ на этот вопрос. В основе его лежит допущение, что два человека, производивших схожие действия в прошлом (например, покупавших схожие товары), скорее всего, будут поступать схожим образом и в будущем. Поведение Луи как по- купателя схоже с поведением Алисы, а она купила ноутбук. Следовательно, рекомендательная система должна предсказать, что Луи тоже, вероятно, купит ноутбук. Следующий фрагмент кода упрощает решение этой задачи. Код Попробуем ответить на вопрос: какая доля покупателей купит две книги сразу? На основе этих данных рекомендательная система может предло- жить покупателям купить «набор» книг, если изначально похоже, что они собираются купить только одну (листинг 3.29). Листинг 3.29. Однострочное решение, использующее срезы, аргумент axis, свойство shape и простейшие арифметические операции над массивами с транслированием ## Зависимости import numpy as np ## Данные: каждая строка соответствует корзине для покупок конкретного покупателя 114 Глава 3. Наука о данных ## строка = [курс 1, курс 2, эл. книга 1, эл. книга 2] ## значение 1 означает, что товар был куплен basket = np.array([[0, 1, 1, 0], [0, 0, 0, 1], [1, 1, 0, 0], [0, 1, 1, 1], [1, 1, 1, 0], [0, 1, 1, 0], [1, 1, 0, 1], [1, 1, 1, 1]]) ## Однострочник copurchases = np.sum(np.all(basket[:,2:], axis = 1)) / basket.shape[0] ## Результат print(copurchases) Какими же будут результаты выполнения этого фрагмента кода? Принцип работы Массив данных basket содержит по одной строке для каждого покупателя и по столбцу для каждого товара. Первые два товара с индексами столб- цов 0 и 1 — онлайн-курсы, а последние два с индексами столбцов 2 и 3 — электронные книги. Значение 1 в ячейке (i,j) означает, что покупатель i купил товар j Наша задача — вычислить долю покупателей, купивших обе электронные книги, так что нас интересуют только столбцы 2 и 3. Следовательно, прежде всего мы выделяем соответствующие столбцы из исходного массива и полу- чаем такой подмассив: print(basket[:,2:]) """ [[1 0] [0 1] [0 0] [1 1] [1 0] [1 0] [0 1] [1 1]] """ В итоге мы получили массив, состоящий только из третьего и четвертого столбцов. Поиск лучше всего продающихся наборов с помощью промежуточного анализа 115 Функция all() библиотеки NumPy проверяет, все ли значения в заданном массиве NumPy равны True . В этом случае она возвращает True . В противном случае она возвращает False . При указании аргумента axis функция all() делает то же самое, но по заданной оси. ПРИМЕЧАНИЕ Вы наверняка обратите внимание, что аргумент axis снова и снова встре- чается во многих функциях NumPy, поэтому имеет смысл потратить немного времени и разобраться с ним как следует. Указанная ось коор- динат схлопывается в одно значение в зависимости от соответствующей агрегирующей функции (в данном случае all()) Следовательно, в результате применения функции all() к подмассиву по- лучится следующее: print(np.all(basket[:,2:], axis = 1)) # [False False False True False False False True] Говоря простым языком, только четвертый и последний покупатели приоб- рели обе электронные книги. А поскольку нас интересует доля покупателей, мы суммируем этот булев массив, получая в результате 2 , и делим полученное на количество поку- пателей, 8. В результате мы получаем 0.25 — долю покупателей, купивших обе электронные книги. Резюмируя: вы укрепили свое знание основ библиотеки NumPy, таких как атрибут shape и аргумент axis , а также научились использовать их вместе для анализа совместных покупок различных товаров. Далее мы продолжим работу над этим примером и изучим более продвинутые методики агреги- рования массивов с помощью сочетания нескольких особых возможностей NumPy и Python, а именно транслирования и спискового включения. Поиск лучше всего продающихся наборов с помощью промежуточного анализа ассоциаций Исследуем анализ ассоциаций более подробно. 116 Глава 3. Наука о данных Общее описание Возьмем пример из предыдущего раздела: покупатели приобретают отдель- ные товары из каталога четырех товаров. Ваша компания хотела бы повысить продажи сопутствующих товаров (предложив покупателям дополнительные, зачастую связанные товары). Для каждого сочетания товаров необходимо вычислить, насколько часто их приобретает один и тот же покупатель, и най- ти два товара, чаще всего приобретаемых вместе. Вы уже знаете все, что нужно для решения данной задачи, поэтому при- ступим! Код Следующий однострочник предназначен для поиска двух чаще всего при- обретаемых вместе товаров (листинг 3.30). Листинг 3.30. Однострочное решение, использующее лямбда-функцию в качестве параметра key функции max, списковое включение и булевы операторы с транслированием ## Зависимости import numpy as np ## Данные: каждая строка соответствует корзине для покупок конкретного покупателя ## строка = [курс 1, курс 2, эл. книга 1, эл. книга 2] ## значение 1 означает, что товар был куплен basket = np.array([[0, 1, 1, 0], [0, 0, 0, 1], [1, 1, 0, 0], [0, 1, 1, 1], [1, 1, 1, 0], [0, 1, 1, 0], [1, 1, 0, 1], [1, 1, 1, 1]]) ## Однострочник (разбит на две строки) copurchases = [(i,j,np.sum(basket[:,i] + basket[:,j] == 2)) for i in range(4) for j in range(i+1,4)] ## Результат print(max(copurchases, key=lambda x:x[2])) Какими же будут результаты выполнения этого однострочного решения? Поиск лучше всего продающихся наборов с помощью промежуточного анализа 117 Принцип работы Массив данных состоит из данных о покупках, по одной строке на покупателя и по столбцу на товар. Наша задача — получить список кортежей, каждый из которых описывает конкретное сочетание товаров и частоту покупки этих то- варов вместе. Первые два значения кортежа в каждом элементе списка должны быть индексами столбцов (сочетания двух товаров), а третье должно отражать число раз, когда они покупались вместе. Например, кортеж (0,1,4) означает, что покупатели, приобретавшие товар 0, также 4 раза покупали товар 1. Как же добиться этого? Рассмотрим наш однострочник по частям, немного его переформатировав, поскольку он слишком длинный и не помещается на одной строке книги: ## Однострочник (разбит на две строки) copurchases = [(i,j,np.sum(basket[:,i] + basket[:,j] == 2)) for i in range(4) for j in range(i+1,4)] Как видно из внешней формы [(..., ..., ...) for in for in ...] , мы создали список кортежей с помощью спискового включения (см. гла- ву 2). Нас интересуют все уникальные сочетания индекса столбца массива с четырьмя столбцами. Вот результат одной только внешней части нашего однострочника: print([(i,j) for i in range(4) for j in range(i+1,4)]) # [(0, 1), (0, 2), (0, 3), (1, 2), (1, 3), (2, 3)] Итак, в списке содержится шесть кортежей, все — уникальные сочетания индексов столбцов. Теперь можно заняться и третьим элементом кортежа: количеством раз, когда товары i и j покупали вместе: np.sum(basket[:,i] + basket[:,j] == 2) Мы выделяем оба столбца i и j из исходного массива NumPy с помощью срезов. А затем складываем их поэлементно. И проверяем поэлементно в полученном массиве, равна ли сумма 2, что означает наличие 1 в обоих столбцах, а значит, и то, что были куплены оба товара. Результат представ- ляет собой булев массив, в котором значения True соответствуют покупке обоих товаров вместе одним покупателем. 118 Глава 3. Наука о данных Все полученные кортежи мы сохраняем в списке copurchases . Вот его эле- менты: print(copurchases) # [(0, 1, 4), (0, 2, 2), (0, 3, 2), (1, 2, 5), (1, 3, 3), (2, 3, 2)] Теперь осталось только найти два товара, которые покупали вместе чаще всего: ## Результат print(max(copurchases, key=lambda x:x[2])) Для поиска наибольшего элемента списка мы воспользовались функцией max() . Мы описали ключевую функцию, принимающую на входе кортеж и возвращающую третье значение кортежа (количество одновременных покупок), а затем нашли максимальное из этих значений. Результат вы- полнения однострочника выглядит следующим образом: ## Результат print(max(copurchases, key=lambda x:x[2])) # (1, 2, 5) Второй и третий товары покупали вместе пять раз. Ни одно из прочих соче- таний товаров не достигло таких показателей. Следовательно, можете смело сказать начальнику, что нужно стараться дополнительно продать товар 2 при продаже товара 1, и наоборот. Итак, вы узнали о разнообразных базовых возможностях как Python, так и NumPy, в частности о транслировании, списковом включении, лямбда- функциях и ключевых функциях. Зачастую своей выразительностью код Python обязан как раз сочетанию множества различных элементов языка, функций и трюков. Итоги главы В этой главе вы познакомились с основами NumPy: массивами, формами, осями координат, типами, транслированием, расширенным доступом по индексу, срезами, сортировкой, поиском, агрегированием и статистическими показателями. Вы также улучшили основные навыки работы с Python, по- работав на практике с такими важными вещами, как списковое включение, логические операции и лямбда-функции. Наконец, что не менее важно, вы Итоги главы 119 научились лучше читать, понимать и писать лаконичный код, по ходу дела решая основополагающие задачи науки о данных. Продолжим столь же быстрое изучение различных интересных вопросов в сфере Python. Далее мы углубимся в захватывающий мир машинного обу- чения. Вы познакомитесь с простейшими алгоритмами машинного обучения и узнаете, как воспользоваться всеми их возможностями в одной строке кода с помощью популярной библиотеки scikit-learn. Она хорошо знакома любому специалисту по машинному обучению. Но не бойтесь — только что полученные вами навыки работы с NumPy помогут вам разобраться в опи- санных далее фрагментах кода. 4 Машинное обучение Машинное обучение (МО) встречается практически во всех сферах computer science. В последние несколь- ко лет я был на конференциях, посвященных распреде- ленным системам, базам данных и потоковой обработке, и везде сталкивался с машинным обучением. На некоторых конференциях в основе более чем половины представленных исследований лежали методы машинного обучения. Специалисту в области computer science необходимо знать основные по- нятия и алгоритмы машинного обучения в дополнение к общему набору профессиональных навыков. В этой главе вы познакомитесь с важней- шими алгоритмами и методами МО и разберете десять однострочников, ориентированных на практическое применение этих алгоритмов в ваших проектах. Основы машинного обучения с учителем Основная цель машинного обучения — безошибочные прогнозы на основе имеющихся данных. Пусть нам нужно написать алгоритм для предсказания курса конкретных акций на следующие два дня. Для этого необходимо обу- чить модель МО. Но что такое модель? Основы машинного обучения с учителем 121 С точки зрения пользователя машинного обучения, модель МО представляет собой «черный ящик» (рис. 4.1), на вход которого подаются данные, а на выходе получаются предсказания. Рис. 4.1. Модель машинного обучения в виде « черного ящика » В этой модели входные данные — числовое значение или многомерный вектор числовых значений — обозначаются переменной x и называются при- знаками (features). Далее «черный ящик» делает фокус-покус и обрабатывает введенные данные. Через некоторое время он возвращает предсказание y — выходной сигнал модели на основе заданных входных признаков. В задачах регрессии предсказание состоит из одного или нескольких числовых значе- ний — как и входные признаки. Машинное обучение с учителем делится на два отдельных этапа: обучение и выполнение вывода. Этап обучения На этапе обучения мы демонстрируем модели, каким должен быть выходной сигнал y' при заданном входном сигнале x. Выданное моделью предсказа- ние y сравнивается с y', и в случае их расхождения модель обновляется так, чтобы генерировать более близкий к y' выходной сигнал, как показано на рис. 4.2. Посмотрим на пример из сферы распознавания образов. Пред- ставьте, что мы обучаем модель предсказывать названия фруктов (выходные сигналы) по их изображениям (входные сигналы). Например, на одном из обучающих изображений показан банан, но модель ошибочно говорит, что это яблоко. Поскольку желаемый выходной сигнал отличается от прогноза модели, мы меняем ее, чтобы в следующий раз она правильно выдавала предсказание банан. Демонстрация модели желаемых выходных сигналов для различных вход- ных сигналов и ее подгонка и означают обучение модели на обучающих дан- ных. Со временем модель усваивает, какие выходные сигналы вы хотели бы видеть для конкретных входных сигналов. Именно поэтому в XXI столетии 122 Глава 4. Машинное обучение так важны данные: модель хороша настолько, насколько хороши ее обучаю- щие данные. Без хороших обучающих данных модель заведомо не покажет хороших результатов. Проще говоря, обучающие данные играют роль «учи- теля», направляющего процесс машинного обучения. Отсюда и название машинное обучение с учителем. Рис. 4.2. Этап обучения модели Этап выполнения вывода На этапе выполнения вывода обученная модель используется с целью пред- сказания выходных значений для новых входных признаков x. Обратите внимание, что модель способна предсказывать выходные сигналы для ни- когда не встречавшихся в обучающих данных входных сигналов. Например, модель предсказания фруктов с этапа обучения теперь может определять их названия (усвоенные из обучающих данных) на изображениях, никогда ранее ей не встречавшихся. Другими словами, адекватные модели машин- ного обучения обладают способностью к обобщению (generalization), то есть умеют использовать накопленный на обучающих данных опыт, чтобы пред- сказывать результаты для новых входных сигналов. Проще говоря, хорошо обобщающие модели генерируют безошибочные предсказания для новых входных данных. Полученные в результате обобщения предсказания для входных данных, не встречавшихся модели, — одна из сильных сторон машинного обучения, а также основная причина его популярности среди широкого спектра приложений. Линейная регрессия Линейная регрессия — наиболее часто встречающийся в начальных руковод- ствах по машинному обучению алгоритм. Он часто применяется для решения задач регрессии, в которых модель предсказывает отсутствующие значения данных на основе имеющихся. Немаловажное преимущество линейной регрессии как для преподавателей, так и и для тех, кто ею пользуется, — ее Линейная регрессия 123 простота. Что, впрочем, отнюдь не означает, что с ее помощью нельзя решать реальные задачи! У линейной регрессии множество сценариев применения на практике в самых разнообразных сферах, например исследованиях рын- ка, астрономии и биологии. Из этого раздела вы узнаете все, что нужно для начала работы с линейной регрессией. Общее описание Как с помощью линейной регрессии предсказать курс акций в заданный день? Прежде чем ответить на этот вопрос, приведем несколько опреде- лений. Любая модель машинного обучения состоит из параметров модели. Пара- метры модели — внутренние переменные ее конфигурации, оцениваемые на основе имеющихся данных. Эти параметры модели определяют вычис- леннные моделью предсказания по заданным входным признакам. В случае линейной регрессии параметры модели называются коэффициентами. Наверное, вы помните из школьного курса формулу двумерной прямой: f (x)= ax + c. Переменные a и c — коэффициенты линейного уравнения ax + c. Оно описывает преобразование каждого из входных сигналов x в вы- ходной сигнал f(x), так что все выходные сигналы вместе описывают прямую в двумерном пространстве. Меняя коэффициенты, можно описать любую прямую в двумерном пространстве. Модель линейной регрессии сочетает заданные входные признаки x 1 , x 2 , ..., x k с коэффициентами a 1 , a 2 , ..., a k для вычисления предсказываемого выходного сигнала y по формуле: y = f(x) = a 0 + a 1 × x 1 + a 2 × x 2 + … + a k × x k В нашем примере с курсами акций один входной признак: x — день. Мы по даем на вход день x в надежде получить курс акций, то есть выходной сигнал y. Что упрощает модель линейной регрессии до формулы двумерной прямой: y = f(x) = a 0 + a 1 x. Посмотрим на три прямые, отличающиеся только двумя параметрами мо- дели a 0 и a 1 , на рис. 4.3. Первая ось координат отражает входной сигнал x. Вторая — выходной сигнал y. Прямые отражают (линейную) связь между входным и выходным сигналами. |