- PVSM.RU - https://www.pvsm.ru -

«Теперь он и тебя сосчитал» или Наука о данных с нуля (Data Science from Scratch)

Не так давно я рассказывал о том, как случайно познакомился с понятием Data Science, благодаря курсам от Cognitive Class [1]. Кратко резюмируя ту статью скажу, что по результатам курса я толком ничему не научился, но мне стало любопытно, поэтому спустя какое-то время я побежал в магазин и купил книгу, которой и посвящён данный материал.

Не знаю на сколько уместно на Хабре описывать возможность обучения по печатному самоучителю, но в конце концов этот хаб же про учебный процесс в IT и поэтому если вам интересно, чему может научить эта книга полного новичка в области Data Science и стоит ли тратить на этот этап время и деньги, то милости прошу под кат.
«Теперь он и тебя сосчитал» или Наука о данных с нуля (Data Science from Scratch) - 1

Часть 1. «Я — это раз» — немного о навыках

Надо сказать, что до прочтения данной книги, мое представление о пользе Data Science не далеко ушло от заглавной картинки, позаимствованной из любимого мультфильма.
Для того, чтобы заглянувший сюда читатель мог спроецировать мой опыт на себя, придется мне немного поведать о своих стартовых навыках. Итак, как и в прошлый раз, досье осталось практически без изменений:

  1. В связах с мат. анализом и статистикой замечен не был;
  2. Навыками программирования на Python не владеет;
  3. Владеет знанием о существовании Data Science, практических навыков не имеет.
  4. Характер стойкий нордический, не женат.

Собственно, почему я решил изучить эту книгу, и поделится впечатлениями о ней?
Просто после курсов Cognitive Class, я решил заглянуть на Kaggle и понял, что даже в туториале по решению задачи про Титаник [2], я сути почти всех приемов и определений не понимаю.

Данная книга не требовала никаких стартовых навыков и обещала приятное погружение в мир науки о данных. Есть ли у меня теперь уверенность, что после прочтения книги я смогу решить эту задачу с Титаником? Ответ в конце статьи.

Часть 2. «Два — это Телёнок» — общие сведения о книге

Книга «Data Science. Наука о данных с нуля» — на отечественном рынке похоже появилась совсем недавно, о чем как минимум свидетельствует, то что её электронную версию мне не удалось ни скачать, ни купить. Сам же оригинал был выпущен в 2015 г. Само собой за 2 года в мире IT много чего меняется, например, выходят новые версии библиотек для анализа данных в Python. И тут надо отдать должное автору (Джоэл Грас) и локализатору книги. Изначально, книга писалась с расчетом на Python 2, но автор не оставил свое детище и адаптировал исходные тексты программ, для Python 3 (и кстати выложил это на GitHub [3]), ну а переводчик слава богу разместил в книге уже адаптированные тексты программ (похоже, что с небольшими корректировками).

Также спасибо переводчикам, за краткую инструкцию по установке Anaconda и/или настройки среды для случая если вы не хотите ставить Анаконду.

И так начнём повествование о книге. На обороте обложки размещена цитата, действительно четко описывающая размещенный в ней материал: «Джоэл проведет для вас экскурсию по науке о данных. В результате вы перейдете от простого любопытства к глубокому пониманию насущных алгоритмов, которые должен знать любой аналитик данных.» — Роит Шивапрасад. Ну по крайней мере первая часть этой цитаты на 100% верна, книга действительно напоминает экскурсию, когда вам надо за 2 часа осмотреть Эрмитаж и все, что вы успеваете это бежать за экскурсоводом, ловя краткую справку о каждом шедевре. Как ни странно, не могу сказать, что это плохо, по крайней мере книгу успеваешь прочесть раньше, чем она надоест.

Надо отметить, что кого-то, как и меня может ввести в заблуждение название книги.
Важно отметить, что в данном случае «с нуля» подразумевает не с нуля знаний до какого-то практического уровня, а то, что все примеры функций для анализа и визуализации будут написаны в процессе изложения материала. Это напоминает аналогию с книгой «Linux from scratch», которая направлена не на то, чтобы вы прям вот сразу начали пользоваться каким-нибудь дистрибутивом Linux «с интересными обоями», а планомерно, собрали, свою систему с нуля (даже если вы ей потом не будете пользоваться).

У такого подхода есть свои плюсы и есть свои минусы. С одной стороны вы вряд ли в дальнейшем будете пользоваться теми функциями, которые позаимствуете из книги, с другой стороны, возможно к вам придет понимание общих принципов (ко мне с первого раза много где не пришло)

Итак, как пишут в рапортах представители силовых структур: «по существу вопроса, докладываю следующее:»

Часть 3. «Три — это Python» — содержание и общий подход.

Надо сказать, что с форматом «экскурсии» книга действительно справляется. В ней кратко изложены, наверное, почти все базовые концепции, которые можно встретить в иных курсах по Data Science (например, на той же Coursera [4]). У краткости есть достоинства и недостатки, с одной стороны прочитать книгу при желании можно за 2-3 дня и она не успевает надоесть, с другой стороны материала реально мало и читая «по диагонали» можно, что-то пропустить, в таком случае чтобы что-то понять придется возвращаться и перечитывать главу еще раз.

Автор проявил фантазию и привязал изучаемый материал, к вашей работе в условной соцсети для ученых по данным — “DataSciencester”. Надо сказать, что это приятный подход, задачи выглядят из далека похожими на житейские. И сложность решаемых вами «рабочих» задач постепенно возрастает от главы к главе.

В первой главе обучение стартует с места в карьер, автор покажет, вам как с помощью Питона решить несколько условных задач, на малом объеме данных, например, построить граф отражающей количество друзей в нашей «условной» соцсети или выявить и графически отобразить связь между стажем работы и уровнем зарплаты, для ученого по данным.

Дальше будет изложен интенсив по Python, избыточным его точно не назовешь, но надо отдать автору должное, за рамки того, что дано в главе 2, он далее по тексту сильно не выходит, поэтому если вникнуть один раз в базовые типы данных и другие понятия, то по идее представленный в книге код проблем вызывать не должен (хотя у меня вызывал).

После вводной части и азов Python, остальные направления книги можно поделить на 3 части:

  1. Очень краткие основы мат. анализа и статистики;
  2. Сбор, обработка, хранение данных;
  3. Машинное обучение (математические модели и алгоритмы для обработки данных и предсказания);

Фрагмент книги и оглавление можно посмотреть на Ozon [5] (не реклама), там как раз содержание и первая глава.

От текстовой части перейдем к практической, выше по тексту была ссылка на страничку автора на GitHub [3], где размещен код представленный в книге и необходимые данные.

В локализованной версии книги есть ссылка на архив с адаптированной (русифицированной) версией кода, чтобы не нарушать ни чьи права, воздержусь от ее размещения.
Весь код представлен в виде исходников на Python 2 и 3, а также в виде блокнотов для Jupyter notebook. Надо сказать, большое спасибо этой книге, потому что благодаря ей я открыл для себя Anaconda [6] (удобная вещь). На мой взгляд удобней всего экспериментировать с кодом, представленным в книге именно в версии блокнотов Jupyter (который по умолчанию установлен в Анакодне). Хотя с другой стороны по сути в записной книжке весь код вбит в одну ячейку без разбивки и без отдельных текстовых вставок, так что это скорее вопрос вкуса, чем явного преимущества. Кстати если вдруг вас не устроит корневая директорию откуда Jupyter «видит» файлы, то вот действительно рабочий совет [7] (есть варианты и для Windows и для Linux)

Надо отметить, что блокноты идут с заранее подготовленными результатами, чтобы вы могли посмотреть их без запуска кода, а вот после перезапуска расчётов в некоторых местах могут потребоваться маленькие «пляски с бубном» в виде установки библиотек или еще каких-то мелочей (например, подключение к API сервисов).

Не хочу быть голословным поэтому надеюсь автор не обидится если я продемонстрирую кусочек кода из его книги.
Вот, например, фрагмент кода посвященный линейной алгебре (чтобы не нарушать права переводчика возьмем оригинал с GitHub). В книге данный код перемешан с изложением материала, в блокноте и исходниках идет в сплошном виде.

# -*- coding: utf-8 -*-
# linear_algebra.py

import re, math, random # regexes, math functions, random numbers
import matplotlib.pyplot as plt # pyplot
from collections import defaultdict, Counter
from functools import partial, reduce

#
# functions for working with vectors
#

def vector_add(v, w):
    """adds two vectors componentwise"""
    return [v_i + w_i for v_i, w_i in zip(v,w)]

def vector_subtract(v, w):
    """subtracts two vectors componentwise"""
    return [v_i - w_i for v_i, w_i in zip(v,w)]

def vector_sum(vectors):
    return reduce(vector_add, vectors)

def scalar_multiply(c, v):
    return [c * v_i for v_i in v]

def vector_mean(vectors):
    """compute the vector whose i-th element is the mean of the
    i-th elements of the input vectors"""
    n = len(vectors)
    return scalar_multiply(1/n, vector_sum(vectors))

def dot(v, w):
    """v_1 * w_1 + ... + v_n * w_n"""
    return sum(v_i * w_i for v_i, w_i in zip(v, w))

def sum_of_squares(v):
    """v_1 * v_1 + ... + v_n * v_n"""
    return dot(v, v)

def magnitude(v):
    return math.sqrt(sum_of_squares(v))

def squared_distance(v, w):
    return sum_of_squares(vector_subtract(v, w))

def distance(v, w):
   return math.sqrt(squared_distance(v, w))

#
# functions for working with matrices
#

def shape(A):
    num_rows = len(A)
    num_cols = len(A[0]) if A else 0
    return num_rows, num_cols

def get_row(A, i):
    return A[i]

def get_column(A, j):
    return [A_i[j] for A_i in A]

def make_matrix(num_rows, num_cols, entry_fn):
    """returns a num_rows x num_cols matrix
    whose (i,j)-th entry is entry_fn(i, j)"""
    return [[entry_fn(i, j) for j in range(num_cols)]
            for i in range(num_rows)]

def is_diagonal(i, j):
    """1's on the 'diagonal', 0's everywhere else"""
    return 1 if i == j else 0

identity_matrix = make_matrix(5, 5, is_diagonal)

#          user 0  1  2  3  4  5  6  7  8  9
#
friendships = [[0, 1, 1, 0, 0, 0, 0, 0, 0, 0], # user 0
               [1, 0, 1, 1, 0, 0, 0, 0, 0, 0], # user 1
               [1, 1, 0, 1, 0, 0, 0, 0, 0, 0], # user 2
               [0, 1, 1, 0, 1, 0, 0, 0, 0, 0], # user 3
               [0, 0, 0, 1, 0, 1, 0, 0, 0, 0], # user 4
               [0, 0, 0, 0, 1, 0, 1, 1, 0, 0], # user 5
               [0, 0, 0, 0, 0, 1, 0, 0, 1, 0], # user 6
               [0, 0, 0, 0, 0, 1, 0, 0, 1, 0], # user 7
               [0, 0, 0, 0, 0, 0, 1, 1, 0, 1], # user 8
               [0, 0, 0, 0, 0, 0, 0, 0, 1, 0]] # user 9

Автор, как и обещал пишет все функции с нуля и старается объяснить их работу, после чего в конце каждой главы честно информирует вас о том, что существуют те или иные библиотеки, где это реализовано лучше.

Объяснение процесса разработки функций ближе к концу неподготовленному читателю (например, мне) кажутся зубодробительными и где-то после середины книги уже понимается, не вся логика работы кода (думаю придется однажды перечитывать), но зато таким путем вы вместе с автором посмотрите, как сделать своими руками очередные гребаные велосипеды, полезные базовые решения в куче областей например, свой примитивный аналог СУДБ, все базовые функции и модели анализа, нейронные сети, деревья принятия решений, генераторы текста, распознаватели «капчи». Даже просто беглое знакомство со всем этим набором вполне может развить у вас интерес к предмету.

Часть 4. «Ура козлёнку!» — Заключение.

Итак, что у нас в сухом остатке?

Поскольку на текущий момент все мои знания о Data Science ограничиваются этой книгой и курсами от Cognitive class (СС), то для начала с ними и сравню.

Не знаю может фактор родного языка, может, то, что в отличие от курсов СС автор хотя бы нормально оси на графиках подписал в примерах, но в плане общего представления книга дала намного больше, при тех же затратах времени (и там и там 2 чистых дня), не смотря на отсутствие видео, лабораторных, экзаменов и так далее. И даже отсутствие «сертификатов» и «бейджиков» ничуть не дает плюсов CC (ибо грош им цена).

Сможет ли полный новичок, что-то понять об основных подходах в области науки о данных? Скорее да, чем нет. Сможет ли он по окончанию книги сразу сделать что-то путное, скорее нет, чем да. Все же, наверное, будет плохой практикой применять для постоянной работы те примеры, что указаны в книге, а значит необходимо выучить основные библиотеки для анализа данных (сам автор тоже об этом говорит по ходу изложения материала). Причем могу предположить, что будет полезно однажды вернуться к примерам «с нуля», когда уже набьется рука на готовых библиотеках.

Полезна ли книга новичку? Я думаю, что да. Наверное, если представить, что ваш мозг [8] дискутирует сам с собой, то можно получить что-то вроде «окон Овертона», ну то есть вначале само осознание того, что надо вникать в какое-нибудь понятие типа дисперсии или регрессии, или нейронных сетей, кажется недопустимым, но с каждым разом потихонечку приходишь к мысли, что это не так и страшно.

Поэтому в качестве экскурсии в мир Data Science книга вполне подойдет, по крайней мере, в процессе прочтения интерес к вопросу только возрастает и думаю, что при прохождении более основательных учебных курсов будет намного проще более детально рассмотреть ранее изученные с помощью данной книги концепции.

Стоит ли в итоге 550 рублей книга из 300 с небольшим страниц, напечатанных на газетной бумаге, решать вам. Могу сказать одно, данная книга вселила в меня уверенность, что теперь я смогу худо-бедно решить задачку про Титаник на kaggle, думаю как раз об этом и будет следующий мой материал.

Автор: BosonBeard

Источник [9]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/python/258993

Ссылки в тексте:

[1] Cognitive Class: https://habrahabr.ru/post/331118/

[2] Титаник: https://www.kaggle.com/c/titanic#description

[3] GitHub: https://github.com/joelgrus/data-science-from-scratch

[4] Coursera: https://www.coursera.org/specializations/machine-learning-data-analysis

[5] Ozon: http://www.ozon.ru/context/detail/id/140943923/

[6] Anaconda: https://www.continuum.io/downloads

[7] рабочий совет: https://stackoverflow.com/questions/15680463/change-ipython-working-directory

[8] мозг: http://www.braintools.ru

[9] Источник: https://habrahabr.ru/post/331794/