{ "cells": [ { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "GfkmyI58wjbt" }, "source": [ "# Python | Урок 1: pandas & sklearn\n", "\n", "## Загрузка необходимых библиотек\n", "\n", "Для работы нам понадобятся две библиотеки:\n", "\n", "- **pandas**: при помощи нее мы считаем из файла таблицу с данными \n", "- **sklearn**: библиотека для машинного обучения, из нее нам понадобится модуль **tree** для работы с решающими деревьями" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "colab": {}, "colab_type": "code", "id": "z6JWaPMexEiZ" }, "outputs": [], "source": [ "# Подключаем нужные библиотеки\n", "\n", "import pandas\n", "from sklearn import tree" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "qOjB9X0qxRP3" }, "source": [ "### 1. Загружаем данные при помощи библиотеки `pandas`\n", "\n", "В файле `dota2_skill_train.csv` содержатся данные о матчах, показателях игрока и показателях за последние 16 матчей \n", "почти по 100,000 игроков в Dota2" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "colab": {}, "colab_type": "code", "id": "YPtbalB-ycxM" }, "outputs": [], "source": [ "# Для чтения данных используем метод read_csv\n", "\n", "table = pandas.read_csv('dota2_skill_train.csv', index_col='id')" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "MtVjjFcGyq1Z" }, "source": [ "Посмотреть на первые строчки таблицы можно при помощи метода `head():`" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 204 }, "colab_type": "code", "id": "THYQXt-Rytfe", "outputId": "55f0e802-fbd3-4bf4-c81e-9d80d0373f68" }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
skilledplayer_teamwinner_teamdurationpre_game_durationfirst_blood_timefirst_blood_claimedhero_idhero_pick_orderleaver_status...avg_deaths_x16avg_assists_x16avg_gpm_x16avg_xpm_x16best_kills_x16best_assists_x16best_gpm_x16best_xpm_x16win_streakbest_win_streak
id
71diredire21409012909090...815352430103055174525
80radiantradiant2138901740550...9192944251337445717212
120radiantradiant35479036008170...79493543231869176233
131direradiant1878902807490...712515583253486993506
141direradiant22329012901460...1016337452344367279709
\n", "

5 rows × 57 columns

\n", "
" ], "text/plain": [ " skilled player_team winner_team duration pre_game_duration \\\n", "id \n", "7 1 dire dire 2140 90 \n", "8 0 radiant radiant 2138 90 \n", "12 0 radiant radiant 3547 90 \n", "13 1 dire radiant 1878 90 \n", "14 1 dire radiant 2232 90 \n", "\n", " first_blood_time first_blood_claimed hero_id hero_pick_order \\\n", "id \n", "7 129 0 90 9 \n", "8 174 0 5 5 \n", "12 360 0 81 7 \n", "13 28 0 74 9 \n", "14 129 0 14 6 \n", "\n", " leaver_status ... avg_deaths_x16 avg_assists_x16 \\\n", "id ... \n", "7 0 ... 8 15 \n", "8 0 ... 9 19 \n", "12 0 ... 7 9 \n", "13 0 ... 7 12 \n", "14 0 ... 10 16 \n", "\n", " avg_gpm_x16 avg_xpm_x16 best_kills_x16 best_assists_x16 best_gpm_x16 \\\n", "id \n", "7 352 430 10 30 551 \n", "8 294 425 13 37 445 \n", "12 493 543 23 18 691 \n", "13 515 583 25 34 869 \n", "14 337 452 34 43 672 \n", "\n", " best_xpm_x16 win_streak best_win_streak \n", "id \n", "7 745 2 5 \n", "8 717 2 12 \n", "12 762 3 3 \n", "13 935 0 6 \n", "14 797 0 9 \n", "\n", "[5 rows x 57 columns]" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Вызываем метод head у объекта table\n", "\n", "table.head()" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "S498S4m9zCdh" }, "source": [ "##### В этой таблице 57 колонок:\n", "\n", "56 признаков и целевая переменная для этой задачи\n", "- **skilled**: 1 (опытный игрок), 0 (новичок) " ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "8yXmOKOu0lOq" }, "source": [ "### 3. Формируем обучающую выборку\n", "\n", "Алгоритмы машинного обучения получают на вход выборку, которая представлена:\n", "- матрицей **`X`** (ее строчки соответствуют игрокам, столбцы — признакам) \n", "- вектором **`y`** из правильных ответов \n", "\n", "\n", "В этом примере мы будем предсказывать \"опытный игрок или нет\" по данным о скорости зарабатывания золота (`gold_per_min`) и общей стоимости всего инвентаря героя (`net_worth`)" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "colab": {}, "colab_type": "code", "id": "5j-kxoZBz9OI" }, "outputs": [], "source": [ "# Берем все строки и оставляем столбцы 'net_worth' и 'gold_per_min' \n", "X = table.loc[:, ['net_worth', 'gold_per_min']]\n", "\n", "# В качестве целевой переменной берем колонку skilled\n", "y = table['skilled']" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "xUsssPra07fH" }, "source": [ "### 4. Обучаем классификатор\n", "\n", "Для этого необходимо: \n", "\n", "1. Импортировать из библиотеки нужный классификатор, в нашем случае — DecisionTreeClassifier\n", "2. Передать его в переменную (создать объект классификатора) \n", "3. Указать при его создании все необходимые параметры \n", "4. Вызвать метод `fit` (что в переводе с английского — обучить, подстроить), передав ему обучающую выборку\n", "\n" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 119 }, "colab_type": "code", "id": "F0Jfv2XX2Eye", "outputId": "420c9094-538b-4406-ad2b-fe852591b324" }, "outputs": [ { "data": { "text/plain": [ "DecisionTreeClassifier(class_weight=None, criterion='gini', max_depth=2,\n", " max_features=None, max_leaf_nodes=None,\n", " min_impurity_decrease=0.0, min_impurity_split=None,\n", " min_samples_leaf=1, min_samples_split=2,\n", " min_weight_fraction_leaf=0.0, presort=False, random_state=None,\n", " splitter='best')" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Создаем объект классификатора classifier с глубиной дерева 2\n", "classifier = tree.DecisionTreeClassifier(max_depth=2)\n", "\n", "# Обучаем классификатор на подготовленной выборке\n", "classifier.fit(X, y)" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "LikgGU-r2H82" }, "source": [ "### 5. Построение предсказания по новым данным\n", "\n", "После того как классификатор (`classifier`) был обучен для предсказания можно использовать его готовый метод `predict`, который принимает на вход матрицу X с новыми данными о неком игроке. \n", "\n", "Так как для обучения были использованы два определенных признака, новые данные должны тоже должны содержать две колонки с информацией по этим признакам: net_worth и gold_per_min " ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 34 }, "colab_type": "code", "id": "_UC-8gp14tBE", "outputId": "81cc7af5-d40f-41a3-d819-b47dc0b401ed" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Предсказанная метка skilled: [0]\n" ] } ], "source": [ "# Создаем матрицу, состоящую из одной строчки и двух столбцов:\n", "# net_worth = 4008\n", "# gold_per_min = 120\n", "new_data = [[4008, 120]]\n", "\n", "# Предсказываем опытность игрока вызывая метод predict уже обученного классификатора\n", "prediction = classifier.predict(new_data)\n", "\n", "# Выводим результат\n", "print(\"Предсказанная метка skilled: \", prediction)" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "Cz73s-p25fS1" }, "source": [ "В результате получаем вектор (список) из предсказанных ответов. \n", "\n", "Поскольку матрица бсодержит параметры по одному игроку, то и выходной список состоит из одного элемента." ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "JvKwrkxz5i3q" }, "source": [ "### В этом уроке мы узнали как можно использовать некоторые методы библиотек `pandas` и `sklearn`. \n", "\n", "Они имеют большое количество удобных методов, которые помогут вам в решении задач машинного обучения.\n", "\n", "Подробнее о работе с библиотекой pandas можно почитать [здесь](https://habr.com/ru/company/ods/blog/322626/). В этой статье простым и понятным языком описаны основные приемы работы, которых вам будет более чем достаточно для участия в хакатоне.\n", "\n", "А все подробности о работе с деревьями решений можно узнать [тут ](https://habr.com/en/company/ods/blog/322534/). Не пугайтесь, когда увидите математические формулы и термины, можете пока их пропустить и прочитать статью обзорно. Главное, чтобы у вас сложилось общее понимание того, как работают эти модели машинного обучения, а математику выучите после, в универе ;)\n" ] } ], "metadata": { "colab": { "collapsed_sections": [], "name": "python_1.ipynb", "provenance": [], "version": "0.3.2" }, "kernelspec": { "display_name": "Python [Root]", "language": "python", "name": "Python [Root]" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.5.2" } }, "nbformat": 4, "nbformat_minor": 1 }