{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "\n", "## Открытый курс по машинному обучению. Сессия № 2\n", "Автор материала: программист-исследователь Mail.ru Group, старший преподаватель Факультета Компьютерных Наук ВШЭ Юрий Кашницкий. Материал распространяется на условиях лицензии [Creative Commons CC BY-NC-SA 4.0](https://creativecommons.org/licenses/by-nc-sa/4.0/). Можно использовать в любых целях (редактировать, поправлять и брать за основу), кроме коммерческих, но с обязательным упоминанием автора материала." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#
Тема 10. Бустинг\n", "##
Часть 4. Xgboost, интерфейс Sklearn" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Загрузка бибилиотек" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import pandas as pd\n", "from sklearn.metrics import accuracy_score, f1_score\n", "from sklearn.model_selection import train_test_split\n", "from sklearn.preprocessing import LabelEncoder\n", "from xgboost import XGBClassifier" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Загрузка и подготовка данных\n", "\n", "Посмотрим на примере данных по оттоку клиентов из телеком-компании." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df = pd.read_csv(\"../../data/telecom_churn.csv\")" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Штаты просто занумеруем, а признаки International plan (наличие международного роуминга), Voice mail plan (наличие голосовой почтыы) и целевой Churn сделаем бинарными.**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "state_enc = LabelEncoder()\n", "df[\"State\"] = state_enc.fit_transform(df[\"State\"])\n", "df[\"International plan\"] = (df[\"International plan\"] == \"Yes\").astype(\"int\")\n", "df[\"Voice mail plan\"] = (df[\"Voice mail plan\"] == \"Yes\").astype(\"int\")\n", "df[\"Churn\"] = (df[\"Churn\"]).astype(\"int\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Разделим данные на обучающую и тестовую выборки в отношении 7:3.**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "X_train, X_test, y_train, y_test = train_test_split(\n", " df.drop(\"Churn\", axis=1),\n", " df[\"Churn\"],\n", " test_size=0.3,\n", " stratify=df[\"Churn\"],\n", " random_state=17,\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Инициализация параметров\n", "\n", "- бинарная классификация (`'objective':'binary:logistic'`)\n", "- ограничим глубину деревьев (`'max_depth':3`)\n", "- не хотим лишнего вывода (`'silent':1`)\n", "- проведем 10 итераций бустинга\n", "- шаг градиентного спуска довольно большой (`'eta':1`) - алгоритм будет обучаться быстро и \"агрессивно\" (лучше результаты будут, если уменьшить eta и увеличить число итераций)\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "params = {\n", " \"objective\": \"binary:logistic\",\n", " \"max_depth\": 3,\n", " \"learning_rate\": 1.0,\n", " \"silent\": 1.0,\n", " \"n_estimators\": 50,\n", "}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Обучение классификатора\n", "Тут мы просто передаем слоавть параметров, данные и число итераций." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "xgb_model = XGBClassifier(**params).fit(X_train, y_train)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Прогнозы для тестовой выборки" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "preds_prob = xgb_model.predict(X_test)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Посчитаем долю правильных ответов алгоритма на тестовой выборке.**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "predicted_labels = preds_prob > 0.5\n", "print(\n", " \"Accuracy and F1 on the test set are: {} and {}\".format(\n", " round(accuracy_score(y_test, predicted_labels), 3),\n", " round(f1_score(y_test, predicted_labels), 3),\n", " )\n", ")" ] } ], "metadata": { "anaconda-cloud": {}, "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "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.6.1" } }, "nbformat": 4, "nbformat_minor": 1 }