{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# American Express - Прогнозирование дефолта клиента в будущем","metadata":{}},{"cell_type":"markdown","source":"American Express является глобально интегрированной платежной компанией. Крупнейший эмитент платежных карт в мире, они предоставляют клиентам доступ к продуктам, идеям и опыту, которые обогащают жизнь и способствуют успеху в бизнесе.\n\nВ этом соревновании применены навыки машинного обучения, чтобы предсказать кредитный дефолт. В частности, использован набор данных промышленного масштаба для создания модели машинного обучения, которая бросает вызов текущей модели в рабочей среде. Наборы данных для обучения, проверки и тестирования включают поведенческие данные временных рядов и анонимную информацию профиля клиента.","metadata":{}},{"cell_type":"markdown","source":"В данном ноутбуке будет рассмотрена задача классификации: прогнозирование вероятности (predict_proba) того, что клиент не вернет сумму баланса своей кредитной карты в будущем на основе своего ежемесячного профиля клиента.\n\nЦелевая двоичная переменная рассчитывается путем наблюдения за 18-месячным окном производительности после последней выписки по кредитной карте, и если клиент не платит причитающуюся сумму в течение 120 дней после своей последней даты выписки, это считается событием по умолчанию.","metadata":{}},{"cell_type":"markdown","source":"<a class='menu' id='menu'>","metadata":{}},{"cell_type":"markdown","source":"* [Загрузка данных](#loading)\n* [1. EDA](#EDA)\n* [2. Обработка выбросов](#blowout)\n* [3. Обработка пропусков](#pass)\n* [4. Построение новых признаков](#new_feature)\n* [5. Построение графиков](#plot)\n* [6. Отбор признаков](#selection)\n* [7. Разбиение на train и test](#splitting)\n* [8. Построение модели](#model)\n* [9. Прогнозирование на тестовом датасете](#test)","metadata":{}},{"cell_type":"code","source":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load\n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\n# Input data files are available in the read-only \"../input/\" directory\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))\n\n# You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\" \n# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2022-06-22T12:03:40.256883Z","iopub.execute_input":"2022-06-22T12:03:40.257389Z","iopub.status.idle":"2022-06-22T12:03:40.281236Z","shell.execute_reply.started":"2022-06-22T12:03:40.257348Z","shell.execute_reply":"2022-06-22T12:03:40.280029Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"#### Подключение библиотек и скриптов","metadata":{}},{"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nfrom sklearn.linear_model import LinearRegression\nfrom sklearn.preprocessing import StandardScaler\nfrom sklearn.pipeline import Pipeline, make_pipeline, FeatureUnion\nfrom sklearn.base import BaseEstimator, TransformerMixin\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.metrics import mean_absolute_error, r2_score\nimport seaborn as sns\nfrom pylab import rcParams\n\nimport matplotlib\nimport matplotlib.pyplot as plt\n%matplotlib inline\n%config InlineBackend.figure_format = 'svg'\nplt.style.use('fivethirtyeight')\nmatplotlib.rcParams.update({'font.size': 5})\n\nimport warnings\nwarnings.filterwarnings('ignore')","metadata":{"execution":{"iopub.status.busy":"2022-06-22T11:21:20.333756Z","iopub.execute_input":"2022-06-22T11:21:20.334806Z","iopub.status.idle":"2022-06-22T11:21:22.152601Z","shell.execute_reply.started":"2022-06-22T11:21:20.334644Z","shell.execute_reply":"2022-06-22T11:21:22.151345Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# TRAIN_DATASET_PATH = '/kaggle/input/amex-default-prediction/train_data.csv'\nTRAIN_DATASET_PATH = '/kaggle/input/amexfeather/train_data.ftr'\nTEST_DATASET_PATH = '/kaggle/input/amexfeather/test_data.ftr'\nTRAIN_LABELS_PATH = '/kaggle/input/amex-default-prediction/train_labels.csv'\nPREPARED_TRAIN_DATASET_PATH = '/kaggle/input/amex-default-prediction/sample_submission.csv'","metadata":{"execution":{"iopub.status.busy":"2022-06-22T12:04:13.839651Z","iopub.execute_input":"2022-06-22T12:04:13.840695Z","iopub.status.idle":"2022-06-22T12:04:13.845847Z","shell.execute_reply.started":"2022-06-22T12:04:13.840647Z","shell.execute_reply":"2022-06-22T12:04:13.844892Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Загрузка данных<a class='loading' id='loading'>","metadata":{}},{"cell_type":"markdown","source":"* [вернуться в меню](#menu)","metadata":{}},{"cell_type":"markdown","source":"#### Описание датасета.\nНабор данных содержит агрегированные функции профиля для каждого клиента на дату каждой выписки. Функции анонимизируются и нормализуются и подразделяются на следующие общие категории:\n\nD_* = Переменные просрочки\\\nS_* = Переменные расходов\\\nP_* = Платежные переменные\\\nB_* = Переменные баланса\\\nR_* = Переменные риска\n\nПризнаки, являющиеся категоричными:\n\n['B_30', 'B_38', 'D_114', 'D_116', 'D_117', 'D_120', 'D_126', 'D_63', 'D_64', 'D_66', 'D_68']\n\n\nФайлы:\\\ntrain_data.csv - обучающие данные с несколькими датами по customer_ID\\\ntrain_labels.csv - этикетка для каждого targetcustomer_ID\\\ntest_data.csv - соответствующие тестовые данные\\\nsample_submission.csv - образец файла отправки в правильном формате","metadata":{}},{"cell_type":"markdown","source":"Использовались данные: https://www.kaggle.com/code/awaldeep/first-look-eda/data","metadata":{}},{"cell_type":"code","source":"df = pd.read_feather(TRAIN_DATASET_PATH)\ndf.head(3)","metadata":{"execution":{"iopub.status.busy":"2022-06-22T12:23:56.622781Z","iopub.execute_input":"2022-06-22T12:23:56.623516Z","iopub.status.idle":"2022-06-22T12:24:03.48055Z","shell.execute_reply.started":"2022-06-22T12:23:56.623469Z","shell.execute_reply":"2022-06-22T12:24:03.479272Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df.shape","metadata":{"execution":{"iopub.status.busy":"2022-06-22T12:05:38.012412Z","iopub.execute_input":"2022-06-22T12:05:38.01413Z","iopub.status.idle":"2022-06-22T12:05:38.023766Z","shell.execute_reply.started":"2022-06-22T12:05:38.014051Z","shell.execute_reply":"2022-06-22T12:05:38.022006Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"*Набор данных содержит 5 531 451 строк, но таргет в банковской сфере проявляется в последних датах по каждому клиенту. Поэтому удалю дубликаты, оставив данные по последним выданным кредитам.*","metadata":{}},{"cell_type":"code","source":"df.drop_duplicates(subset=['customer_ID'], keep='last', inplace=True)\ndf.shape","metadata":{"execution":{"iopub.status.busy":"2022-06-22T12:24:08.435892Z","iopub.execute_input":"2022-06-22T12:24:08.437331Z","iopub.status.idle":"2022-06-22T12:24:10.337918Z","shell.execute_reply.started":"2022-06-22T12:24:08.437277Z","shell.execute_reply":"2022-06-22T12:24:10.336645Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### EDA<a class='EDA' id=EDA>\n    \n    Делаем EDA для:\n\n- Исправления выбросов\n- Заполнения NaN\n- Идей для генерации новых фич\n    \n* [вернуться в меню](#menu)","metadata":{}},{"cell_type":"markdown","source":"<h5>смотрим основные ститистики</h5>","metadata":{}},{"cell_type":"code","source":"df.describe()","metadata":{"execution":{"iopub.status.busy":"2022-06-22T12:24:12.09364Z","iopub.execute_input":"2022-06-22T12:24:12.095144Z","iopub.status.idle":"2022-06-22T12:24:27.521559Z","shell.execute_reply.started":"2022-06-22T12:24:12.095092Z","shell.execute_reply":"2022-06-22T12:24:27.520293Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"*выявлены пустые значения, выбрасов не обнаружено*","metadata":{}},{"cell_type":"code","source":"df.dtypes.value_counts()","metadata":{"execution":{"iopub.status.busy":"2022-06-22T12:24:27.525018Z","iopub.execute_input":"2022-06-22T12:24:27.525432Z","iopub.status.idle":"2022-06-22T12:24:27.537814Z","shell.execute_reply.started":"2022-06-22T12:24:27.525394Z","shell.execute_reply":"2022-06-22T12:24:27.536334Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"*всего 177 колонок с плавающими значениями, 4 из них строковые и 2 признака содержат значения типа int*","metadata":{}},{"cell_type":"code","source":"df.select_dtypes(include = ['object', 'int64'])","metadata":{"execution":{"iopub.status.busy":"2022-06-22T12:24:27.539367Z","iopub.execute_input":"2022-06-22T12:24:27.539752Z","iopub.status.idle":"2022-06-22T12:24:27.576973Z","shell.execute_reply.started":"2022-06-22T12:24:27.539717Z","shell.execute_reply":"2022-06-22T12:24:27.575469Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### 2. Обработка выбросов<a class='blowout' id='blowout'>\n    \n* [вернуться в меню](#menu)","metadata":{}},{"cell_type":"markdown","source":"*Для каждого признака, если value_counts повторяется, выведем эти значения, чтобы определить категорийность и выбросы*","metadata":{}},{"cell_type":"code","source":"i = 0\nwhile i < 191:\n    col = df[df.columns[i]].value_counts()\n    if col.iloc[0] > 1:\n        print(col)\n    else: \n        print(f'---в {i} столбце {df.columns[i]} нет повторений  -----')\n    i+=1","metadata":{"execution":{"iopub.status.busy":"2022-06-22T12:25:18.041799Z","iopub.execute_input":"2022-06-22T12:25:18.042338Z","iopub.status.idle":"2022-06-22T12:25:20.927346Z","shell.execute_reply.started":"2022-06-22T12:25:18.042294Z","shell.execute_reply":"2022-06-22T12:25:20.925338Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"- Данные в датафрейме приведены за март 2018\n- значения в D_63 категорийные и снижаются достаточно плавно, выбрасов не обнаружено.\n- значения в D_64 категорийные и снижаются достаточно плавно, выбрасов не обнаружено.\n- признак D_66, D_87 имеет только значения 1, остальные пустые, в дальнейшем заполним 0.","metadata":{}},{"cell_type":"markdown","source":"### 3. Обработка пропусков<a class='pass' id='pass'>\n* [вернуться в меню](#menu)","metadata":{}},{"cell_type":"code","source":"df[df.columns[0:20]].isna().sum()","metadata":{"execution":{"iopub.status.busy":"2022-06-22T12:32:35.608951Z","iopub.execute_input":"2022-06-22T12:32:35.609464Z","iopub.status.idle":"2022-06-22T12:32:35.731944Z","shell.execute_reply.started":"2022-06-22T12:32:35.609421Z","shell.execute_reply":"2022-06-22T12:32:35.730772Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"i = 0\nwhile i < 191:\n    col_nan = df[df.columns[0:191]].isna().sum()[i]\n    if col_nan > 0: \n        try:\n            print(f'колонка {i} - {df.columns[i]}: медиана {df[df.columns[i]].median()}, среднее {df[df.columns[i]].mean()}, мин. {df[df.columns[i]].min()}') \n            df.loc[df[df.columns[i]].isna(), df.columns[i]] = df[df.columns[i]].median()\n        except TypeError:\n            print(f'----- колонка {i} {df.columns[i]} строковые значения ----')\n    else:\n        print(f'----- колонка {i} -------')\n    i+=1\n    ","metadata":{"execution":{"iopub.status.busy":"2022-06-22T12:32:56.787711Z","iopub.execute_input":"2022-06-22T12:32:56.788141Z","iopub.status.idle":"2022-06-22T12:35:40.401208Z","shell.execute_reply.started":"2022-06-22T12:32:56.788104Z","shell.execute_reply":"2022-06-22T12:35:40.399811Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df[df.columns[54]].value_counts()","metadata":{"execution":{"iopub.status.busy":"2022-06-22T12:35:40.405001Z","iopub.execute_input":"2022-06-22T12:35:40.406231Z","iopub.status.idle":"2022-06-22T12:35:40.419981Z","shell.execute_reply.started":"2022-06-22T12:35:40.406153Z","shell.execute_reply":"2022-06-22T12:35:40.4187Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"rcParams['figure.figsize'] = 3, 2\nmatplotlib.rcParams.update({'font.size': 8})\ndf[df.columns[54]].value_counts().plot(kind=\"bar\", logy=True, color='#058025')\n\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2022-06-22T12:39:32.333823Z","iopub.execute_input":"2022-06-22T12:39:32.335307Z","iopub.status.idle":"2022-06-22T12:39:32.648021Z","shell.execute_reply.started":"2022-06-22T12:39:32.335244Z","shell.execute_reply":"2022-06-22T12:39:32.646775Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df.loc[(df[df.columns[54]].isna())&(df[df.columns[54]] == -1), df.columns[54]] = 'O'\ndf[df.columns[54]].isna().sum()","metadata":{"execution":{"iopub.status.busy":"2022-06-22T12:39:29.34992Z","iopub.execute_input":"2022-06-22T12:39:29.350598Z","iopub.status.idle":"2022-06-22T12:39:29.366145Z","shell.execute_reply.started":"2022-06-22T12:39:29.350541Z","shell.execute_reply":"2022-06-22T12:39:29.364447Z"},"trusted":true},"execution_count":null,"outputs":[]}]}