Итак, с вами WBG и мы начинаем вторую часть создания ИИ. К великому сожалению, вам нужно хоть немножко знать питон, например из первой части или какого-нибудь туториала с ютубчика :). Есть и второй вариант: берите чаек, усаживайтесь поудобнее и просто наслаждайтесь.
Знакомы с python? Тогда погнали!
- Как пройти в библиотеку?
- А вам в какую?
- В sklearn
- Тогда вставьте в cmd
pip install numpy
pip install pandas
pip install sklearn
И если у вас все сработало - мои поздравления! Иначе - возможно, у вас нету pip в PATH. Если что - путь в комменты, задаем любые вопросы.
Я хотел рассказать про работу numpy и pandas, но вы меня разорвете - поэтому сразу переходим к интересному, уверен, вы поймете все и так :))).
Итак, как я и обещал - мы делаем реальную задачу, для этого регаемся на kaggle.com, находим соревнование. Да, соревнование, и не какое-нибудь, а предсказание выживания человека на титанике по различным данным. Еще раз: ПРЕДСКАЗАНИЕ, ВЫЖИВЕТ ЛИ ЧЕЛОВЕК. Отличная первая задача. Скачиваем данные в папку C:\ml_prj\WBG\titanic, предварительно создав ее :). Распаковываем в эту папку.
А вот как это выглядит в папке
Что необходимо сделать, так это поставить anaconda, обязательно в конце установки жмакнув "Add to PATH". Затем в cmd запустить команду
C:
cd C:\ml_prj
jupyter notebook
Чуть-чуть подождать, и у вас в браузере откроется вот такая штука.
Как дела? Все получается? Если нет, то не стоит паниковать, зато задать вопрос в комментах - почему бы и нет?!
Теперь быстренько летим в папку WBG\titanic и создаем New->Python3 как показано выше.
Искренне надеюсь, что у вас также. Теперь самое интересное! Быстренько делаем для кого понятные, а для кого непонятные заклинания:
И жмем Ctrl+Enter, чтобы запустить ячейку кода.
(Весь код я приложу в конце)
Так, что произошло? Мы загрузили три библиотеки - numpy, отвечающий за создание массивов и тензоров. Pandas - удобно работающий с текстовыми и файловыми данными, таблицами. Sklearn - библиотека, предоставляющая алгоритмы машинного обучения.
Ну что, давайте я не буду погружать никого не во что? Сразу к интересному? Тогда берем попкорн, клавиатуру и погнали.
Тыкаем клавишу B (английская, блэт, ибо Below - ниже). Создается ячейка, заходим в нее и пишем такое:
Ну и запускаем (напомню, ctrl+enter).
Здорово, мы загрузили данные в переменные. Правда, ничего не понятно - что за данные такие. Давайте взглянем на них!
Мы вставили следующей ячейкой код, который возвращает верхнюю часть наших данных. Как видим, здесь несколько столбцов:
PassengerId - таки Id пассажира
Survived - выжил он (1) или нет (0)
Sex - male (мужчины), female (отгадайте, кто)
Age - возраст
и так далее, в общем по-хорошему надо изучить, но у нас же форсированный курс 8).
Что мы собираемся делать дальше, так это обработать данные (feature engineering нахрен). Во как. Поэтому объединим наши данные, вставив это сразу после последней ячейки:
"красненького" бояться нафиг не надо, это просто предупреждения.
Ну давайте взглянем на наши данные
А давайте-ка к херам снесем колонку Name, с которой хрен че сделаешь: вряд ли от имени что-нибудь зависит. Да и cabin можно удалить. И PassengerId. Едем:
Парочку замечаний:
1) axis = 1 означает, что мы удаляем стоблец
2) data_1 - это не костыль, это нужно, чтобы мы понимали, сколько обработок мы сделали. Можно конечно и
data = data.drop(...
Но тогда эту ячейку нельзя будет вызвать еще раз, так как данные перезаписаны.
Отлично, как мы видим, столбцы удалены. Но нам этого мало: хотелось бы теперь пол преобразовать в числа, 1 либо 0. Извините, фемки, но у нас по-любому будут разные цифры для разных полов. Пусть будет... 1 для мужчин и 0 для женщин (ну все, улетел в минуса).
"Какой кошмар" - подумали вы. Но давайте по порядку.
1) data_1["Sex"] - означает, что мы работаем с колонкой "пол".
2) data_1["Sex"].apply - означает, что мы хотим применить функцию для каждого элемента в столбце
3) lambda x: - это конструктор функции, например если обычно мы делаем
То с лямбдой мы можем сделать
Таким образом, когда мы делаем apply, pandas пробегается по всем элементам данного столбца и заменяет каждый его элемент на вашу функцию от этого элемента.
Если не поняли - ничего страшного, ПОЙМЕТЕ, НИКУДА НЕ ДЕНЕТЕСЬ УХАХАХА.
Ладно, с полом разобрались. Кстати, уже красивые данные, не правда ли? Не правда!
Если присмотреться, то можно увидеть ЭТО
Что это за ПрострелитьСебеКолено.jpg? Это Not a Number, то есть неопределенно. И знаете, что я думаю по этому поводу? Я считаю, что от этой херни надо избавляться словно от трапов. И мы быстренько это сделаем:
Здорово, правда? Добавились непонятные нули, ну и шут с ним. Зато №5 успешно был заменен на среднее арифметическое столбца, ведь именно это означает data_1["Age"].mean(). А fillna заменяет NaN на то, что предложено в скобках.
Так, теперь подумаем, что делать с Ticker. О! А давайте возьмем первый символ от строки? Ну, я не против, че
Каеф. Теперь все почти ништяк. Осталось придумать, что делать с буковами.
Тут есть одна сверхсекретная тактика, только тссс: one hot encoding. Давайте на нее посмотрим, и вы сами все поймете!
1) Что изменилось?
Мы заменили Embarked, который мог быть одной из трех букв (C, Q, S) на три столбца: em_C, em_Q, em_S. Затем для каждого элемента мы ставим во всех трех столбцах 0, а в том, который соответствует - единичку. То есть Например 0-ой элемент: 0 0 1 в столбцах, значит там была буква S. Во втором элементе единица в столбце em_C, значит там буква C.
2) Что за магия?
Предпоследняя строка удаляет столбец, первая - делает копию data_1. А в остальное - забейте вникать :). Хотя это не очень сложно, но думаю со временем это станет очевидно, а стелить простыню ради этого - такое :)).
Так ладно, отвлеклись. Давайте то же самое по-быстрому сделаем еще для Pclass и Ticket.
Тут стоило бы оформить в функцию. Но мы делаем понятный код, ок да?
Фух. Почти все готово. Единственное, что осталось - это разбить обратно на тестовую и обучательную, а обучательную - на train и val. Ща все объясню.
Когда мы начнем обучать модельку, нам, конечно, захочется проверить, насколько хорошо она обучилась. Но будет нечестно тестить на тех же данных, на которых мы обучали. Поэтому нам из выборки для обучения нужно вырезать немножко данных - для проверки. Валидация.
Так, тут значит мы разрезали нашу data обратно: на train и test.
Тут значит разбиваем на вход (X) и выход (y). То есть мы будем учить для X предсказывать y.
Вот и все. Теперь в X_train и y_train основная часть выборки. Осталось на этом обучить и протестить на X_test и y_test.
УРААААА ОБУЧЕЕЕЕНИЕЕЕ. Поздравляю, если вы не умерли до этого момента. А обучать мы будем (для начала) решающие деревья.
Едем!
Все, мы обучили. Да да. Уже обучили. Нет, серьезно. Без подвохов. Мы реально обучили простую модельку. Ну давайте протестим ее на данных из выборки и на тестовых данных!
То есть на проверочной (валидационной, validation) выборке мы получили 83% точности, когда на тестовой аж 97%. Поздравляю, вы обучили первую свою модель. =))
К сожалению, пикабу пишет "максимально можно добавить 51 блок", и я дошел до лимита. Честно. Так что...
Спасибо всем прочитавшим, а также по два спасибо подписчикам, как моим, так и соответствующего сообщества по этой тематике. Как вы уже догадались, будет третья часть, где уже широко развернемся с модельками. Там мы попробуем еще логистическую регрессию, метод ближайших соседей и что-нибудь еще (идеи можно присылать в комменты). А главное, мы в следующей части сможем отправить наше первое решение на kaggle, заняв какое-нибудь место.
Здесь вы найдете мой код, который был в презентации. Да и вообще всю папку. Жалко для вас что ли?
На этот раз бм сисек в посту не нашел.