{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Логистическая регрессия в задаче классификации успеха маркетинговой кампании" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Загрузим необходимые библиотеки" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import pandas as pd\n", "from matplotlib import pyplot as plt\n", "%matplotlib inline" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "from sklearn.metrics import accuracy_score, roc_curve, roc_auc_score, f1_score\n", "from sklearn.model_selection import train_test_split\n", "from sklearn.preprocessing import StandardScaler\n", "from sklearn.preprocessing import LabelBinarizer" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Логистическая регрессия\n", "\n", "Несмотря на название, данный метод применяется именно в задачах классификации. Регрессия служит указанием на то, что мы пытаемся предсказать вероятность принадлежности классу. \n", "\n", "Метод основан на минимизации логистической функции потерь:\n", "\n", "$$L(y_{true}, y_{predicted}) = \\sum_{i=1}^n \\ln (1 + e^{-y_{true} \\cdot y_{predicted}}) \\rightarrow \\min_w,$$\n", "где $y_{predicted}$ вычисляется по формуле $y_{predicted} = $. Минимизация функции потерь происходит методом градиентного спуска." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "from sklearn.linear_model import LogisticRegression" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Датасет" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Возьмем датасет, содержащий информацию о клиентах и маркетинговой кампании некоторого банка. Наша задача $-$ предсказать успешность кампании для каждого клиента. Признаками являются различные характеристики клиента и кампании." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Ссылка на датасет: http://archive.ics.uci.edu/ml/datasets/Bank+Marketing" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "# Считаем данные\n", "data = pd.read_csv('bank-additional-full.csv', sep=';')" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "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", "
agejobmaritaleducationdefaulthousingloancontactmonthday_of_week...campaignpdayspreviouspoutcomeemp.var.ratecons.price.idxcons.conf.idxeuribor3mnr.employedy
056housemaidmarriedbasic.4ynononotelephonemaymon...19990nonexistent1.193.994-36.44.8575191.0no
157servicesmarriedhigh.schoolunknownnonotelephonemaymon...19990nonexistent1.193.994-36.44.8575191.0no
237servicesmarriedhigh.schoolnoyesnotelephonemaymon...19990nonexistent1.193.994-36.44.8575191.0no
340admin.marriedbasic.6ynononotelephonemaymon...19990nonexistent1.193.994-36.44.8575191.0no
456servicesmarriedhigh.schoolnonoyestelephonemaymon...19990nonexistent1.193.994-36.44.8575191.0no
\n", "

5 rows × 21 columns

\n", "
" ], "text/plain": [ " age job marital education default housing loan contact \\\n", "0 56 housemaid married basic.4y no no no telephone \n", "1 57 services married high.school unknown no no telephone \n", "2 37 services married high.school no yes no telephone \n", "3 40 admin. married basic.6y no no no telephone \n", "4 56 services married high.school no no yes telephone \n", "\n", " month day_of_week ... campaign pdays previous poutcome emp.var.rate \\\n", "0 may mon ... 1 999 0 nonexistent 1.1 \n", "1 may mon ... 1 999 0 nonexistent 1.1 \n", "2 may mon ... 1 999 0 nonexistent 1.1 \n", "3 may mon ... 1 999 0 nonexistent 1.1 \n", "4 may mon ... 1 999 0 nonexistent 1.1 \n", "\n", " cons.price.idx cons.conf.idx euribor3m nr.employed y \n", "0 93.994 -36.4 4.857 5191.0 no \n", "1 93.994 -36.4 4.857 5191.0 no \n", "2 93.994 -36.4 4.857 5191.0 no \n", "3 93.994 -36.4 4.857 5191.0 no \n", "4 93.994 -36.4 4.857 5191.0 no \n", "\n", "[5 rows x 21 columns]" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data.head()" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "RangeIndex: 41188 entries, 0 to 41187\n", "Data columns (total 21 columns):\n", "age 41188 non-null int64\n", "job 41188 non-null object\n", "marital 41188 non-null object\n", "education 41188 non-null object\n", "default 41188 non-null object\n", "housing 41188 non-null object\n", "loan 41188 non-null object\n", "contact 41188 non-null object\n", "month 41188 non-null object\n", "day_of_week 41188 non-null object\n", "duration 41188 non-null int64\n", "campaign 41188 non-null int64\n", "pdays 41188 non-null int64\n", "previous 41188 non-null int64\n", "poutcome 41188 non-null object\n", "emp.var.rate 41188 non-null float64\n", "cons.price.idx 41188 non-null float64\n", "cons.conf.idx 41188 non-null float64\n", "euribor3m 41188 non-null float64\n", "nr.employed 41188 non-null float64\n", "y 41188 non-null object\n", "dtypes: float64(5), int64(5), object(11)\n", "memory usage: 6.6+ MB\n" ] } ], "source": [ "data.info()" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [], "source": [ "X = data.iloc[:, :-1].copy()\n", "y = data.iloc[:, -1].copy()\n", "y = LabelBinarizer().fit_transform(y).ravel()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Классы очень несбалансированы:" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.11265417111780131" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "y.mean()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Заметим, что среди признаков достаточно много категориальных, в то время как линейные модели работают с числовыми признаками.\n", "\n", "Одним из способов получить числовые значения категориальных параметров является **one-hot encoding**. Его суть состоит в том, что для каждого категориального признака $f$ и каждого его значения $v$ создается новый признак, который равен 1 если у объекта значение $f$ равно $v$, и 0 $-$ иначе.\n", "\n", "One-hot encoding с помощью pandas можно сделать одной строчкой:" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "RangeIndex: 41188 entries, 0 to 41187\n", "Data columns (total 63 columns):\n", "age 41188 non-null int64\n", "duration 41188 non-null int64\n", "campaign 41188 non-null int64\n", "pdays 41188 non-null int64\n", "previous 41188 non-null int64\n", "emp.var.rate 41188 non-null float64\n", "cons.price.idx 41188 non-null float64\n", "cons.conf.idx 41188 non-null float64\n", "euribor3m 41188 non-null float64\n", "nr.employed 41188 non-null float64\n", "job_admin. 41188 non-null uint8\n", "job_blue-collar 41188 non-null uint8\n", "job_entrepreneur 41188 non-null uint8\n", "job_housemaid 41188 non-null uint8\n", "job_management 41188 non-null uint8\n", "job_retired 41188 non-null uint8\n", "job_self-employed 41188 non-null uint8\n", "job_services 41188 non-null uint8\n", "job_student 41188 non-null uint8\n", "job_technician 41188 non-null uint8\n", "job_unemployed 41188 non-null uint8\n", "job_unknown 41188 non-null uint8\n", "marital_divorced 41188 non-null uint8\n", "marital_married 41188 non-null uint8\n", "marital_single 41188 non-null uint8\n", "marital_unknown 41188 non-null uint8\n", "education_basic.4y 41188 non-null uint8\n", "education_basic.6y 41188 non-null uint8\n", "education_basic.9y 41188 non-null uint8\n", "education_high.school 41188 non-null uint8\n", "education_illiterate 41188 non-null uint8\n", "education_professional.course 41188 non-null uint8\n", "education_university.degree 41188 non-null uint8\n", "education_unknown 41188 non-null uint8\n", "default_no 41188 non-null uint8\n", "default_unknown 41188 non-null uint8\n", "default_yes 41188 non-null uint8\n", "housing_no 41188 non-null uint8\n", "housing_unknown 41188 non-null uint8\n", "housing_yes 41188 non-null uint8\n", "loan_no 41188 non-null uint8\n", "loan_unknown 41188 non-null uint8\n", "loan_yes 41188 non-null uint8\n", "contact_cellular 41188 non-null uint8\n", "contact_telephone 41188 non-null uint8\n", "month_apr 41188 non-null uint8\n", "month_aug 41188 non-null uint8\n", "month_dec 41188 non-null uint8\n", "month_jul 41188 non-null uint8\n", "month_jun 41188 non-null uint8\n", "month_mar 41188 non-null uint8\n", "month_may 41188 non-null uint8\n", "month_nov 41188 non-null uint8\n", "month_oct 41188 non-null uint8\n", "month_sep 41188 non-null uint8\n", "day_of_week_fri 41188 non-null uint8\n", "day_of_week_mon 41188 non-null uint8\n", "day_of_week_thu 41188 non-null uint8\n", "day_of_week_tue 41188 non-null uint8\n", "day_of_week_wed 41188 non-null uint8\n", "poutcome_failure 41188 non-null uint8\n", "poutcome_nonexistent 41188 non-null uint8\n", "poutcome_success 41188 non-null uint8\n", "dtypes: float64(5), int64(5), uint8(53)\n", "memory usage: 5.2 MB\n" ] } ], "source": [ "X = pd.get_dummies(X)\n", "\n", "# Обратите внимание на признаки\n", "X.info()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Разобьем выборку на трейн и тест:" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Обучим линейный SVM с балансировкой классов:" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "from sklearn.svm import SVC" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Test accuracy: 0.6831755280407866\n", "Test F measure: 0.3803418803418803\n" ] } ], "source": [ "model_svm = SVC(kernel='linear', class_weight='balanced')\n", "model_svm.fit(X_train, y_train)\n", "\n", "y_pred = model_svm.predict(X_test)\n", "print('Test accuracy: ', accuracy_score(y_test, y_pred))\n", "print('Test F measure: ', f1_score(y_test, y_pred))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Обучим логистическую регрессию. Из-за несбалансированности классов порог нужно выставлять в зависимости от целей кампании:" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/Users/izakharkin/opt/anaconda3/lib/python3.7/site-packages/sklearn/linear_model/logistic.py:432: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n", " FutureWarning)\n" ] } ], "source": [ "model_logistic = LogisticRegression()\n", "model_logistic.fit(X_train, y_train)\n", "\n", "y_predicted = model_logistic.predict_proba(X_test)[:, 1]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Построим график зависимости F-меры от порога положительного класса:" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "grid = np.linspace(0, 1, 50)\n", "plt.figure(figsize=(10,5))\n", "plt.title('График зависимости F-меры от порога положительного класса', fontsize=14)\n", "plt.plot(grid, [f1_score(y_test, y_predicted > item) for item in grid])\n", "plt.grid()\n", "plt.xlabel('Порог', fontsize=12)\n", "plt.ylabel('f1_score', fontsize=12);" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Test accuracy: 0.8936635105608157\n", "Test F measure: 0.61101243339254\n", "Test ROC-AUC: 0.9338516554162647\n" ] } ], "source": [ "print('Test accuracy: ', accuracy_score(y_test, y_predicted > 0.2))\n", "print('Test F measure: ', f1_score(y_test, y_predicted > 0.2))\n", "print('Test ROC-AUC: ', roc_auc_score(y_test, y_predicted))" ] } ], "metadata": { "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.7.4" } }, "nbformat": 4, "nbformat_minor": 2 }