{ "cells": [ { "cell_type": "markdown", "id": "68cd31ff", "metadata": {}, "source": [ "# 단국대 따릉이 대여량 \n", "\n", "### train/test\n", "- train : 2018-01-01 ~ 2020-12-31(3년치) (1095, 13) IN:2020-02-29, Out:2019-09-07\n", "- test : 2021-01-01 ~ 2021-12-31(1년치) (365, 12)\n", "\n", "\n", "### 독립변수\n", "+ date: 날짜\n", "+ precipitation: 강수량(mm)\n", "+ temp_mean: 평균 기온(℃)\n", "+ temp_highest: 최고 기온(℃)\n", "+ temp_lowest: 최저 기온(℃)\n", "+ PM10: 미세먼지(㎍/㎥)\n", "+ PM2.5: 초미세먼지(㎍/㎥)\n", "+ humidity: 습도(%rh)\n", "+ sunshine_sum: 일조합\n", "+ sunshine_rate: 일조율\n", "+ wind_mean: 평균 풍속(m/s)\n", "+ wind_max: 최대 풍속(m/s)\n", "\n", "### 종속변수\n", "+ rentals : 따릉이 대여량" ] }, { "cell_type": "code", "execution_count": 104, "id": "96caa9a0", "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
dateprecipitationtemp_meantemp_highesttemp_lowestPM10PM2.5humiditysunshine_sumsunshine_ratewind_meanwind_maxrental
02018-01-01NaN-1.33.8-5.134.017.039.18.386.51.43.84950
12018-01-02NaN-1.81.8-4.336.022.042.07.982.31.84.97136
22018-01-03NaN-4.7-0.4-7.131.019.042.38.688.72.23.57156
32018-01-04NaN-4.7-0.7-8.739.024.043.06.263.91.43.57102
42018-01-05NaN-3.01.6-5.651.035.048.48.284.51.73.67705
..........................................
10902020-12-270.05.810.01.470.042.062.95.961.51.82.837103
10912020-12-281.36.711.44.266.044.072.18.083.31.43.146912
10922020-12-290.20.14.3-6.269.046.070.80.00.02.96.135747
10932020-12-30NaN-10.9-6.2-12.939.015.055.58.386.54.16.222488
10942020-12-310.0-8.9-5.0-12.928.012.053.96.062.52.44.224535
\n", "

1095 rows × 13 columns

\n", "
" ], "text/plain": [ " date precipitation temp_mean temp_highest temp_lowest PM10 \\\n", "0 2018-01-01 NaN -1.3 3.8 -5.1 34.0 \n", "1 2018-01-02 NaN -1.8 1.8 -4.3 36.0 \n", "2 2018-01-03 NaN -4.7 -0.4 -7.1 31.0 \n", "3 2018-01-04 NaN -4.7 -0.7 -8.7 39.0 \n", "4 2018-01-05 NaN -3.0 1.6 -5.6 51.0 \n", "... ... ... ... ... ... ... \n", "1090 2020-12-27 0.0 5.8 10.0 1.4 70.0 \n", "1091 2020-12-28 1.3 6.7 11.4 4.2 66.0 \n", "1092 2020-12-29 0.2 0.1 4.3 -6.2 69.0 \n", "1093 2020-12-30 NaN -10.9 -6.2 -12.9 39.0 \n", "1094 2020-12-31 0.0 -8.9 -5.0 -12.9 28.0 \n", "\n", " PM2.5 humidity sunshine_sum sunshine_rate wind_mean wind_max \\\n", "0 17.0 39.1 8.3 86.5 1.4 3.8 \n", "1 22.0 42.0 7.9 82.3 1.8 4.9 \n", "2 19.0 42.3 8.6 88.7 2.2 3.5 \n", "3 24.0 43.0 6.2 63.9 1.4 3.5 \n", "4 35.0 48.4 8.2 84.5 1.7 3.6 \n", "... ... ... ... ... ... ... \n", "1090 42.0 62.9 5.9 61.5 1.8 2.8 \n", "1091 44.0 72.1 8.0 83.3 1.4 3.1 \n", "1092 46.0 70.8 0.0 0.0 2.9 6.1 \n", "1093 15.0 55.5 8.3 86.5 4.1 6.2 \n", "1094 12.0 53.9 6.0 62.5 2.4 4.2 \n", "\n", " rental \n", "0 4950 \n", "1 7136 \n", "2 7156 \n", "3 7102 \n", "4 7705 \n", "... ... \n", "1090 37103 \n", "1091 46912 \n", "1092 35747 \n", "1093 22488 \n", "1094 24535 \n", "\n", "[1095 rows x 13 columns]" ] }, "execution_count": 104, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import numpy as np\n", "import pandas as pd\n", "import matplotlib.pyplot as plt\n", "import seaborn as sns\n", "\n", "train = pd.read_csv('./input/dankook/train.csv')\n", "test = pd.read_csv('./input/dankook/test.csv')\n", "train" ] }, { "cell_type": "code", "execution_count": null, "id": "e7630f34", "metadata": {}, "outputs": [], "source": [ "test.info()" ] }, { "cell_type": "code", "execution_count": 105, "id": "ea356a45", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "RangeIndex: 1095 entries, 0 to 1094\n", "Data columns (total 13 columns):\n", "date 1095 non-null object\n", "precipitation 417 non-null float64\n", "temp_mean 1095 non-null float64\n", "temp_highest 1095 non-null float64\n", "temp_lowest 1095 non-null float64\n", "PM10 1028 non-null float64\n", "PM2.5 1027 non-null float64\n", "humidity 1095 non-null float64\n", "sunshine_sum 1090 non-null float64\n", "sunshine_rate 1095 non-null float64\n", "wind_mean 1095 non-null float64\n", "wind_max 1095 non-null float64\n", "rental 1095 non-null int64\n", "dtypes: float64(11), int64(1), object(1)\n", "memory usage: 111.3+ KB\n" ] } ], "source": [ "train.info()" ] }, { "cell_type": "code", "execution_count": 106, "id": "74a88b13", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "date 0\n", "precipitation 678\n", "temp_mean 0\n", "temp_highest 0\n", "temp_lowest 0\n", "PM10 67\n", "PM2.5 68\n", "humidity 0\n", "sunshine_sum 5\n", "sunshine_rate 0\n", "wind_mean 0\n", "wind_max 0\n", "rental 0\n", "dtype: int64" ] }, "execution_count": 106, "metadata": {}, "output_type": "execute_result" } ], "source": [ "train.isnull().sum()" ] }, { "cell_type": "markdown", "id": "81c27fc6", "metadata": {}, "source": [ "### 결측치 처리\n" ] }, { "cell_type": "code", "execution_count": 107, "id": "70557936", "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", "
dateprecipitationtemp_meantemp_highesttemp_lowestPM10PM2.5humiditysunshine_sumsunshine_ratewind_meanwind_maxrental
02018-01-010.0-1.33.8-5.134.017.039.18.386.51.43.84950
12018-01-020.0-1.81.8-4.336.022.042.07.982.31.84.97136
22018-01-030.0-4.7-0.4-7.131.019.042.38.688.72.23.57156
32018-01-040.0-4.7-0.7-8.739.024.043.06.263.91.43.57102
42018-01-050.0-3.01.6-5.651.035.048.48.284.51.73.67705
\n", "
" ], "text/plain": [ " date precipitation temp_mean temp_highest temp_lowest PM10 \\\n", "0 2018-01-01 0.0 -1.3 3.8 -5.1 34.0 \n", "1 2018-01-02 0.0 -1.8 1.8 -4.3 36.0 \n", "2 2018-01-03 0.0 -4.7 -0.4 -7.1 31.0 \n", "3 2018-01-04 0.0 -4.7 -0.7 -8.7 39.0 \n", "4 2018-01-05 0.0 -3.0 1.6 -5.6 51.0 \n", "\n", " PM2.5 humidity sunshine_sum sunshine_rate wind_mean wind_max rental \n", "0 17.0 39.1 8.3 86.5 1.4 3.8 4950 \n", "1 22.0 42.0 7.9 82.3 1.8 4.9 7136 \n", "2 19.0 42.3 8.6 88.7 2.2 3.5 7156 \n", "3 24.0 43.0 6.2 63.9 1.4 3.5 7102 \n", "4 35.0 48.4 8.2 84.5 1.7 3.6 7705 " ] }, "execution_count": 107, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# 결측치 처리\n", "def null(df): \n", " df['precipitation'] = df['precipitation'].fillna(0)\n", " df['PM10'] = df['PM10'].fillna(df['PM10'].mean())\n", " df['PM2.5'] = df['PM2.5'].fillna(df['PM2.5'].mean())\n", " df['sunshine_sum'] = df['sunshine_sum'].fillna(df['sunshine_sum'].mean())\n", " return df\n", "\n", "train = null(train)\n", "test = null(test)\n", "train.head()" ] }, { "cell_type": "markdown", "id": "412c16cf", "metadata": {}, "source": [ "### 날짜 변환" ] }, { "cell_type": "code", "execution_count": 108, "id": "05f9cdbc", "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
precipitationtemp_meantemp_highesttemp_lowestPM10PM2.5humiditysunshine_sumsunshine_ratewind_meanwind_maxyearmonthday
00.0-4.21.6-9.830.017.064.06.567.72.04.1202111
10.0-5.0-1.4-8.434.012.038.59.093.82.65.4202112
20.0-5.6-2.0-9.139.014.045.05.556.72.04.5202113
30.0-3.50.3-8.440.023.051.44.647.41.73.2202114
40.0-5.5-2.1-9.930.017.052.88.688.72.95.7202115
.............................................
3600.0-7.6-3.9-12.933.020.060.93.839.61.73.120211227
3610.0-4.1-0.9-8.551.038.073.81.717.72.23.120211228
3620.20.45.9-3.866.049.072.91.818.82.65.920211229
3630.0-3.90.2-6.830.017.048.57.376.03.36.620211230
3640.0-6.7-3.9-8.823.07.035.99.093.83.55.420211231
\n", "

365 rows × 14 columns

\n", "
" ], "text/plain": [ " precipitation temp_mean temp_highest temp_lowest PM10 PM2.5 \\\n", "0 0.0 -4.2 1.6 -9.8 30.0 17.0 \n", "1 0.0 -5.0 -1.4 -8.4 34.0 12.0 \n", "2 0.0 -5.6 -2.0 -9.1 39.0 14.0 \n", "3 0.0 -3.5 0.3 -8.4 40.0 23.0 \n", "4 0.0 -5.5 -2.1 -9.9 30.0 17.0 \n", ".. ... ... ... ... ... ... \n", "360 0.0 -7.6 -3.9 -12.9 33.0 20.0 \n", "361 0.0 -4.1 -0.9 -8.5 51.0 38.0 \n", "362 0.2 0.4 5.9 -3.8 66.0 49.0 \n", "363 0.0 -3.9 0.2 -6.8 30.0 17.0 \n", "364 0.0 -6.7 -3.9 -8.8 23.0 7.0 \n", "\n", " humidity sunshine_sum sunshine_rate wind_mean wind_max year month \\\n", "0 64.0 6.5 67.7 2.0 4.1 2021 1 \n", "1 38.5 9.0 93.8 2.6 5.4 2021 1 \n", "2 45.0 5.5 56.7 2.0 4.5 2021 1 \n", "3 51.4 4.6 47.4 1.7 3.2 2021 1 \n", "4 52.8 8.6 88.7 2.9 5.7 2021 1 \n", ".. ... ... ... ... ... ... ... \n", "360 60.9 3.8 39.6 1.7 3.1 2021 12 \n", "361 73.8 1.7 17.7 2.2 3.1 2021 12 \n", "362 72.9 1.8 18.8 2.6 5.9 2021 12 \n", "363 48.5 7.3 76.0 3.3 6.6 2021 12 \n", "364 35.9 9.0 93.8 3.5 5.4 2021 12 \n", "\n", " day \n", "0 1 \n", "1 2 \n", "2 3 \n", "3 4 \n", "4 5 \n", ".. ... \n", "360 27 \n", "361 28 \n", "362 29 \n", "363 30 \n", "364 31 \n", "\n", "[365 rows x 14 columns]" ] }, "execution_count": 108, "metadata": {}, "output_type": "execute_result" } ], "source": [ "train['date'] = pd.to_datetime(train['date'])\n", "test['date'] = pd.to_datetime(test['date'])\n", "train['year'] = train['date'].dt.year\n", "test['year'] = test['date'].dt.year\n", "train['month'] = train['date'].dt.month\n", "test['month'] = test['date'].dt.month\n", "train['day'] = train['date'].dt.day\n", "test['day'] = test['date'].dt.day\n", "train = train.drop(columns='date')\n", "test = test.drop(columns='date')\n", "test" ] }, { "cell_type": "markdown", "id": "85dfddfd", "metadata": {}, "source": [ "### val 시도" ] }, { "cell_type": "markdown", "id": "6ad40639", "metadata": { "heading_collapsed": true }, "source": [ "#### rf" ] }, { "cell_type": "code", "execution_count": 131, "id": "fe10731d", "metadata": { "hidden": true }, "outputs": [], "source": [ "from sklearn.preprocessing import LabelEncoder, MinMaxScaler, StandardScaler \n", "from sklearn.model_selection import train_test_split, GridSearchCV \n", "from sklearn.linear_model import LinearRegression\n", "from sklearn.ensemble import RandomForestRegressor \n", "\n", "X = train.drop(['rental'],axis=1)\n", "y = train[\"rental\"]\n", "X_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.3, shuffle=True)" ] }, { "cell_type": "code", "execution_count": 132, "id": "ee334c47", "metadata": { "hidden": true }, "outputs": [], "source": [ "from sklearn.ensemble import RandomForestRegressor\n", "model = RandomForestRegressor(max_features=8, min_samples_leaf=1, n_estimators=590)\n", "model.fit(X_train, y_train)\n", "pred = model.predict(X_val)" ] }, { "cell_type": "code", "execution_count": 123, "id": "0860335e", "metadata": { "hidden": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Fitting 5 folds for each of 49 candidates, totalling 245 fits\n" ] }, { "ename": "ValueError", "evalue": "Invalid parameter C for estimator RandomForestRegressor(). Check the list of available parameters with `estimator.get_params().keys()`.", "output_type": "error", "traceback": [ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[1;31mValueError\u001b[0m Traceback (most recent call last)", "\u001b[1;32m~\\AppData\\Local\\Temp\\ipykernel_14784\\1767163570.py\u001b[0m in \u001b[0;36m\u001b[1;34m\u001b[0m\n\u001b[0;32m 8\u001b[0m \u001b[0mmodel\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mRandomForestRegressor\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 9\u001b[0m \u001b[0mgrid_search\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mGridSearchCV\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mmodel\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mparam\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mcv\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;36m5\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mscoring\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;34m'neg_mean_squared_error'\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mverbose\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;36m2\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 10\u001b[1;33m \u001b[0mgrid_search\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mfit\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mX_train\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0my_train\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 11\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 12\u001b[0m \u001b[0mgrid_search\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mbest_params_\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;32m~\\anaconda3\\envs\\dankook\\lib\\site-packages\\sklearn\\model_selection\\_search.py\u001b[0m in \u001b[0;36mfit\u001b[1;34m(self, X, y, groups, **fit_params)\u001b[0m\n\u001b[0;32m 889\u001b[0m \u001b[1;32mreturn\u001b[0m \u001b[0mresults\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 890\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 891\u001b[1;33m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_run_search\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mevaluate_candidates\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 892\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 893\u001b[0m \u001b[1;31m# multimetric is determined here because in the case of a callable\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;32m~\\anaconda3\\envs\\dankook\\lib\\site-packages\\sklearn\\model_selection\\_search.py\u001b[0m in \u001b[0;36m_run_search\u001b[1;34m(self, evaluate_candidates)\u001b[0m\n\u001b[0;32m 1390\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0m_run_search\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mevaluate_candidates\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 1391\u001b[0m \u001b[1;34m\"\"\"Search all candidates in param_grid\"\"\"\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 1392\u001b[1;33m \u001b[0mevaluate_candidates\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mParameterGrid\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mparam_grid\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 1393\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 1394\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;32m~\\anaconda3\\envs\\dankook\\lib\\site-packages\\sklearn\\model_selection\\_search.py\u001b[0m in \u001b[0;36mevaluate_candidates\u001b[1;34m(candidate_params, cv, more_results)\u001b[0m\n\u001b[0;32m 849\u001b[0m )\n\u001b[0;32m 850\u001b[0m for (cand_idx, parameters), (split_idx, (train, test)) in product(\n\u001b[1;32m--> 851\u001b[1;33m \u001b[0menumerate\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mcandidate_params\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0menumerate\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mcv\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0msplit\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mX\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0my\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mgroups\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 852\u001b[0m )\n\u001b[0;32m 853\u001b[0m )\n", "\u001b[1;32m~\\anaconda3\\envs\\dankook\\lib\\site-packages\\joblib\\parallel.py\u001b[0m in \u001b[0;36m__call__\u001b[1;34m(self, iterable)\u001b[0m\n\u001b[0;32m 1041\u001b[0m \u001b[1;31m# remaining jobs.\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 1042\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_iterating\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;32mFalse\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 1043\u001b[1;33m \u001b[1;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mdispatch_one_batch\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0miterator\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 1044\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_iterating\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_original_iterator\u001b[0m \u001b[1;32mis\u001b[0m \u001b[1;32mnot\u001b[0m \u001b[1;32mNone\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 1045\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;32m~\\anaconda3\\envs\\dankook\\lib\\site-packages\\joblib\\parallel.py\u001b[0m in \u001b[0;36mdispatch_one_batch\u001b[1;34m(self, iterator)\u001b[0m\n\u001b[0;32m 859\u001b[0m \u001b[1;32mreturn\u001b[0m \u001b[1;32mFalse\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 860\u001b[0m \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 861\u001b[1;33m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_dispatch\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mtasks\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 862\u001b[0m \u001b[1;32mreturn\u001b[0m \u001b[1;32mTrue\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 863\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;32m~\\anaconda3\\envs\\dankook\\lib\\site-packages\\joblib\\parallel.py\u001b[0m in \u001b[0;36m_dispatch\u001b[1;34m(self, batch)\u001b[0m\n\u001b[0;32m 777\u001b[0m \u001b[1;32mwith\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_lock\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 778\u001b[0m \u001b[0mjob_idx\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mlen\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_jobs\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 779\u001b[1;33m \u001b[0mjob\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_backend\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mapply_async\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mbatch\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mcallback\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mcb\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 780\u001b[0m \u001b[1;31m# A job can complete so quickly than its callback is\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 781\u001b[0m \u001b[1;31m# called before we get here, causing self._jobs to\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;32m~\\anaconda3\\envs\\dankook\\lib\\site-packages\\joblib\\_parallel_backends.py\u001b[0m in \u001b[0;36mapply_async\u001b[1;34m(self, func, callback)\u001b[0m\n\u001b[0;32m 206\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0mapply_async\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mfunc\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mcallback\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;32mNone\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 207\u001b[0m \u001b[1;34m\"\"\"Schedule a func to be run\"\"\"\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 208\u001b[1;33m \u001b[0mresult\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mImmediateResult\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mfunc\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 209\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mcallback\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 210\u001b[0m \u001b[0mcallback\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mresult\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;32m~\\anaconda3\\envs\\dankook\\lib\\site-packages\\joblib\\_parallel_backends.py\u001b[0m in \u001b[0;36m__init__\u001b[1;34m(self, batch)\u001b[0m\n\u001b[0;32m 570\u001b[0m \u001b[1;31m# Don't delay the application, to avoid keeping the input\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 571\u001b[0m \u001b[1;31m# arguments in memory\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 572\u001b[1;33m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mresults\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mbatch\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 573\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 574\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0mget\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;32m~\\anaconda3\\envs\\dankook\\lib\\site-packages\\joblib\\parallel.py\u001b[0m in \u001b[0;36m__call__\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m 261\u001b[0m \u001b[1;32mwith\u001b[0m \u001b[0mparallel_backend\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_backend\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mn_jobs\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_n_jobs\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 262\u001b[0m return [func(*args, **kwargs)\n\u001b[1;32m--> 263\u001b[1;33m for func, args, kwargs in self.items]\n\u001b[0m\u001b[0;32m 264\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 265\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0m__reduce__\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;32m~\\anaconda3\\envs\\dankook\\lib\\site-packages\\joblib\\parallel.py\u001b[0m in \u001b[0;36m\u001b[1;34m(.0)\u001b[0m\n\u001b[0;32m 261\u001b[0m \u001b[1;32mwith\u001b[0m \u001b[0mparallel_backend\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_backend\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mn_jobs\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_n_jobs\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 262\u001b[0m return [func(*args, **kwargs)\n\u001b[1;32m--> 263\u001b[1;33m for func, args, kwargs in self.items]\n\u001b[0m\u001b[0;32m 264\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 265\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0m__reduce__\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;32m~\\anaconda3\\envs\\dankook\\lib\\site-packages\\sklearn\\utils\\fixes.py\u001b[0m in \u001b[0;36m__call__\u001b[1;34m(self, *args, **kwargs)\u001b[0m\n\u001b[0;32m 214\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0m__call__\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m*\u001b[0m\u001b[0margs\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 215\u001b[0m \u001b[1;32mwith\u001b[0m \u001b[0mconfig_context\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m**\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mconfig\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 216\u001b[1;33m \u001b[1;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mfunction\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m*\u001b[0m\u001b[0margs\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 217\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 218\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;32m~\\anaconda3\\envs\\dankook\\lib\\site-packages\\sklearn\\model_selection\\_validation.py\u001b[0m in \u001b[0;36m_fit_and_score\u001b[1;34m(estimator, X, y, scorer, train, test, verbose, parameters, fit_params, return_train_score, return_parameters, return_n_test_samples, return_times, return_estimator, split_progress, candidate_progress, error_score)\u001b[0m\n\u001b[0;32m 666\u001b[0m \u001b[0mcloned_parameters\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0mk\u001b[0m\u001b[1;33m]\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mclone\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mv\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0msafe\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;32mFalse\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 667\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 668\u001b[1;33m \u001b[0mestimator\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mestimator\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mset_params\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m**\u001b[0m\u001b[0mcloned_parameters\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 669\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 670\u001b[0m \u001b[0mstart_time\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mtime\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mtime\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;32m~\\anaconda3\\envs\\dankook\\lib\\site-packages\\sklearn\\base.py\u001b[0m in \u001b[0;36mset_params\u001b[1;34m(self, **params)\u001b[0m\n\u001b[0;32m 246\u001b[0m \u001b[1;34m\"Invalid parameter %s for estimator %s. \"\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 247\u001b[0m \u001b[1;34m\"Check the list of available parameters \"\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 248\u001b[1;33m \u001b[1;34m\"with `estimator.get_params().keys()`.\"\u001b[0m \u001b[1;33m%\u001b[0m \u001b[1;33m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 249\u001b[0m )\n\u001b[0;32m 250\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;31mValueError\u001b[0m: Invalid parameter C for estimator RandomForestRegressor(). Check the list of available parameters with `estimator.get_params().keys()`." ] } ], "source": [ "# 11-2. 예시1\n", "from sklearn.model_selection import GridSearchCV\n", "\n", "param = [{'kernel' : ['linear'],\n", "{'kernel' : ['rbf'], \n", "'gamma' : [0.01, 0.03, 0.1, 0.3, 1.0, 3.0]}]\n", "\n", "model = RandomForestRegressor()\n", "grid_search = GridSearchCV(model, param, cv=5, scoring='neg_mean_squared_error', verbose=2)\n", "grid_search.fit(X_train, y_train)\n", "\n", "grid_search.best_params_\n", "\n", "neg = grid_search.best_score_ # Best score: -0.737\n", "rmse = np.sqrt(-neg)\n", "\n", "for param_name in sorted(param.keys()):\n", " print(\"\\t%s: %r\" % (param_name, model.best_estimator_.get_params()[param_name]))" ] }, { "cell_type": "code", "execution_count": 130, "id": "55f5bb8c", "metadata": { "hidden": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "최적 하이퍼파라미터: {'max_features': 8, 'min_samples_leaf': 1, 'n_estimators': 590}\n", "최적 하이퍼파라미터의 성능(RMSE): 0.9561\n", "Wall time: 45.2 s\n" ] } ], "source": [ "%%time\n", "import scipy.stats as stats\n", "from sklearn.model_selection import RandomizedSearchCV\n", "\n", "rf = RandomForestRegressor(random_state=1217)\n", "params = {'n_estimators': stats.randint(200, 1000),\n", " 'max_features': stats.randint(4, 12),\n", " 'min_samples_leaf': stats.randint(1, 5)}\n", "\n", "# RandomizedSearchCV를 이용해 최적의 하이퍼파라미터 탐색\n", "rand_cv = RandomizedSearchCV(rf, param_distributions = params, n_iter=10, \n", " cv = 3, random_state = 1217, n_jobs=-1)\n", "rand_cv.fit(X_train, y_train)\n", "\n", "# 최적의 하이퍼파라미터 값과 성능 출력\n", "print('최적 하이퍼파라미터: ', rand_cv.best_params_)\n", "print('최적 하이퍼파라미터의 성능(RMSE): {:.4f}'.format(np.sqrt(rand_cv.best_score_)))" ] }, { "cell_type": "code", "execution_count": 133, "id": "0a3c484e", "metadata": { "hidden": true }, "outputs": [], "source": [ "import numpy as np\n", "\n", "def NMAE(true, pred):\n", " score = np.mean(np.abs(true-pred) / true)\n", " return score" ] }, { "cell_type": "code", "execution_count": 134, "id": "02e05177", "metadata": { "hidden": true }, "outputs": [ { "data": { "text/plain": [ "0.21381712106313697" ] }, "execution_count": 134, "metadata": {}, "output_type": "execute_result" } ], "source": [ "NMAE(y_val, pred)" ] }, { "cell_type": "markdown", "id": "cf2caebe", "metadata": {}, "source": [ "### xgb" ] }, { "cell_type": "markdown", "id": "6dbb4094", "metadata": {}, "source": [ "#### 기본 xgb" ] }, { "cell_type": "code", "execution_count": 147, "id": "45945ae9", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Wall time: 166 ms\n" ] }, { "data": { "text/plain": [ "0.1929053595279806" ] }, "execution_count": 147, "metadata": {}, "output_type": "execute_result" } ], "source": [ "%%time\n", "from xgboost import XGBRegressor\n", "\n", "xgb_model = XGBRegressor(random_state=1217)\n", "xgb_model.fit(X_train, y_train)\n", "pred1 = xgb_model.predict(X_val)\n", "NMAE(y_val, pred1)" ] }, { "cell_type": "markdown", "id": "babc5094", "metadata": {}, "source": [ "#### xgb + 랜덤서치" ] }, { "cell_type": "code", "execution_count": 145, "id": "a4a78ab2", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "C:\\Users\\HOME\\anaconda3\\envs\\dankook\\lib\\site-packages\\joblib\\externals\\loky\\process_executor.py:705: UserWarning: A worker stopped while some jobs were given to the executor. This can be caused by a too short worker timeout or by a memory leak.\n", " \"timeout or by a memory leak.\", UserWarning\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "최적 하이퍼파라미터: {'subsample': 0.9, 'n_estimators': 1000, 'max_depth': 6, 'learning_rate': 0.01, 'colsample_bytree': 0.8}\n", "최적 하이퍼파라미터의 성능(RMSE): 0.9671\n", "Wall time: 17 s\n" ] } ], "source": [ "%%time\n", "import scipy.stats as stats\n", "from sklearn.model_selection import RandomizedSearchCV\n", "\n", "xgb_model = XGBRegressor(random_state=1217)\n", "params = {\n", " 'n_estimators': [200, 500, 1000, 2000], \n", " 'learning_rate': [0.1, 0.05, 0.01], \n", " 'max_depth': [6, 7, 8], \n", " 'colsample_bytree': [0.8, 0.9, 1.0], \n", " 'subsample': [0.8, 0.9, 1.0],\n", "}\n", "\n", "# RandomizedSearchCV를 이용해 최적의 하이퍼파라미터 탐색\n", "rand_cv = RandomizedSearchCV(xgb_model, param_distributions = params, n_iter=10, cv = 3, random_state = 1217, n_jobs=-1)\n", "rand_cv.fit(X_train, y_train)\n", "\n", "# 최적의 하이퍼파라미터 값과 성능 출력\n", "print('최적 하이퍼파라미터: ', rand_cv.best_params_)\n", "print('최적 하이퍼파라미터의 성능(RMSE): {:.4f}'.format(np.sqrt(rand_cv.best_score_)))" ] }, { "cell_type": "code", "execution_count": 148, "id": "929508d3", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Wall time: 1.18 s\n" ] }, { "data": { "text/plain": [ "0.19554718042361574" ] }, "execution_count": 148, "metadata": {}, "output_type": "execute_result" } ], "source": [ "%%time\n", "import lightgbm as lgb\n", "\n", "xgb = XGBRegressor(subsample=0.9, n_estimators=1000, max_depth=6, learning_rate=0.01, colsample_bytree=0.8,random_state=1217)\n", "xgb.fit(X_train, y_train)\n", "pred2 = xgb.predict(X_val)\n", "NMAE(y_val, pred2)" ] }, { "cell_type": "code", "execution_count": 149, "id": "9910195f", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.19190113819849675" ] }, "execution_count": 149, "metadata": {}, "output_type": "execute_result" } ], "source": [ "NMAE(y_val, (pred1+pred2)/2)" ] }, { "cell_type": "code", "execution_count": 156, "id": "04b97254", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.18276694939078872" ] }, "execution_count": 156, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# https://dacon.io/competitions/official/235736/codeshare/2877?page=1&dtype=recent\n", "xgb_params = pd.read_csv('./input/dankook/hyperparameter_xgb.csv')\n", "xgb_reg = XGBRegressor(n_estimators = 10000, eta = xgb_params.iloc[47,1], min_child_weight = xgb_params.iloc[47,2], \n", " max_depth = xgb_params.iloc[47,3], colsample_bytree = xgb_params.iloc[47,4], \n", " subsample = xgb_params.iloc[47,5], seed=0)\n", "\n", "xgb_reg.fit(X_train, y_train, eval_set=[(X_train, y_train), (X_val, y_val)],\n", " early_stopping_rounds=300,\n", " verbose=False)\n", "\n", "pred5 = xgb_reg.predict(X_val)\n", "NMAE(y_val, pred5)" ] }, { "cell_type": "code", "execution_count": 158, "id": "cc8f207d", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.18735950479526048" ] }, "execution_count": 158, "metadata": {}, "output_type": "execute_result" } ], "source": [ "NMAE(y_val, (pred1+pred2+pred3+pred4+pred5)/5)" ] }, { "cell_type": "markdown", "id": "0e0684df", "metadata": { "heading_collapsed": true }, "source": [ "### lgbm" ] }, { "cell_type": "markdown", "id": "3fd699b0", "metadata": { "hidden": true }, "source": [ "#### 기본 lgbm" ] }, { "cell_type": "code", "execution_count": 150, "id": "f5d7ea75", "metadata": { "hidden": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Wall time: 85.8 ms\n" ] }, { "data": { "text/plain": [ "0.19887754523448536" ] }, "execution_count": 150, "metadata": {}, "output_type": "execute_result" } ], "source": [ "%%time\n", "import lightgbm as lgb\n", "\n", "lgbm = lgb.LGBMRegressor(random_state=1217)\n", "lgbm.fit(X_train, y_train)\n", "pred3 = lgbm.predict(X_val)\n", "NMAE(y_val, pred3)" ] }, { "cell_type": "markdown", "id": "783b8085", "metadata": { "hidden": true }, "source": [ "#### lgbm + 랜덤서치" ] }, { "cell_type": "code", "execution_count": 142, "id": "e2945ab5", "metadata": { "hidden": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "최적 하이퍼파라미터: {'subsample': 0.9, 'n_estimators': 1000, 'max_depth': 6, 'learning_rate': 0.01, 'colsample_bytree': 0.8}\n", "최적 하이퍼파라미터의 성능(RMSE): 0.9653\n", "Wall time: 6.76 s\n" ] } ], "source": [ "%%time\n", "import scipy.stats as stats\n", "from sklearn.model_selection import RandomizedSearchCV\n", "\n", "lgbm = lgb.LGBMRegressor(random_state=1217)\n", "params = {\n", " 'n_estimators': [200, 500, 1000, 2000], \n", " 'learning_rate': [0.1, 0.05, 0.01], \n", " 'max_depth': [6, 7, 8], \n", " 'colsample_bytree': [0.8, 0.9, 1.0], \n", " 'subsample': [0.8, 0.9, 1.0],\n", "}\n", "\n", "# RandomizedSearchCV를 이용해 최적의 하이퍼파라미터 탐색\n", "rand_cv = RandomizedSearchCV(lgbm, param_distributions = params, n_iter=10, cv = 3, random_state = 1217, n_jobs=-1)\n", "rand_cv.fit(X_train, y_train)\n", "\n", "# 최적의 하이퍼파라미터 값과 성능 출력\n", "print('최적 하이퍼파라미터: ', rand_cv.best_params_)\n", "print('최적 하이퍼파라미터의 성능(RMSE): {:.4f}'.format(np.sqrt(rand_cv.best_score_)))" ] }, { "cell_type": "code", "execution_count": 151, "id": "2dfc2300", "metadata": { "hidden": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Wall time: 466 ms\n" ] }, { "data": { "text/plain": [ "0.19640525966787967" ] }, "execution_count": 151, "metadata": {}, "output_type": "execute_result" } ], "source": [ "%%time\n", "import lightgbm as lgb\n", "\n", "lgbm = lgb.LGBMRegressor(subsample=0.9, n_estimators=1000, max_depth=6, learning_rate=0.01, colsample_bytree=0.8,random_state=1217)\n", "lgbm.fit(X_train, y_train)\n", "pred4 = lgbm.predict(X_val)\n", "NMAE(y_val, pred4)" ] }, { "cell_type": "code", "execution_count": 152, "id": "b205587b", "metadata": { "hidden": true }, "outputs": [ { "data": { "text/plain": [ "0.18975235731772788" ] }, "execution_count": 152, "metadata": {}, "output_type": "execute_result" } ], "source": [ "NMAE(y_val, (pred1+pred2+pred3+pred4)/4)" ] }, { "cell_type": "markdown", "id": "c17c85fe", "metadata": { "heading_collapsed": true }, "source": [ "### 모델링" ] }, { "cell_type": "code", "execution_count": 109, "id": "a1a4550c", "metadata": { "hidden": true }, "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
precipitationtemp_meantemp_highesttemp_lowestPM10PM2.5humiditysunshine_sumsunshine_ratewind_meanwind_maxyearmonthday
00.0-1.33.8-5.134.017.039.18.386.51.43.8201811
10.0-1.81.8-4.336.022.042.07.982.31.84.9201812
20.0-4.7-0.4-7.131.019.042.38.688.72.23.5201813
30.0-4.7-0.7-8.739.024.043.06.263.91.43.5201814
40.0-3.01.6-5.651.035.048.48.284.51.73.6201815
.............................................
10900.05.810.01.470.042.062.95.961.51.82.820201227
10911.36.711.44.266.044.072.18.083.31.43.120201228
10920.20.14.3-6.269.046.070.80.00.02.96.120201229
10930.0-10.9-6.2-12.939.015.055.58.386.54.16.220201230
10940.0-8.9-5.0-12.928.012.053.96.062.52.44.220201231
\n", "

1095 rows × 14 columns

\n", "
" ], "text/plain": [ " precipitation temp_mean temp_highest temp_lowest PM10 PM2.5 \\\n", "0 0.0 -1.3 3.8 -5.1 34.0 17.0 \n", "1 0.0 -1.8 1.8 -4.3 36.0 22.0 \n", "2 0.0 -4.7 -0.4 -7.1 31.0 19.0 \n", "3 0.0 -4.7 -0.7 -8.7 39.0 24.0 \n", "4 0.0 -3.0 1.6 -5.6 51.0 35.0 \n", "... ... ... ... ... ... ... \n", "1090 0.0 5.8 10.0 1.4 70.0 42.0 \n", "1091 1.3 6.7 11.4 4.2 66.0 44.0 \n", "1092 0.2 0.1 4.3 -6.2 69.0 46.0 \n", "1093 0.0 -10.9 -6.2 -12.9 39.0 15.0 \n", "1094 0.0 -8.9 -5.0 -12.9 28.0 12.0 \n", "\n", " humidity sunshine_sum sunshine_rate wind_mean wind_max year month \\\n", "0 39.1 8.3 86.5 1.4 3.8 2018 1 \n", "1 42.0 7.9 82.3 1.8 4.9 2018 1 \n", "2 42.3 8.6 88.7 2.2 3.5 2018 1 \n", "3 43.0 6.2 63.9 1.4 3.5 2018 1 \n", "4 48.4 8.2 84.5 1.7 3.6 2018 1 \n", "... ... ... ... ... ... ... ... \n", "1090 62.9 5.9 61.5 1.8 2.8 2020 12 \n", "1091 72.1 8.0 83.3 1.4 3.1 2020 12 \n", "1092 70.8 0.0 0.0 2.9 6.1 2020 12 \n", "1093 55.5 8.3 86.5 4.1 6.2 2020 12 \n", "1094 53.9 6.0 62.5 2.4 4.2 2020 12 \n", "\n", " day \n", "0 1 \n", "1 2 \n", "2 3 \n", "3 4 \n", "4 5 \n", "... ... \n", "1090 27 \n", "1091 28 \n", "1092 29 \n", "1093 30 \n", "1094 31 \n", "\n", "[1095 rows x 14 columns]" ] }, "execution_count": 109, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X_train = train.drop(columns='rental')\n", "X_train" ] }, { "cell_type": "code", "execution_count": 110, "id": "ec6b8cfc", "metadata": { "hidden": true, "scrolled": true }, "outputs": [ { "data": { "text/plain": [ "array([ 23995.04141794, 25114.30285569, 25044.12427381, 27222.419789 ,\n", " 24516.07706993, 20830.85491642, 23514.62439376, 23742.38631221,\n", " 25015.91206993, 27688.58285177, 24385.59253468, 17293.66857662,\n", " 25520.53267066, 25295.23865876, 24571.40777911, 24408.9975808 ,\n", " 24330.53367531, 18551.36556406, 25473.67642943, 26599.33872407,\n", " 15461.76027814, 18199.378 , 30460.54666667, 39573.1818839 ,\n", " 40097.43560612, 15625.87903788, 24469.58893131, 17143.67764481,\n", " 22598.88946275, 20060.01806907, 27537.0308064 , 22472.5970724 ,\n", " 24400.67061969, 18644.46270228, 20914.3338991 , 22194.11052598,\n", " 28747.77035583, 26201.89200722, 24535.38816334, 23207.87597965,\n", " 23315.51049661, 34755.21192245, 38936.6106016 , 45059.99618277,\n", " 37932.89877778, 18013.62198752, 17820.85031247, 23442.2353181 ,\n", " 24312.33006275, 26428.06074606, 44372.33488909, 58103.8858692 ,\n", " 30156.41338866, 24954.13177276, 32451.55878474, 26804.40256593,\n", " 54977.83255556, 62574.42018788, 35516.50905301, 31464.938 ,\n", " 46203.15503175, 41141.95337932, 45360.33906882, 63516.54641367,\n", " 41923.52961821, 50756.34603866, 49103.4562782 , 44173.73079211,\n", " 52838.53243277, 52466.22517265, 46460.08500482, 50553.75860869,\n", " 49774.70260976, 44763.95710101, 51880.96027236, 60929.44727347,\n", " 60915.5473046 , 79219.51836022, 38623.98576648, 35387.94070118,\n", " 46896.6765696 , 62300.72223882, 62244.87875715, 71112.52954317,\n", " 57255.40350015, 27909.58958333, 30813.33333333, 48431.48466317,\n", " 67817.00122678, 77033.06603362, 88555.04478011, 84150.87570126,\n", " 28686.16902381, 66937.93154123, 76382.91928156, 86796.41464315,\n", " 85401.72377367, 78569.22767604, 85692.87268051, 79928.31946175,\n", " 84021.26011138, 28123.30691017, 50506.34489177, 65596.26156233,\n", " 75082.01896996, 56442.47665454, 58175.52503673, 72427.57255021,\n", " 79121.54034654, 83477.54677506, 84928.37847806, 82220.147776 ,\n", " 84469.46634693, 85356.98071915, 90478.51189965, 89675.00103018,\n", " 74743.20366264, 56509.58614954, 61119.86197078, 43324.89871068,\n", " 42673.88803922, 82260.82175564, 91401.68047238, 31369.11490552,\n", " 88083.12368976, 91976.85523871, 57347.36576623, 90210.49571021,\n", " 92520.04224477, 73861.80957728, 96083.68161079, 98794.50415417,\n", " 99884.70451602, 99805.34329914, 44263.67429679, 14551.74969251,\n", " 44295.99674816, 95524.91444335, 96654.94145436, 78218.78865259,\n", " 50471.80146786, 95922.24510959, 96851.65152669, 97435.65129437,\n", " 66481.78745077, 92978.74187309, 48380.12813492, 53922.7664596 ,\n", " 84531.68869804, 67446.38452725, 66745.98894248, 70912.22370335,\n", " 102880.08481666, 41933.60085849, 98743.71539247, 101331.85176144,\n", " 103228.89146393, 100780.95106263, 102646.22555382, 102135.54008719,\n", " 59114.30962701, 68300.79596273, 101828.88463665, 100032.40118458,\n", " 102907.83158329, 78555.3320138 , 103820.45362018, 101503.18450466,\n", " 40377.53781349, 102163.16281927, 100496.09217989, 103332.35194636,\n", " 103225.88727937, 62223.60126551, 102653.31490098, 102891.91168286,\n", " 67601.30351455, 65578.59867496, 96089.98295017, 66817.58229798,\n", " 71288.9536063 , 101188.61458895, 93777.35117785, 57048.40350496,\n", " 17207.02457347, 97160.87497121, 100448.01008316, 50698.91850061,\n", " 71251.23685756, 88279.51864172, 84324.07186338, 72358.55017871,\n", " 88735.61340717, 85218.57218411, 83849.47625647, 86759.0864303 ,\n", " 89920.70084861, 89617.17055259, 87659.22738717, 54161.43130087,\n", " 89217.82008702, 84828.10767504, 82220.70826566, 81863.73922484,\n", " 81790.16922484, 81778.13992652, 81184.78325986, 81085.84728367,\n", " 81457.4983429 , 85871.76447138, 83762.88089726, 62936.77721998,\n", " 36807.24605254, 72981.6600285 , 82950.02212236, 86024.07448147,\n", " 85581.7142695 , 85229.83597485, 94253.12417123, 51224.6948961 ,\n", " 96440.29332208, 91965.96949692, 91956.8198552 , 92444.54909586,\n", " 95475.04903252, 94794.07109471, 100882.60297193, 97732.19978376,\n", " 58735.43874278, 73045.38374308, 100881.63342041, 97286.46053473,\n", " 47527.83726054, 89963.74850945, 44114.17503144, 21627.64454545,\n", " 80905.10660213, 73025.13942645, 73181.92006422, 94231.28548648,\n", " 77036.01685713, 95139.37504511, 21159.64983754, 74151.98341978,\n", " 107068.7501419 , 109069.04050355, 110363.5845785 , 110405.71638032,\n", " 60832.27680133, 13701.20004966, 81332.35480641, 102273.74847883,\n", " 98848.9948061 , 102728.39992302, 109362.72830349, 108894.16671347,\n", " 110337.95485211, 110926.63101576, 111539.98068047, 111274.45241102,\n", " 110620.91886259, 109077.72903981, 111307.30270665, 64360.40792038,\n", " 73541.82416872, 111196.82056228, 111041.05675038, 98718.61633967,\n", " 111348.91512491, 110126.70249865, 77367.10157582, 21094.33714706,\n", " 96738.41931311, 65771.59906061, 100010.41274859, 107679.53638952,\n", " 62264.08256067, 87653.55709401, 49358.05116621, 50371.3181191 ,\n", " 52114.80848268, 78125.87690675, 35967.94680704, 82386.31379393,\n", " 97566.24547912, 109442.76039862, 102678.71450175, 93774.1351478 ,\n", " 86898.53354639, 66084.21735065, 58515.34953379, 54767.13918499,\n", " 87133.98395957, 86093.75104653, 88692.37962222, 90226.21656889,\n", " 90683.48071481, 89893.69638262, 91021.81515461, 92747.01108662,\n", " 92554.20521734, 95891.3352229 , 93282.47680688, 78457.94603626,\n", " 83597.96066271, 83909.70990683, 87709.01576228, 86033.90797393,\n", " 88638.95648335, 91766.91900643, 90975.36267539, 38393.73189286,\n", " 47478.1037535 , 57532.81105264, 64277.98746098, 63531.97762044,\n", " 65117.88924303, 86634.08102404, 83115.08265655, 68128.97328445,\n", " 61091.86174511, 84127.84639097, 81503.8222258 , 78664.00450378,\n", " 40535.14278705, 45560.65343617, 38331.92911538, 53624.00268884,\n", " 57997.83526985, 53986.23589798, 54279.11831785, 51323.61173266,\n", " 59949.73359928, 34385.98776984, 34351.48122222, 47924.54770907,\n", " 51020.48016511, 52359.31667476, 51368.84608689, 48271.7137043 ,\n", " 56560.41629295, 60034.52250915, 50842.70500406, 42805.53278397,\n", " 48919.83220788, 41338.60141987, 27420.34261111, 46206.81099434,\n", " 43135.05691059, 46604.48397677, 28944.76981685, 26806.97152381,\n", " 37440.78409216, 43905.25999771, 45768.91072093, 45969.64616837,\n", " 44592.58817437, 30330.7114245 , 24448.10049206, 27434.07834921,\n", " 28268.06674242, 27186.2237381 , 39766.06321809, 24602.55590476,\n", " 27132.66559524])" ] }, "execution_count": 110, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from sklearn.ensemble import RandomForestRegressor\n", "model = RandomForestRegressor(max_depth=10, n_estimators=100, random_state=0)\n", "model.fit(X_train, train['rental'])\n", "pred = model.predict(test)\n", "pred" ] }, { "cell_type": "code", "execution_count": 111, "id": "7bf44867", "metadata": { "hidden": true }, "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", "
daterental
02021-01-0123995.041418
12021-01-0225114.302856
22021-01-0325044.124274
32021-01-0427222.419789
42021-01-0524516.077070
.........
3602021-12-2728268.066742
3612021-12-2827186.223738
3622021-12-2939766.063218
3632021-12-3024602.555905
3642021-12-3127132.665595
\n", "

365 rows × 2 columns

\n", "
" ], "text/plain": [ " date rental\n", "0 2021-01-01 23995.041418\n", "1 2021-01-02 25114.302856\n", "2 2021-01-03 25044.124274\n", "3 2021-01-04 27222.419789\n", "4 2021-01-05 24516.077070\n", ".. ... ...\n", "360 2021-12-27 28268.066742\n", "361 2021-12-28 27186.223738\n", "362 2021-12-29 39766.063218\n", "363 2021-12-30 24602.555905\n", "364 2021-12-31 27132.665595\n", "\n", "[365 rows x 2 columns]" ] }, "execution_count": 111, "metadata": {}, "output_type": "execute_result" } ], "source": [ "submission = pd.read_csv('./input/dankook/sample_submission.csv')\n", "submission['rental'] = pred\n", "submission.to_csv('./output/dankook/dankook6.csv', index=False)\n", "submission" ] }, { "cell_type": "code", "execution_count": 112, "id": "54f8009c", "metadata": { "hidden": true }, "outputs": [], "source": [ "import numpy as np\n", "\n", "def NMAE(true, pred):\n", " score = np.mean(np.abs(true-pred) / true)\n", " return score" ] }, { "cell_type": "code", "execution_count": 113, "id": "df94ba2b", "metadata": { "hidden": true }, "outputs": [ { "ename": "NameError", "evalue": "name 'val_y' is not defined", "output_type": "error", "traceback": [ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[1;31mNameError\u001b[0m Traceback (most recent call last)", "\u001b[1;32m~\\AppData\\Local\\Temp\\ipykernel_14784\\3435665192.py\u001b[0m in \u001b[0;36m\u001b[1;34m\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mNMAE\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mval_y\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mval_pred\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[1;31mNameError\u001b[0m: name 'val_y' is not defined" ] } ], "source": [ "NMAE(, pred)" ] }, { "cell_type": "code", "execution_count": null, "id": "68d0bd1f", "metadata": { "hidden": true }, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "a3050632", "metadata": { "hidden": true }, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "081adb8d", "metadata": { "hidden": true }, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "3d9fb256", "metadata": { "hidden": true }, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "a472873f", "metadata": { "hidden": true }, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "c9885c0f", "metadata": { "hidden": true }, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "9231d114", "metadata": { "heading_collapsed": true }, "source": [ "### Time_Series로 변환" ] }, { "cell_type": "code", "execution_count": 54, "id": "5fb83590", "metadata": { "hidden": true }, "outputs": [], "source": [ "# 데이터프레임을 Series로 변환하는 함수\n", "def time_series(df):\n", " index1 = pd.date_range(min(df['date']), '2019-09-06')\n", " index2 = pd.date_range('2019-09-08', max(df['date']))\n", " ts1 = pd.Series(df['rental'][:len(index1)].values, index=index1)\n", " ts2 = pd.Series(df['rental'][len(index1):len(train)].values, index=index2)\n", " ts = pd.concat([ts1, ts2])\n", " return ts" ] }, { "cell_type": "code", "execution_count": 55, "id": "5260ee0c", "metadata": { "hidden": true }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 55, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "#plt.figure(figsize=(15,6))\n", "time_series(train).plot()" ] }, { "cell_type": "markdown", "id": "36258fdb", "metadata": { "heading_collapsed": true }, "source": [ "### 정상성 확인(차분 필요여부)" ] }, { "cell_type": "code", "execution_count": 6, "id": "2f6e1951", "metadata": { "hidden": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "p_val : 0.218787 , should_diff : True\n" ] } ], "source": [ "# pmdarima 패키지에 있는 ADFTest 클래스를 임포트\n", "from pmdarima.arima import ADFTest\n", "\n", "# ADF-Test 시행\n", "p_val, should_diff = ADFTest().should_diff(time_series(train))\n", "print('p_val : %f , should_diff : %s' %(p_val, should_diff))" ] }, { "cell_type": "markdown", "id": "2608cc66", "metadata": { "heading_collapsed": true }, "source": [ "### 파이썬에서 R 시계열 패키지 forecast를 통한 모델링" ] }, { "cell_type": "code", "execution_count": 7, "id": "e944bafd", "metadata": { "hidden": true }, "outputs": [ { "data": { "text/plain": [ "rpy2.rinterface.NULL" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from rpy2.robjects.packages import importr # rpy2 내의 패키지를 불러올 importr 클래스\n", "\n", "utils = importr('utils') # utils 패키지를 임포트\n", "utils.install_packages('forecast') # r의 forecast 패키지 설치.\n", "utils.install_packages('forecastHybrid') # r의 forecastHybrid 패키지 설치\n" ] }, { "cell_type": "code", "execution_count": 18, "id": "4a22bb15", "metadata": { "hidden": true }, "outputs": [ { "data": { "text/plain": [ "rpy2.rinterface.NULL" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "utils.install_packages('Zoo')" ] }, { "cell_type": "code", "execution_count": 37, "id": "a34732cc", "metadata": { "hidden": true }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "C:\\Users\\HOME\\anaconda3\\envs\\dankook\\lib\\site-packages\\rpy2-2.9.4-py3.7-win-amd64.egg\\rpy2\\robjects\\pandas2ri.py:191: FutureWarning: from_items is deprecated. Please use DataFrame.from_dict(dict(items), ...) instead. DataFrame.from_dict(OrderedDict(items)) may be used to preserve the key order.\n", " res = PandasDataFrame.from_items(items)\n" ] }, { "data": { "text/plain": [ "array([[ 39933.10411361, 13637.0960067 , 66229.11222053,\n", " -283.16982525, 80149.37805248],\n", " [ 42188.28994381, 14296.49793224, 70080.08195539,\n", " -468.52487092, 84845.10475855],\n", " [ 37130.67852744, 9094.15804744, 65167.19900745,\n", " -5747.47937897, 80008.83643385],\n", " ...,\n", " [ 47758.05378832, 8751.00021173, 86765.10736491,\n", " -11898.08663444, 107414.19421108],\n", " [ 34499.05378832, -4531.8832869 , 73529.99086354,\n", " -25193.61329353, 94191.72087017],\n", " [ 36546.05378832, -2508.75217986, 75600.8597565 ,\n", " -23183.11761518, 96275.22519182]])" ] }, "execution_count": 37, "metadata": {}, "output_type": "execute_result" } ], "source": [ "%%time\n", "import rpy2.robjects as robjects # r 함수를 파이썬에서 사용 가능하게 변환하는 모듈\n", "from rpy2.robjects import pandas2ri # 파이썬 자료형과 R 자료형의 호환을 도와주는 모듈\n", "\n", "# pandas2ri를 활성화 \n", "pandas2ri.activate()\n", "\n", "auto_arima = \"\"\"\n", " function(ts){\n", " library(forecast) # forecast 패키지 로드\n", " d_params = ndiffs(ts) # 시계열 자료의 차분 횟수 계산\n", " model = auto.arima(ts, max.p=2, d=d_params) # auto.arima 모델 생성\n", " forecasted_data = forecast(model, h=365) # 이후 3개월(h=3)을 예측\n", " out_df = data.frame(forecasted_data$mean) # 예측값을 R의 데이터프레임으로 변환\n", " colnames(out_df) = c('rental') # amount라는 열로 이름을 지정\n", " out_df\n", " }\n", "\"\"\"\n", "# r() 함수로 r 자료형을 파이썬에서 사용 가능\n", "auto_arima = robjects.r(auto_arima)\n", "ts = robjects.r('ts')# r 자료형 time series 자료형으로 만들어주는 함수\n", "c = robjects.r('c') # r 자료형 벡터를 만들어주는 함수\n", "#zoo = robjects.r('zoo')\n", "\n", "start_year = int(min(train['date'])[:4]) # 영업 시작 년도\n", "start_month = int(min(train['date'])[5:7]) # 영업 시작 월\n", " \n", "# R의 ts 함수로 r의 time series 자료형으로 변환\n", "train = ts(train['rental'], start=c(start_year, 0), frequency=365) \n", "\n", "#ensemble model\n", "forecast = auto_arima(train)\n", "a = (pandas2ri.ri2py(forecast).values) # 3개월 매출을 합산" ] }, { "cell_type": "code", "execution_count": 45, "id": "70785b19", "metadata": { "hidden": true, "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Wall time: 1.41 ms\n" ] }, { "data": { "text/plain": [ "array([ 39933.10411361, 42188.28994381, 37130.67852744, 34717.09634585,\n", " 26958.11822573, 13556.55226067, 33209.39453015, 40442.43062743,\n", " 41164.45484698, 35048.31274316, 31672.70097892, 38641.22868614,\n", " 40311.42062058, 40285.73049888, 40936.55026345, 41550.21856802,\n", " 36571.02800686, 29628.23138259, 40566.04711697, 42580.66392681,\n", " 44980.24486377, 46440.93080476, 31209.84346766, 27217.08801696,\n", " 34672.75531494, 28826.92386678, 44091.66150108, 49986.02682188,\n", " 50077.07046317, 47856.8361728 , 39152.36174899, 34386.67984947,\n", " 41684.81869058, 35010.80265128, 32316.65279504, 34407.38732073,\n", " 38547.0219522 , 34053.5702749 , 33107.04402666, 45964.45334901,\n", " 52571.80700423, 22707.11256296, 46384.37656623, 53238.60466551,\n", " 41846.80174369, 18807.97201958, 25787.11913825, 31783.24624903,\n", " 44731.35607297, 48037.45096104, 41789.5329445 , 30300.60377836,\n", " 37169.66497893, 48104.71785633, 27949.7635425 , 47783.80301542,\n", " 50536.8371201 , 24654.8665866 , 47707.89204571, 36441.91404242,\n", " 48651.93304762, 51457.94946815, 43279.96365551, 47861.97591341,\n", " 52907.98650427, 54389.99565478, 66256.00356084, 65031.01039169,\n", " 22617.01629356, 57256.02139278, 62105.02579852, 55565.02960508,\n", " 54580.03289396, 45226.03573556, 54452.0381907 , 59252.04031195,\n", " 74130.04214471, 36267.04372822, 65850.04509638, 75770.04627847,\n", " 76447.04729979, 75697.04818222, 82009.04894464, 85471.04960337,\n", " 59644.05017252, 72194.05066426, 76688.05108913, 80441.05145621,\n", " 81304.05177338, 86632.0520474 , 82269.05228417, 84140.05248873,\n", " 86867.05266547, 78416.05281818, 76122.05295011, 80425.05306411,\n", " 85696.0531626 , 84874.0532477 , 85393.05332122, 87032.05338475,\n", " 87648.05343963, 75346.05348705, 89615.05352802, 95809.05356342,\n", " 101800.05359401, 95981.05362043, 47667.05364327, 104840.05366299,\n", " 41386.05368004, 68140.05369476, 70757.05370749, 63348.05371848,\n", " 76776.05372798, 84894.05373618, 90430.05374327, 94611.0537494 ,\n", " 89160.05375469, 98552.05375927, 100838.05376322, 108888.05376663,\n", " 105260.05376958, 100519.05377213, 101298.05377433, 105590.05377623,\n", " 100230.05377788, 100572.0537793 , 102656.05378052, 75485.05378158,\n", " 19611.0537825 , 77943.05378329, 88053.05378397, 90211.05378457,\n", " 101194.05378508, 101160.05378552, 25793.0537859 , 76560.05378623,\n", " 101460.05378651, 48772.05378676, 67567.05378697, 100268.05378715,\n", " 105941.05378731, 101328.05378745, 113267.05378757, 92368.05378767,\n", " 104542.05378776, 80509.05378783, 113960.0537879 , 111803.05378796,\n", " 116010.05378801, 117183.05378805, 105558.05378809, 111941.05378812,\n", " 91844.05378814, 115898.05378817, 109667.05378819, 119354.05378821,\n", " 117044.05378822, 113859.05378823, 115593.05378825, 114095.05378826,\n", " 70144.05378826, 112042.05378827, 121221.05378828, 102407.05378828,\n", " 106417.05378829, 120331.05378829, 118530.0537883 , 119734.0537883 ,\n", " 122388.0537883 , 121135.0537883 , 114344.05378831, 107464.05378831,\n", " 110405.05378831, 115225.05378831, 31767.05378831, 58426.05378831,\n", " 108161.05378831, 119012.05378831, 110579.05378831, 82064.05378832,\n", " 50097.05378832, 117207.05378832, 119853.05378832, 114764.05378832,\n", " 110499.05378832, 116675.05378832, 118836.05378832, 103418.05378832,\n", " 117887.05378832, 114839.05378832, 102891.05378832, 115668.05378832,\n", " 69378.05378832, 16870.05378832, 97497.05378832, 118960.05378832,\n", " 114752.05378832, 111960.05378832, 110320.05378832, 72815.05378832,\n", " 84302.05378832, 112836.05378832, 58459.05378832, 22750.05378832,\n", " 89006.05378832, 114509.05378832, 106813.05378832, 64933.05378832,\n", " 80225.05378832, 43735.05378832, 104479.05378832, 107716.05378832,\n", " 47009.05378832, 23502.05378832, 29586.05378832, 61389.05378832,\n", " 40762.05378832, 63467.05378832, 90082.05378832, 52031.05378832,\n", " 24395.05378832, 35530.05378832, 62985.05378832, 90272.05378832,\n", " 91364.05378832, 84886.05378832, 38278.05378832, 78022.05378832,\n", " 85379.05378832, 94213.05378832, 96676.05378832, 97431.05378832,\n", " 90712.05378832, 52137.05378832, 92605.05378832, 102308.05378832,\n", " 99905.05378832, 52180.05378832, 44756.05378832, 74056.05378832,\n", " 45808.05378832, 64915.05378832, 99673.05378832, 99903.05378832,\n", " 25755.05378832, 83535.05378832, 127070.05378832, 125264.05378832,\n", " 66136.05378832, 15155.05378832, 116617.05378832, 87423.05378832,\n", " 119161.05378832, 73485.05378832, 56714.05378832, 130932.05378832,\n", " 118476.05378832, 123923.05378832, 100756.05378832, 122099.05378832,\n", " 130374.05378832, 129644.05378832, 122809.05378832, 120380.05378832,\n", " 124630.05378832, 123354.05378832, 124005.05378832, 126731.05378832,\n", " 127122.05378832, 121621.05378832, 119725.05378832, 125834.05378832,\n", " 83687.05378832, 94110.05378832, 87286.05378832, 109737.05378832,\n", " 98102.05378832, 105167.05378832, 112380.05378832, 115359.05378832,\n", " 117520.05378832, 116098.05378832, 116689.05378832, 107416.05378832,\n", " 109732.05378832, 109171.05378832, 105009.05378832, 104566.05378832,\n", " 104620.05378832, 106851.05378832, 101412.05378832, 107121.05378832,\n", " 110588.05378832, 108577.05378832, 104111.05378832, 96683.05378832,\n", " 89463.05378832, 92508.05378832, 104385.05378832, 107422.05378832,\n", " 107044.05378832, 104278.05378832, 109099.05378832, 101455.05378832,\n", " 44936.05378832, 98716.05378832, 81450.05378832, 86170.05378832,\n", " 97101.05378832, 103826.05378832, 96162.05378832, 74255.05378832,\n", " 85493.05378832, 93976.05378832, 98606.05378832, 100204.05378832,\n", " 102765.05378832, 93564.05378832, 81109.05378832, 99594.05378832,\n", " 93269.05378832, 56463.05378832, 46601.05378832, 72343.05378832,\n", " 72301.05378832, 46839.05378832, 70777.05378832, 73876.05378832,\n", " 76932.05378832, 76308.05378832, 70103.05378832, 50503.05378832,\n", " 44222.05378832, 61936.05378832, 65896.05378832, 67622.05378832,\n", " 63544.05378832, 62926.05378832, 54964.05378832, 52627.05378832,\n", " 61820.05378832, 59625.05378832, 62487.05378832, 65432.05378832,\n", " 65547.05378832, 54157.05378832, 26373.05378832, 40041.05378832,\n", " 40039.05378832, 39689.05378832, 44326.05378832, 42206.05378832,\n", " 36141.05378832, 35453.05378832, 49297.05378832, 54497.05378832,\n", " 54229.05378832, 53113.05378832, 40611.05378832, 49148.05378832,\n", " 49114.05378832, 58923.05378832, 47758.05378832, 34499.05378832,\n", " 36546.05378832])" ] }, "execution_count": 45, "metadata": {}, "output_type": "execute_result" } ], "source": [ "%%time\n", "a = (pandas2ri.ri2py(forecast).values)\n", "a.shape\n", "a = a.mean(axis=1)\n", "a" ] }, { "cell_type": "code", "execution_count": 46, "id": "469a1846", "metadata": { "hidden": true }, "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", "
daterental
02021-01-0139933.104114
12021-01-0242188.289944
22021-01-0337130.678527
32021-01-0434717.096346
42021-01-0526958.118226
.........
3602021-12-2749114.053788
3612021-12-2858923.053788
3622021-12-2947758.053788
3632021-12-3034499.053788
3642021-12-3136546.053788
\n", "

365 rows × 2 columns

\n", "
" ], "text/plain": [ " date rental\n", "0 2021-01-01 39933.104114\n", "1 2021-01-02 42188.289944\n", "2 2021-01-03 37130.678527\n", "3 2021-01-04 34717.096346\n", "4 2021-01-05 26958.118226\n", ".. ... ...\n", "360 2021-12-27 49114.053788\n", "361 2021-12-28 58923.053788\n", "362 2021-12-29 47758.053788\n", "363 2021-12-30 34499.053788\n", "364 2021-12-31 36546.053788\n", "\n", "[365 rows x 2 columns]" ] }, "execution_count": 46, "metadata": {}, "output_type": "execute_result" } ], "source": [ "submission = pd.read_csv('./input/dankook/sample_submission.csv')\n", "submission['rental'] = a\n", "submission.to_csv('./output/dankook/dankook1.csv', index=False)\n", "submission" ] }, { "cell_type": "markdown", "id": "ce6f082f", "metadata": { "heading_collapsed": true }, "source": [ "### 시계열 모델 선택과 검증\n", "#### 자기회귀누적이동평균 모델" ] }, { "cell_type": "markdown", "id": "9a73491a", "metadata": { "hidden": true }, "source": [ "#### 지수평활법" ] }, { "cell_type": "code", "execution_count": 56, "id": "94ed587c", "metadata": { "hidden": true }, "outputs": [], "source": [ "import rpy2.robjects as robjects # r 함수를 파이썬에서 사용 가능하게 변환하는 모듈\n", "from rpy2.robjects import pandas2ri # 파이썬 자료형과 R 자료형의 호환을 도와주는 모듈\n", "\n", "# pandas2ri를 활성화 \n", "pandas2ri.activate()\n", "\n", "ets = \"\"\"\n", " function(ts){\n", " library(forecast) # forecast 패키지 로드\n", " model = ets(ts) # AIC가 낮은 지수평활 모델을 찾음 \n", " forecasted_data = forecast(model, h=365) # 이후 3개월(h=3)을 예측\n", " out_df = data.frame(forecasted_data$mean) # 예측값을 R의 데이터프레임으로 변환\n", " colnames(out_df) = c('amount') # amount라는 열로 이름을 지정\n", " out_df\n", " }\n", "\"\"\"\n", "# r() 함수로 r 자료형을 파이썬에서 사용 가능\n", "ets = robjects.r(ets)# str 형식으로 정의된 ets\n", "ts = robjects.r('ts')# r 자료형 time series 자료형으로 만들어주는 함수\n", "c = robjects.r('c') # r 자료형 벡터를 만들어주는 함수\n", "\n", " \n", "# R의 ts 함수로 r의 time series 자료형으로 변환\n", "ts_train2 = ts(train['rental'], start=c(2018, 0), frequency=365) \n", "\n", "#ensemble model\n", "forecast = auto_arima(ts_train2)\n", "b = (pandas2ri.ri2py(forecast).values) # 3개월 매출을 합산" ] }, { "cell_type": "code", "execution_count": 57, "id": "0a33a60f", "metadata": { "hidden": true }, "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", "
daterental
02021-01-0139933.104114
12021-01-0242188.289944
22021-01-0337130.678527
32021-01-0434717.096346
42021-01-0526958.118226
.........
3602021-12-2749114.053788
3612021-12-2858923.053788
3622021-12-2947758.053788
3632021-12-3034499.053788
3642021-12-3136546.053788
\n", "

365 rows × 2 columns

\n", "
" ], "text/plain": [ " date rental\n", "0 2021-01-01 39933.104114\n", "1 2021-01-02 42188.289944\n", "2 2021-01-03 37130.678527\n", "3 2021-01-04 34717.096346\n", "4 2021-01-05 26958.118226\n", ".. ... ...\n", "360 2021-12-27 49114.053788\n", "361 2021-12-28 58923.053788\n", "362 2021-12-29 47758.053788\n", "363 2021-12-30 34499.053788\n", "364 2021-12-31 36546.053788\n", "\n", "[365 rows x 2 columns]" ] }, "execution_count": 57, "metadata": {}, "output_type": "execute_result" } ], "source": [ "submission = pd.read_csv('./input/dankook/sample_submission.csv')\n", "submission['rental'] = b\n", "submission.to_csv('./output/dankook/dankook2.csv', index=False)\n", "submission" ] }, { "cell_type": "markdown", "id": "3b3367f3", "metadata": { "hidden": true }, "source": [ "#### STL 분해를 적용한 지수평활법" ] }, { "cell_type": "code", "execution_count": 58, "id": "bf943d15", "metadata": { "hidden": true }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "C:\\Users\\HOME\\anaconda3\\envs\\dankook\\lib\\site-packages\\ipykernel_launcher.py:6: FutureWarning: the 'freq' keyword is deprecated, use 'period' instead\n", " \n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "from statsmodels.tsa.seasonal import seasonal_decompose\n", "import matplotlib.pyplot as plt\n", "\n", "t_train = time_series(train)\n", "# STL 분해\n", "stl = seasonal_decompose(t_train.values, freq=12)\n", "stl.plot()\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 59, "id": "ca96a122", "metadata": { "hidden": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Wall time: 39min 30s\n" ] } ], "source": [ "%%time\n", "\n", "import rpy2.robjects as robjects # r 함수를 파이썬에서 사용 가능하게 변환하는 모듈\n", "from rpy2.robjects import pandas2ri # 파이썬 자료형과 R 자료형의 호환을 도와주는 모듈\n", "\n", "# pandas2ri를 활성화 \n", "pandas2ri.activate()\n", "stlm = \"\"\"\n", " function(ts){\n", " library(forecast) # forecast 패키지 로드\n", " model = stlm(ts, s.window=\"periodic\", method='ets') # STL 분해 후 지수평활법을 통한 예측 \n", " forecasted_data = forecast(model, h=365) # 이후 3개월(h=3)을 예측\n", " out_df = data.frame(forecasted_data$mean) # 예측값을 R의 데이터프레임으로 변환\n", " colnames(out_df) = c('amount') # amount라는 열로 이름을 지정\n", " out_df\n", " }\n", "\"\"\"\n", "ets = \"\"\"\n", " function(ts){\n", " library(forecast) # forecast 패키지 로드\n", " model = ets(ts) # AIC가 낮은 지수평활 모델을 찾음 \n", " forecasted_data = forecast(model, h=365) # 이후 3개월(h=3)을 예측\n", " out_df = data.frame(forecasted_data$mean) # 예측값을 R의 데이터프레임으로 변환\n", " colnames(out_df) = c('amount') # amount라는 열로 이름을 지정\n", " out_df\n", " }\n", "\"\"\"\n", "# r() 함수로 r을 파이썬에서 사용 가능\n", "stlm = robjects.r(stlm)# str 형식으로 정의된 stlm\n", "ets = robjects.r(ets)# str 형식으로 정의된 ets\n", "ts = robjects.r('ts')# r 자료형 time series 자료형으로 만들어주는 함수\n", "c = robjects.r('c') # r 자료형 벡터를 만들어주는 함수\n", "\n", "# R의 ts 함수로 r의 time series 자료형으로 변환\n", "ts_train3 = ts(train['rental'], start=c(2018, 0), frequency=365) \n", "\n", "#ensemble model\n", "forecast = auto_arima(ts_train3)\n", "c = (pandas2ri.ri2py(forecast).values) # 3개월 매출을 합산" ] }, { "cell_type": "code", "execution_count": 60, "id": "fd2a5dcd", "metadata": { "hidden": true }, "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", "
daterental
02021-01-0139933.104114
12021-01-0242188.289944
22021-01-0337130.678527
32021-01-0434717.096346
42021-01-0526958.118226
.........
3602021-12-2749114.053788
3612021-12-2858923.053788
3622021-12-2947758.053788
3632021-12-3034499.053788
3642021-12-3136546.053788
\n", "

365 rows × 2 columns

\n", "
" ], "text/plain": [ " date rental\n", "0 2021-01-01 39933.104114\n", "1 2021-01-02 42188.289944\n", "2 2021-01-03 37130.678527\n", "3 2021-01-04 34717.096346\n", "4 2021-01-05 26958.118226\n", ".. ... ...\n", "360 2021-12-27 49114.053788\n", "361 2021-12-28 58923.053788\n", "362 2021-12-29 47758.053788\n", "363 2021-12-30 34499.053788\n", "364 2021-12-31 36546.053788\n", "\n", "[365 rows x 2 columns]" ] }, "execution_count": 60, "metadata": {}, "output_type": "execute_result" } ], "source": [ "submission = pd.read_csv('./input/dankook/sample_submission.csv')\n", "submission['rental'] = c\n", "submission.to_csv('./output/dankook/dankook3.csv', index=False)\n", "submission" ] }, { "cell_type": "code", "execution_count": 61, "id": "c7569c54", "metadata": { "hidden": true }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 61, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "submission.plot()" ] }, { "cell_type": "markdown", "id": "d8948aa7", "metadata": { "heading_collapsed": true }, "source": [ "## 성능 향상을 위한 방법\n", "### 상점 매출액의 로그 정규화" ] }, { "cell_type": "code", "execution_count": 51, "id": "a5ed6e1a", "metadata": { "hidden": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "log-regularization mae: 2401.9664819482714\n", "mae: 25197.053143496625\n" ] } ], "source": [ "import rpy2.robjects as robjects # r 함수를 파이썬에서 사용 가능하게 변환하는 모듈\n", "from rpy2.robjects import pandas2ri # 파이썬 자료형과 R 자료형의 호환을 도와주는 모듈\n", "import numpy as np\n", "\n", "# pandas2ri를 활성화 \n", "pandas2ri.activate()\n", "\n", "auto_arima = \"\"\"\n", " function(ts){\n", " library(forecast) # forecast 패키지 로드\n", " d_params = ndiffs(ts) # 시계열 자료의 차분 횟수 계산\n", " model = auto.arima(ts, max.p=2, d=d_params) # auto.arima 모델 생성\n", " forecasted_data = forecast(model, h=365) # 이후 3개월(h=3)을 예측\n", " out_df = data.frame(forecasted_data$mean) # 예측값을 R의 데이터프레임으로 변환\n", " colnames(out_df) = c('amount') # amount라는 열로 이름을 지정\n", " out_df\n", " }\n", "\"\"\"\n", "\n", "# r() 함수로 r 자료형을 파이썬에서 사용 가능\n", "auto_arima = robjects.r(auto_arima)\n", "ts = robjects.r('ts')# r 자료형 time series 자료형으로 만들어주는 함수\n", "c = robjects.r('c') # r 자료형 벡터를 만들어주는 함수\n", "log = robjects.r('log')# 로그 변환 함수\n", "exp = robjects.r('exp')# 로그 역변환 함수\n", "\n", "# 0번 상점 추출\n", "store_0 = resampling_data[resampling_data['store_id']==0]\n", "start_year = int(min(store_0['year_month'])[:4]) # 영업 시작 년도\n", "start_month = int(min(store_0['year_month'])[5:]) # 영업 시작 월\n", "\n", "# train, test 분리\n", "train = store_0[store_0.index <= len(store_0)-4]\n", "test = store_0[store_0.index > len(store_0)-4]\n", "\n", "# R의 ts 함수로 r의 time series 자료형으로 변환\n", "train_log = ts(log(train['amount']), start=c(start_year, start_month), frequency=12) # log 정규화 \n", "train = ts(train['amount'], start=c(start_year, start_month), frequency=12) # log 정규화를 하지 않음\n", "\n", "# model arima\n", "forecast_log = auto_arima(train_log)\n", "forecast = auto_arima(train)\n", "\n", "# pred\n", "pred_log = np.sum(pandas2ri.ri2py(exp(forecast_log)).values) #로그 역변환 후 3개월 합산\n", "pred = np.sum(pandas2ri.ri2py(forecast).values) #3개월 매출을 합산\n", "\n", "# test(2018-12~2019-02)\n", "test = np.sum(test['amount'])\n", "\n", "# mae\n", "print('log-regularization mae: ', abs(test-pred_log))\n", "print('mae:', abs(test-pred))" ] }, { "cell_type": "code", "execution_count": 52, "id": "a1fa5967", "metadata": { "hidden": true }, "outputs": [], "source": [ "# 매출 변동 계수를 구하는 함수\n", "def coefficient_variation(df, i):\n", " cv_data = df.groupby(['store_id']).amount.std()/df.groupby(['store_id']).amount.mean()\n", " cv = cv_data[i]\n", " return cv" ] }, { "cell_type": "code", "execution_count": 53, "id": "f030b1f5", "metadata": { "hidden": true }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████████████████████████████████████████████████████████████████████████| 1967/1967 [48:06<00:00, 1.47s/it]\n" ] } ], "source": [ "import rpy2.robjects as robjects # r 함수를 파이썬에서 사용 가능하게 변환하는 모듈\n", "from rpy2.robjects import pandas2ri # 파이썬 자료형과 R 자료형의 호환을 도와주는 모듈\n", "import numpy as np\n", "\n", "# pandas2ri를 활성화 \n", "pandas2ri.activate()\n", "\n", "ets = \"\"\"\n", " function(ts){\n", " library(forecast) # forecast 패키지 로드\n", " model = ets(ts) # AIC가 낮은 지수평활 모델을 찾음 \n", " forecasted_data = forecast(model, h=3) # 이후 3개월(h=3)을 예측\n", " out_df = data.frame(forecasted_data$mean) # 예측값을 R의 데이터프레임으로 변환\n", " colnames(out_df) = c('amount') # amount라는 열로 이름을 지정\n", " out_df\n", " }\n", "\"\"\"\n", "\n", "# r() 함수로 r 자료형을 파이썬에서 사용 가능\n", "ets = robjects.r(ets)\n", "ts = robjects.r('ts') # r 자료형 time series 자료형으로 만들어주는 함수\n", "c = robjects.r('c') # r 자료형 벡터를 만들어주는 함수\n", "log = robjects.r('log') # 로그 변환 함수\n", "exp = robjects.r('exp')# 로그 역변환 함수\n", "\n", "final_pred = []\n", "\n", "for i in tqdm(resampling_data.store_id.unique()):\n", " store = resampling_data[resampling_data['store_id']==i]\n", " start_year = int(min(store['year_month'])[:4]) # 영업 시작 년도\n", " start_month = int(min(store['year_month'])[5:]) # 영업 시작 월\n", " \n", " cv = coefficient_variation(resampling_data, i)\n", " # 매출액 변동 계수가 0.3 미만인 경우만 log를 씌움\n", " if cv < 0.3:\n", " train_log = ts(log(store['amount']), start=c(start_year,start_month), frequency=12) \n", " # ets model\n", " forecast_log = ets(train_log)\n", " final_pred.append(np.sum(pandas2ri.ri2py(exp(forecast_log)).values))\n", " # 매출액 변동 계수가 0.3 이상인 경우\n", " else:\n", " train = ts(store['amount'], start=c(start_year,start_month), frequency=12)\n", " # 지수평활법\n", " forecast = ets(train)\n", " final_pred.append(np.sum(pandas2ri.ri2py(forecast).values)) " ] }, { "cell_type": "code", "execution_count": 54, "id": "dc640ec8", "metadata": { "hidden": true }, "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", "
store_idamount
001.963401e+06
112.483335e+05
221.260318e+06
342.660373e+06
457.091162e+05
.........
196221322.122653e+06
196321333.488475e+05
196421344.249576e+05
196521351.603989e+06
196621366.504026e+06
\n", "

1967 rows × 2 columns

\n", "
" ], "text/plain": [ " store_id amount\n", "0 0 1.963401e+06\n", "1 1 2.483335e+05\n", "2 2 1.260318e+06\n", "3 4 2.660373e+06\n", "4 5 7.091162e+05\n", "... ... ...\n", "1962 2132 2.122653e+06\n", "1963 2133 3.488475e+05\n", "1964 2134 4.249576e+05\n", "1965 2135 1.603989e+06\n", "1966 2136 6.504026e+06\n", "\n", "[1967 rows x 2 columns]" ] }, "execution_count": 54, "metadata": {}, "output_type": "execute_result" } ], "source": [ "submission = pd.read_csv('./submission.csv')\n", "submission['amount'] = final_pred\n", "submission.to_csv('submission4.csv', index=False)\n", "submission" ] }, { "cell_type": "markdown", "id": "447b24e2", "metadata": { "hidden": true }, "source": [ "### 4.5.2.\t파이썬에서 R 시계열 패키지 forecastHybrid를 통한 앙상블" ] }, { "cell_type": "code", "execution_count": 55, "id": "d621b190", "metadata": { "hidden": true }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████████████████████████████████████████████████████████████████████████| 1967/1967 [38:40<00:00, 1.18s/it]\n" ] } ], "source": [ "import rpy2.robjects as robjects # r 함수를 파이썬에서 사용 가능하게 변환하는 모듈\n", "from rpy2.robjects import pandas2ri # 파이썬 자료형과 R 자료형의 호환을 도와주는 모듈\n", "import numpy as np\n", "\n", "# pandas2ri를 활성화 \n", "pandas2ri.activate()\n", "\n", "hybridModel = \"\"\"\n", " function(ts){\n", " library(forecast)\n", " library(forecastHybrid)\n", " d_params=ndiffs(ts)\n", " hb_mdl<-hybridModel(ts, models=\"aes\", # auto_arima, ets, stlm\n", " a.arg=list(max.p=2, d=d_params), # auto_arima parameter\n", " weight=\"equal\") # 가중치를 동일하게 줌(평균)\n", " forecasted_data<-forecast(hb_mdl, h=365) # 이후 3개월(h=3)을 예측\n", " outdf<-data.frame(forecasted_data$mean)\n", " colnames(outdf)<-c('amount')\n", " outdf\n", " }\n", "\"\"\" \n", "\n", "# r() 함수로 r 자료형을 파이썬에서 사용 가능\n", "hybridModel = robjects.r(hybridModel)\n", "ts = robjects.r('ts') # r 자료형 time series 자료형으로 만들어주는 함수\n", "c = robjects.r('c') # r 자료형 벡터를 만들어주는 함수\n", "log = robjects.r('log') # 로그 변환 함수\n", "exp = robjects.r('exp')# 로그 역변환 함수\n", "\n", "final_pred = []\n", "\n", "for i in tqdm(resampling_data.store_id.unique()):\n", " store = resampling_data[resampling_data['store_id']==i]\n", " start_year = int(min(store['year_month'])[:4]) # 영업 시작 년도\n", " start_month = int(min(store['year_month'])[5:]) # 영업 시작 월\n", " \n", " cv = coefficient_variation(resampling_data, i)\n", " # 매출액 변동 계수가 0.3 미만인 경우만 log를 씌움\n", " if cv < 0.3:\n", " train_log = ts(log(store['amount']), start=c(start_year,start_month), frequency=12) \n", " # 앙상블 예측\n", " forecast_log = hybridModel(train_log)\n", " final_pred.append(np.sum(pandas2ri.ri2py(exp(forecast_log)).values)) \n", " # 매출액 변동 계수가 0.3 이상인 경우\n", " else:\n", " train = ts(store['amount'], start=c(start_year,start_month), frequency=12)\n", " # 앙상블 예측\n", " forecast = hybridModel(train)\n", " final_pred.append(np.sum(pandas2ri.ri2py(forecast).values))\n" ] }, { "cell_type": "code", "execution_count": 57, "id": "dd7cad3b", "metadata": { "hidden": true }, "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", "
store_idamount
001.973673e+06
112.700469e+05
221.279552e+06
342.695279e+06
458.240620e+05
.........
196221322.115933e+06
196321336.311052e+05
196421343.021292e+05
196521351.626442e+06
196621366.504046e+06
\n", "

1967 rows × 2 columns

\n", "
" ], "text/plain": [ " store_id amount\n", "0 0 1.973673e+06\n", "1 1 2.700469e+05\n", "2 2 1.279552e+06\n", "3 4 2.695279e+06\n", "4 5 8.240620e+05\n", "... ... ...\n", "1962 2132 2.115933e+06\n", "1963 2133 6.311052e+05\n", "1964 2134 3.021292e+05\n", "1965 2135 1.626442e+06\n", "1966 2136 6.504046e+06\n", "\n", "[1967 rows x 2 columns]" ] }, "execution_count": 57, "metadata": {}, "output_type": "execute_result" } ], "source": [ "submission = pd.read_csv('./submission.csv')\n", "submission['amount'] = final_pred\n", "submission.to_csv('submission5.csv', index=False)\n", "submission" ] }, { "cell_type": "code", "execution_count": null, "id": "2a052333", "metadata": { "hidden": true }, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "1d3edfe3", "metadata": { "hidden": true }, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "1d653b73", "metadata": { "hidden": true }, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "[dankook]", "language": "python", "name": "dankook" }, "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.13" }, "varInspector": { "cols": { "lenName": 16, "lenType": 16, "lenVar": 40 }, "kernels_config": { "python": { "delete_cmd_postfix": "", "delete_cmd_prefix": "del ", "library": "var_list.py", "varRefreshCmd": "print(var_dic_list())" }, "r": { "delete_cmd_postfix": ") ", "delete_cmd_prefix": "rm(", "library": "var_list.r", "varRefreshCmd": "cat(var_dic_list()) " } }, "types_to_exclude": [ "module", "function", "builtin_function_or_method", "instance", "_Feature" ], "window_display": false } }, "nbformat": 4, "nbformat_minor": 5 }