Текст книги "Искусственный интеллект"
Автор книги: Мередит Бруссард
Жанр: Компьютеры: прочее, Компьютеры
Возрастные ограничения: +12
сообщить о неприемлемом содержимом
Текущая страница: 8 (всего у книги 17 страниц)
Для такого обучения не нужен интеллект. Программист и консультант Джордж М. Невилл-Нил пишет в журнале Communications of the ACM:
Мы – свидетели более чем 50-летнего сражения человека и машины в шахматы, но означает ли это, что у компьютеров появился разум? Нет, и тому есть две причины. Первая заключается в том, что шахматы не призваны проверять наличие разума; в рамках этой игры исследуется определенный навык – умение играть в шахматы. Если бы я мог обыграть гроссмейстера, но при этом не был бы способен передать вам за столом соль, обладаю ли я разумом? Вторая причина заключается в том, что уверенность, будто игрой в шахматы можно проверить интеллектуальные способности, является культурным заблуждением, согласно которому игроки в шахматы – в отличие от остальных людей – гениальны[83]83
Neville-Neil, “The Chess Player Who Couldn’t Pass the Salt.”
[Закрыть].
Существует три ключевых типа машинного обучения: обучение с учителем, обучение без учителя и обучение с подкреплением. Привожу определения для каждого типа, предлагаемые в известной книге под названием «Искусственный интеллект: Современный подход» (Artificial Intelligence: A Modern Approach), написанной профессором Калифорнийского университета в Беркли Стюартом Расселом и директором исследовательского отдела Google Питером Норвигом:
Обучение с учителем: компьютеру представляют пример входных данных и желаемый итог их обработки, то есть дают задание, задача программы состоит в том, чтобы изучить основные закономерности, стоящие за решением.
Обучение без учителя: программе не дают никаких итоговых результатов, предоставляя возможность самостоятельно выявить структуру входных данных. Обучение без учителя может быть как самоцелью (выявить неявные закономерности в данных), так и ступенью в обучении.
Обучение с подкреплением: компьютерная программа с определенной задачей взаимодействует с динамичной средой (целью может быть управление транспортным средством или победа в игре). По мере продвижения в пространстве задач программе представляется обратная связь – награда или наказание[84]84
Russell and Norvig, Artificial Intelligence.
[Закрыть].
Обучение с учителем – наиболее простой вариант: машине предоставляется набор обучающих данных и соответствующие ему ожидаемые результаты. По сути, мы говорим машине, что хотим от нее в итоге, затем настраиваем модель до тех пор, пока не получим то, что полагаем верным.
Все три типа машинного обучения зависят от набора обучающих данных, необходимого для использования и подстройки модели обучения. Предположим, мой массив состоит из данных 100 000 владельцев кредитных карт. Он содержит все то, что кредитная компания знает о клиентах: имя, возраст, адрес, кредитную оценку заемщика, кредитную ставку, состояние счета, имена всех подписантов договора, выписку со счета, выписку времени и сумм погашения кредита. Допустим, с помощью нашей модели машинного обучения мы хотим предсказать, кто с большей вероятностью просрочит очередной платеж. Это нужно сделать потому, что после каждого просроченного платежа повышается процентная ставка по кредиту. В массиве обучающих данных есть колонка, где обозначены те, кто задерживал платеж. Мы делим наш массив на две части по 50 000 аккаунтов в каждом – на обучающую и тестовую выборки. Затем запускаем алгоритм машинного обучения на первом наборе, чтобы выстроить модель, черный ящик, который предскажет то, что мы и так знаем. Мы можем применить эту же модель к оставшимся данным и получить прогнозы о том, кто вероятнее всего опоздает с платежом. Наконец, мы сравниваем полученные прогнозы с реальными данными о просроченных платежах. Это позволяет выявить точность прогностической модели. И, если мы как разработчики нашей модели машинного обучения решим, что она достаточно точна, мы можем применить ее к прогнозированию платежей реальных заемщиков.
Существует ряд алгоритмов машинного обучения, доступных для применения к наборам данных. Возможно, вы уже слышали такие названия, как «метод лесов случайных деревьев», «древо решений», «метод ближайших соседей», «наивный байесовский классификатор» или «скрытая марковская модель». Прекрасное объяснение этих методов обнаруживается в книге Кэти О’Нил «Убийственные большие данные» (Weapons of Math Destruction)[85]85
О’Нил К. Убийственные большие данные. – М.: АСТ, 2018.
[Закрыть]. О’Нил пишет, что мы постоянно и бессознательно выстраиваем модели. Когда я решаю, что приготовить на ужин, я конструирую модель: что осталось в холодильнике, какие блюда я могу из этого приготовить, кто будет ужинать вместе со мной (обычно мы ужинаем с мужем и сыном) и что они любят есть. Я оцениваю каждое блюдо и вспоминаю, как его оценили в прошлом – какое блюдо и у кого заслужило просьбы о добавке и какие ингредиенты находятся в списке отвергаемой пищи: кешью, замороженные овощи, кокос, мясные субпродукты. Принимая решения об ужине на основе того, что у меня есть в холодильнике, я оптимизирую варианты. Создание модели на языке математики предполагает формализацию свойств и вариантов выбора[86]86
O’Neil, Weapons of Math Destruction.
[Закрыть].
Скажем, я хочу заняться машинным обучением. Первым делом мне нужен массив данных. Для отработки моделей машинного обучения доступно множество интересных массивов, собранных в онлайн-хранилищах. Есть массивы выражений лиц, домашних животных и видео YouTube. Есть массивы электронных писем, отправленных людьми, работавшими в обанкротившейся компании (Enron), конференций 1990-х гг. (Usenet), массивы сетей онлайн-дружбы из социальных сетей (Friendster), массивы данных о фильмах, просмотренных на различных сервисах (Netflix), данные произнесения общеупотребимых фраз с разными акцентами и массивы неразборчивых почерков. Эти данные собирались корпорациями, сайтами, университетскими учеными, добровольцами и из архивов ныне закрытых компаний. Эти небольшие характерные массивы данных опубликованы онлайн, и именно они формируют каркас современного ИИ. Вы наверняка можете найти там и свои данные. Моя подруга однажды обнаружила себя в видео в ясельном возрасте в архиве бихевиористов: ее мать участвовала в исследовании взаимодействия родителей и детей. Для построения умозаключений о мире исследователи до сих пор обращаются к тому видео.
А теперь выполним классическое практическое упражнение: при помощи машинного обучения предскажем, кто выжил во время крушения «Титаника». Представим, что происходило на корабле сразу после столкновения с айсбергом. Уже видите Леонардо Ди Каприо и Кейт Уинслет, скользящих по палубам корабля? Это неправда – но оживляет воображение, если вы смотрели фильм столько же раз, сколько и я. Вероятнее всего, вы видели фильм «Титаник» хотя бы раз. По итогам проката фильм заработал $659 млн в США и $1,5 млрд во всем мире, что делает его величайшим и вторым самым кассовым фильмом в истории. (Джеймс Кэмерон, режиссер «Титаника», также автор самого кассового фильма в истории – «Аватара».) Его крутили в кинотеатрах в течение почти что года, в том числе потому, что молодые люди приходили смотреть его снова и снова[87]87
Grazian, Mix It Up.
[Закрыть]. Фильм «Титаник» стал частью нашей коллективной памяти подобно крушению настоящего «Титаника». Наш мозг нередко путает реальные события с реалистичной выдумкой. Досадно, но это нормально. Из-за путаницы усложняется восприятие риска.
Мы делаем выводы на основе эвристик, неформальных правил. На эти эвристики влияют эмоционально насыщенные истории, которые к тому же легко запомнить. Например, на колумниста The New York Times Чарльза Блоу в детстве напала злая собака, содрав почти всю кожу с лица. И, будучи взрослым, вспоминает Блоу в мемуарах, он весьма настороженно относился к незнакомым собакам[88]88
Blow, Fire Shut Up in My Bones.
[Закрыть]. Что очевидно. Нападение крупного животного на человека в детстве становится травматичным опытом, и, конечно, воспоминания об этом всплывают каждый раз, когда человек видит собаку. Читая книгу Блоу, я сопереживала маленькому мальчику, была напугана вместе с ним. На следующий день после прочтения мемуаров в парке рядом с моим домом я увидела мужчину, выгуливающего собаку без поводка. Я тут же подумала о Блоу и о том, насколько тем, кто боится собак, некомфортно видеть собаку без поводка. Я подумала о том, что случится, если собака вдруг разозлится. История повлияла на то, как я оцениваю риск. Те же закономерности мышления приводят к тому, что после просмотра выпусков «Закон и порядок: Специальный корпус» (Law & Order: SVU) многие закупаются перцовыми баллончиками или после просмотра фильма ужасов проверяют заднее сиденье машины на предмет неприятных сюрпризов. Это явление специалисты называют эвристикой доступности[89]89
Tversky and Kahneman, “Availability.” См. also Kahneman, Thinking, Fast and Slow; Slovic, The Perception of Risk; Slovic and Slovic, Numbers and Nerves; Fischhoff and Kadvany, Risk.
[Закрыть]. Первыми приходят на ум истории, которые мы либо считаем наиболее важными по той или иной причине, либо часто с нами случаются.
Возможно, как раз из-за того, что крушение «Титаника» глубоко укоренилось в нашей коллективной памяти, эту историю отрабатывают в рамках практики машинного обучения. В частности, список пассажиров «Титаника» используется для того, чтобы на основе этих данных студенты научились генерировать прогнозы. Упражнение всегда работает, поскольку почти все студенты видели фильм или знают о катастрофе. Кроме того, здорово, что не приходится тратить время на прояснение исторического контекста, можно переходить сразу к интересной работе с прогнозированием.
Я хочу провести вас через увлекательную часть при помощи обучения с учителем. Мне кажется важным видеть в точности то, как обучается машина. Кроме того, если хотите выполнить упражнение самостоятельно, в сети можно найти достаточно сайтов с уроками по машинному обучению. Я собираюсь предложить вам упражнение с платформы DataCamp. Согласно Kaggle, эта платформа – первый шаг для тех, кто хочет включиться в рынок труда аналитики данных[90]90
См. https://www.datacamp.com for more on the Titanic data science tutorial. I’ve omitted some parts of the tutorial for readability.
[Закрыть]. Kaggle, принадлежащий родительской компании Google Alphabet, – это сайт, где люди соревнуются между собой, стремясь набрать наибольшее число очков за анализ массива данных. Аналитики данных участвуют в соревнованиях в составе команд, оттачивая собственные навыки и практики взаимодействия. Этот сайт также полезен с точки зрения обучения студентов анализу данных или для поиска массивов данных.
Чтобы пройти урок DataCamp о крушении «Титаника», мы обратимся к языку Python и нескольким его популярным библиотекам: pandas, scikit-learn и numpy. Библиотека – это небольшой набор функций, выложенный где-то на просторах интернета. Импортируя библиотеку, мы делаем функции доступными для программы, которую пишем. Можно представить ее в виде настоящей библиотеки. Я состою в системе Нью-Йоркской публичной библиотеки. Если я еду куда-то больше чем на неделю, стараюсь получить карту посетителя в местной библиотеке. И пока я являюсь членом местной библиотеки, я могу обращаться как к основным ресурсам Нью-Йоркской библиотеки, так и к уникальным источникам местной. На языке Python у нас есть ряд встроенных функций: они – Нью-Йоркская библиотека. Импорт новой библиотеки подобен регистрации в локальной библиотеке. Так, наша программа может использовать как ключевые функции из базовой библиотеки Python, так и замечательные функции с открытым кодом (open-source), написанные учеными и разработчиками, которые как раз и опубликовали, например, библиотеку scikit-learn.
Библиотека pandas, которую мы также будем использовать, имеет контейнер DataFrame, который «вмещает» набор данных. Такой тип пакета также называют объектом, как в объектно-ориентированном программировании. Объект – это такой же общий термин в программировании, как и в обычной жизни. В программировании объект – концептуальная обертка небольшого набора данных, переменных и кода. Таким образом, маркер объект становится для нас первой точкой опоры. Нам необходимо представить наш набор битов как нечто упорядоченное, о чем можно размышлять и говорить.
Во-первых, разделим наш набор данных пополам: на данные для обучения и на тестовые данные. Мы разработаем и обучим модель на данных для обучения и затем проверим на тестовом наборе. Помните, какой из двух ИИ тут работает – общий или слабый? Слабый. Итак, начнем:
import pandas as pd
import numpy as np
from sklearn import tree, preprocessing
Мы только что импортировали необходимые нам библиотеки. Каждой библиотеке мы дали собственные названия – pd для pandas, np для numpy. Теперь у нас есть доступ ко всем функциям обеих библиотек, и мы можем решить, какие из них нам нужны. Из библиотеки scikit-learn мы возьмем только две: первая называется tree, вторая – preprocessing.
Затем импортируем данные из файла. CSV (comma-separated values), который также можно найти в интернете. В частности, нужный нам. CSV-файл находится на сервере Web Services (AWS), принадлежащем Amazon. Нам это известно потому, что ссылка файла (которая начинается с http://) выглядит как s3.amazonaws.com. Файл. CSV представляет собой структурированные данные, где каждая колонка отделена запятой. Мы скачаем с AWS два файла с данными о «Титанике» – обучающий и тестовый, и они оба будут в формате. CSV. Импортируем их:
train_url =
«http://s3.amazonaws.com/assets.datacamp.com/course/Kaggle/train.csv»
train = pd.read_csv (train_url)
test_url = «http://s3.amazonaws.com/assets.datacamp.com/course/Kaggle/test.csv»
test = pd.read_csv (test_url)
pd.read_csv () означает «Пожалуйста, выполни функцию read_csv (), которая обитает в библиотеке pd (pandas)». Фактически мы только что создали DataFrame (структуру данных) и обратились к одной из встроенных функций. Итак, теперь данные импортированы в виде двух наборов – обучающего и тестового. Мы используем данные переменной train, чтобы создать модель, и затем при помощи переменной test протестируем ее точность.
Посмотрим, что в заголовках первых строк обучающего набора данных:
print (train.head ())
Итак, перед нами данные в 12 колонках: PassengerId, Pclass, Name, Sex, Age, SibSp, Parch, Ticket, Fare, Cabin, и Embarked. Что же это все означает?
Чтобы ответить на этот вопрос, нам понадобится словарь данных, который обычно имеется в каждом пакете данных. Заглянув в него, мы выясняем:
Pclass = пассажирский класс (1 = 1-й; 2 = 2-й; 3 = 3-й)
Survived = выжил (0 = нет; 1 = да)
Name = имя
Sex = пол
Age = возраст (в годах жизни; выражен дробью, если возраст меньше единицы (1), если данные приблизительны, они выражены в виде хх.5)
SibSp = количество родственников / супругов на борту
Parch = количество родителей / детей на борту
Ticket = номер билета
Fare = пассажирский тариф (до 1970-го считались в британских фунтах)
Cabin = номер каюты
Embarked = в каком порту сел (а) на борт корабля (C = Чербург; Q = Квинстаун; S = Саутгемптон)
В большинстве колонок есть информация, в иных – нет. Так, например, у пассажира с идентификатором 1, мистера Оуэна Харриса Брода, в графе «Номер каюты» зафиксировано значение NaN, что означает «нечисленное выражение». NaN также не равняется нулю, поскольку 0 – это число. Таким образом, NaN подразумевает, что для этой переменной отсутствует значение. В обычной жизни разница может быть несущественной, однако она принципиально важна для компьютерных вычислений. Вспомните, насколько точность важна для языка математики. Например, значение NULL – пустое множество, оно не синонимично NaN или нулю.
Посмотрим на первые строки тестового пакета данных:
print (test.head ())
Как мы видим, в пакете тестовых данных все те же графы, что и в обучающем, с той лишь разницей, что нет информации о выживших. Хорошо! Наша задача заключается в том, чтобы создать в тестовом пакете колонку Survived («Выжил»), в которой будут содержаться прогностические данные о каждом пассажире. (Конечно, кому-то уже может быть известен результат, но, если бы у нас на руках уже были ответы, это не было бы похоже на упражнение, не так ли?)
Итак, теперь нам предстоит запустить на обучающем наборе сводную статистическую обработку – это позволит лучше понять имеющуюся информацию. Интервьюирование данных – так мы это называем в дата-журналистике. По сути, мы «опрашиваем» данные так же, как опрашивали бы человека, у которого есть имя, возраст, собственная история. В свою очередь, у пакета с данными есть размер и набор колонок. Выяснение среднего значения колонки с данными напоминает ситуацию, в которой мы попросили бы человека написать его фамилию.
Ближе познакомиться с нашими данными мы можем при помощи функции под названием describe – она собирает сводные данные и формирует их в удобную таблицу:
train.describe ()
В пакете тренировочных данных содержится 891 запись. В 714 из них содержатся данные о возрасте пассажира. Согласно имеющимся у нас данным, средний возраст пассажира – 29,699118 лет; обычный человек сказал бы, что средний возраст пассажира составляет около 30.
Некоторые представленные данные требуют дополнительного пояснения: минимальное значение в колонке Survived составляет 0, максимальное – 1. Другими словами, это булевы значения: либо кто-то выжил (1), либо нет (0). Таким образом мы можем посчитать среднее значение – 0,38. Мы также можем посчитать среднее значение Pclass, пассажирского класса. Также цены билетов для 1-го, 2-го и 3-го класса. Здесь среднее значение не означает буквально, что кто-то путешествовал классом 2,308.
Выяснив кое-что о данных, которыми мы располагаем, обратимся к анализу. Посчитаем прежде всего количество пассажиров: для этого мы можем воспользоваться функцией value_counts. Она покажет, каково количество значений переменных для каждой категории в колонках. Иначе говоря, мы выясним, сколько пассажиров путешествовало каждым классом. Выясним:
train [ «Pclass»].value_counts ()
1 216
2 184
3 491
Name: Pclass, dtype: int64
Согласно обучающим данным, 491 пассажир путешествовал 3-м классом, 184 человек было во 2-м и 216 – в 1-м.
Теперь посмотрим на число выживших:
train [ «Survived»].value_counts ()
0 549
1 342
Name: Survived, dtype: int64
Обучающие данные показывают, что 549 человек погибли, 342 – выжили.
Посмотрим теперь на данные в процентном соотношении:
print (train [ «Survived»].value_counts (normalize = True))
0 0.616162
1 0.383838
Name: Survived, dtype: float64
62 % пассажиров погибли, 38 % остались в живых. Большинство погибло в крушении. Если бы мы собирались прогнозировать выживание случайного пассажира из нашего списка, то с бо́льшей вероятностью программа бы выдала отрицательный ответ.
И можно было бы закончить на этом, ведь мы только что пришли к выводу, позволяющему сделать вполне логичные прогнозы. Но мы можем больше, так что продолжим. Есть ли какие-либо факторы, с помощью которых мы могли бы уточнить наш прогноз? Ведь кроме данных выживших у нас есть информация о классе пассажиров, имена, пол, возраст, данные о родственниках и членах семьи на борту, стоимость их билетов, номера кают и города отправления.
Pclass – лакмусовая бумажка, отражающая социоэкономический статус пассажира, подходит в качестве прогностической характеристики. Можно догадаться, что пассажиры первого класса оказались в спасательных шлюпках раньше пассажиров 3-го класса. Пол также является важным предиктором, ведь нам известно, что во время кораблекрушений работает принцип «женщин и детей спасать в первую очередь». Он восходит к 1852 г., когда транспортно-десантный корабль Британских ВМС сел на мель у побережья Южной Африки. Этот принцип работает не всегда, но часто, поэтому для социального анализа мы учитываем его.
Теперь проведем несколько сравнений и посмотрим, сможем ли мы обнаружить другие переменные, в потенциале обладающие предсказательной силой:
# Выжившие и погибшие пассажиры
print (train [ «Survived»].value_counts ())
0 549
1 342
Name: Survived, dtype: int64
# В пропорции
print (train [ «Survived»].value_counts (normalize = True))
0 0.616162
1 0.383838
Name: Survived, dtype: float64
# Мужчины выжившие и погибшие
print (train [ «Survived»] [train [ «Sex»] = ‘male’].value_counts ())
0 468
1 109
Name: Survived, dtype: int64
# Женщины выжившие и погибшие
print (train [ «Survived»] [train [ «Sex»] = ‘female’].value_counts ())
1 233
0 81
Name: Survived, dtype: int64
# Усредненное выживание мужчин
print (train [ «Survived»] [train [ «Sex»] = ‘male’].value_counts (normalize=True))
0 0.811092
1 0.188908
Name: Survived, dtype: float64
# Усредненное выживание женщин
print (train [ «Survived»] [train [ «Sex»] = ‘female’].value_counts (normalize=True))
1 0.742038
0 0.257962
Name: Survived, dtype: float64
Мы видим, что 74 % женщин и 18 % мужчин выжили. Так мы можем еще более точно определить нашу гипотезу, предположив, что, вероятнее всего, в катастрофе выжила бы женщина, а не мужчина.
Помните, что изначально нашей целью было создать колонку данных о выживших? Так вот, на основе новой информации мы можем создать ее и поставить «1» (значит «да, пассажир выжил») напротив тех 74 % женщин и «0» (то есть «нет, пассажир не выжил») у оставшихся женщин. Мы также могли бы поставить «1» у 18 % и «0» у 81 % мужчин.
Однако мы не будем так делать, поскольку это означало бы, что мы совершаем поверхностные предположения на основе только лишь пола. Известно, что в данных можно обнаружить факторы, существенно влияющие на результаты. (Если же вам действительно интересна внутренняя кухня этих процессов, я советую найти это упражнение на DataCamp либо что-то подобное в интернете.) А как насчет женщин, путешествующих третьим классом? Или первым классом? Женщин с детьми? И вот уже ручной подсчет кажется весьма трудоемким, потому давайте научим нашу модель, опираясь на известные факторы, угадывать за нас.
Для этого нам понадобится алгоритм decision tree. Помните, в машинном обучении существуют весьма полезные базовые алгоритмы? У них есть названия, такие как «дерево решений» (decision tree), «случайный лес» (random forest), «искусственная нейронная сеть» (artificial neural network), «наивный байесовский классификатор» (naive Bayes), «метод k ближайших соседей» (k-nearest neighbor) или «глубокое обучение» (deep learning). Список алгоритмов машинного обучения, представленный в Википедии, достаточно полный.
Алгоритмы поставляются пользователям в пакетах вроде того, что мы уже использовали, – pandas. На самом деле немногие самостоятельно пишут алгоритмы, гораздо проще воспользоваться уже существующими. Процесс написания алгоритма похож на изобретение нового языка программирования. Это действительно очень важно, кроме того, требует много времени. «Математика, – скажу я и всплесну руками, – это лучшее объяснение того, что задействовано во время разработки алгоритма». Извините. Если хотите знать больше, я советую почитать об этом. Это, конечно, очень интересно, но написание алгоритма не относится к нашим актуальным задачам.
Итак, теперь обучим модель на тренировочном пакете данных. По итогам небольшого исследования нам стало известно, что необходимо учитывать факторы класса и пола. Теперь нам предстоит выстроить догадки о выживших. Пускай модель попробует угадать, а мы затем сравним результаты с реальностью. Независимо от итогового процента мы получим величину точности модели.
Открою вам секрет из мира больших данных: все данные – «грязные». Абсолютно все. Они собраны людьми, подсчитывающими все вокруг, либо посредством сенсоров – тоже созданных людьми. В каждой, казалось бы, упорядоченной колонке чисел присутствует шум, искажения. Это беспорядок. Это незавершенность. Это жизнь. Проблема заключается в том, что некорректные данные не следует учитывать. Больше того, иногда для того, чтобы алгоритмы заработали как надо, нам приходится подправлять данные.
Еще не страшно? Мне было страшно, когда я поняла это. Как журналист я не склонна подправлять что-либо. Мне необходимо проверить каждую строчку и представить подтверждения для проверяющего, редактора, или читателей – однако в машинном обучении приходится частенько делать так, чтобы все сходилось.
К физике это тоже применимо. Например, если нужно измерить температуру в конкретной точке А закрытого контейнера, необходимо измерить температуру в двух равноудаленных точках (В и С) и предположить, что температура в точке А примерно соответствует средней температуре между В и С. В статистике… ну, так это и происходит, а недостаток данных способствует неуверенности в подсчетах. Мы все пользуемся функцией fillna, чтобы заполнить пустующие значения:
train [“Age”] = train [“Age”].fillna (train [“Age”].median ())
Алгоритм не работает при отсутствующих значениях. Поэтому придется исправить ситуацию. Создатели упражнения на DataCamp советуют воспользоваться медианой.
Посмотрим на данные.
# Напечатать данные, чтобы увидеть доступные признаки
print (train)
Если вы прочли все эти сотни строк – браво; если же вы их попросту пропустили, то я не удивлена. Я вывела вам столько строк данных специально, чтобы показать, каково это, быть аналитиком данных. Работа с колонками чисел кажется бессмысленной и иногда весьма утомительной. Есть в работе с данными что-то антигуманное. Непросто каждую секунду помнить о том, что за этим массивом цифр скрываются реальные люди с собственными надеждами, мечтами, семьями и историей.
Итак, мы познакомились с сырыми данными, теперь приступим к их обработке. Превратим их в массивы, структуры, которыми компьютер может манипулировать:
# Задать цели и свойства массивов: target, features_one
target = train [ «Survived»].values
# Предварительная обработка
encoded_sex = preprocessing.LabelEncoder ()
# Преобразование
train.Sex = encoded_sex.fit_transform (train.Sex)
features_one = train [[“Pclass,” “Sex,” “Age,” “Fare”]].values
# Подобрать первое дерево решений: my_tree_one
my_tree_one = tree.DecisionTreeClassifier () my_tree_one = my_tree_one.fit (features_one, target)
Мы только что запустили функцию под названием fit (подборка) на классификаторе, основанном на дереве принятия решений под названием my_tree_one. Признаки, которые мы ходим принять в расчет: Pclass, Sex, Age и Fare. Мы просим алгоритм выяснить, какая существует взаимосвязь между этими четырьмя факторами и целевым полем Survived:
# Посмотрим на значимость и оценку включенных признаков
print (my_tree_one.feature_importances_)
[0.12315342 0.31274009 0.22675108 0.3373554]
Переменная feature_importances показывает статистическую значимость каждого прогностического фактора.
Наибольшее число указывает на наивысшее значение из всей группы:
Pclass = 0,1269655
Sex = 0,31274009
Age = 0,23914906
Fare = 0,32114535
Fare (пассажирский тариф) – самое большое число. Можно сделать вывод, согласно которому стоимость билета была наиболее весомым фактором, повлиявшим на выживание пассажиров во время крушения «Титаника».
На этом этапе работы с данными мы проверим, насколько верны наши оценки с точки зрения математики. Воспользуемся функцией score:
print (my_tree_one.score (features_one, target))
0.977553310887
Ух ты, 97 %! Выглядит впечатляюще. Если бы я получила 97 % на экзамене, я была бы счастлива. Можно сказать, что наша модель точна на 97 %. Машина только что «выучила» процесс создания математической модели. А сама модель хранится в объекте под названием my_tree_one.
Теперь попробуем применить эту модель к тестовому пакету данных. Обратим внимание, что в нем нет колонки с данными о выживших. Наша задача заключается в том, чтобы при помощи созданной модели попытаться выяснить, выжил пассажир либо нет. Нам известно, что наибольшее влияние на результат имеет стоимость билетов, однако пассажирский класс (Pclass), пол (Sex) и возраст (Age) также имеют значение. Применим данные к тестовому пакету и посмотрим, что получится:
# Возместим отсутствующие данные о тарифе с помощью медианных значений
test [ «Fare»] = test [ «Fare»].fillna (test [ «Fare»].median ())
# Возместим отсутствующие данные о возрасте с помощью медианных значений
test [ «Age»] = test [ «Age»].fillna (test [ «Age»].median ())
# Предварительная обработка
test_encoded_sex = preprocessing.LabelEncoder () test.Sex = test_encoded_sex.fit_transform (test.Sex)
# Извлечем необходимые признаки Pclass, Sex, Age, и Fare из тестового набора данных:
test_features = test [[ «Pclass,» «Sex,» «Age,» «Fare»]].values
print (‘These are the features: n’)
print (test_features)
# Составим прогноз, используя тестовый набор данных, и выведем результат
my_prediction = my_tree_one.predict (test_features)
print (‘This is the prediction: n’)
print (my_prediction)
# Выведем данные в две колонки: PassengerId и прогноз выживания
PassengerId =np.array (test [ «PassengerId»]). astype (int) my_solution = pd.DataFrame (my_prediction, PassengerId, columns = [ «Survived»])
print (‘This is the solution in toto: n’)
print (my_solution)
# Проверим, что у нас 418 строк данных
print (‘This is the solution shape: n’)
print (my_solution.shape)
# Записать результаты в. CSV-файл my_solution.csv
my_solution.to_csv (“my_solution_one.csv,” index_label = [“PassengerId”])
А вот и результат:
These are the features:
[[3. 1. 34.5 7.8292]
[3. 0. 47. 7.]
[2. 1. 62. 9.6875] …,
[3. 1. 38.5 7.25]
[3. 1. 27. 8.05]
[3. 1. 27. 22.3583]]
This is the prediction:
[0011100010001111011001101011100010100001010110001110111000110001001001100010010110000011111110001110100010000000111011011010010100100100100000000110101001001101111101100001010110110010101000001010100001010000101101001010101110010001001001111110001010100000001000110000000010110000011010001010100010000000110110010011000000011010001011000001000101000110001010010111100010010011000100010100000110010100101000001111001000]
This is the solution in toto:
Survived
892 0
893 0
894 1
895 1
896 1
897 0
898 0
899 0
900 1
901 0
902 0
903 0
904 1
905 1
906 1
907 1
908 0
909 1
910 1
911 0
912 0
913 1
914 1
915 0
916 1
917 0
918 1
919 1
920 1
921 0
…..
1280 0
1281 0
1282 0
1283 1
1284 1
1285 0
1286 0
1287 1
1288 0
1289 1
1290 0
1291 0
1292 1
1293 0
1294 1
1295 0
1296 0
1297 0
1298 0
1299 0
1300 1
1301 1
1302 1
1303 1
1304 0
1305 0
1306 1
1307 0
1308 0
1309 0
[418 rows x 1 columns]
This is the solution shape:
(418, 1)
Новая колонка с информацией о выживших содержит прогностические данные о 418 пассажирах из тестового массива. Можем сохранить полученные результаты в. CSV-файле под названием my_solution_one.csv, загрузить файл на DataCamp и выяснить, что точность наших прогнозов составляет 97 %. Ура! Мы только что обучили машину. И, когда кто-то говорит, что пользовался «искусственным интеллектом для принятия решения», обычно это означает «пользовался машинным обучением» и сделал примерно то же, что и мы сейчас.
Мы создали колонку с данными о выживших и можем с вероятностью 97 % сказать, что результаты точны. Нам удалось выяснить, что стоимость проезда имела критическое значение в случае математического анализа данных о выживших на «Титанике». И это был слабый ИИ. Он оказался совсем не страшным, способным привести нас к предположению, что компьютерный сверхинтеллект захватит мир. «Это всего лишь статистические модели, такие же, какие используют в компании Google для прогнозирования ходов в играх или которые ваш телефон использует, чтобы сделать предположение о том, что именно вы сказали, чтобы перевести голосовой запрос в текст, – именно так описал ИИ Закари Липтон, профессор Университета Карнеги – Меллона для журнала Register. – Они не умнее миски с лапшой»[91]91
Quach, “Facebook Pulls Plug on Language-Inventing Chatbots?”
[Закрыть].
Правообладателям!
Это произведение, предположительно, находится в статусе 'public domain'. Если это не так и размещение материала нарушает чьи-либо права, то сообщите нам об этом.