{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Random Forest 실습"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 라이브러리 import 및 설정"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"ExecuteTime": {
"end_time": "2020-09-23T06:29:34.171510Z",
"start_time": "2020-09-23T06:29:33.893834Z"
}
},
"outputs": [],
"source": [
"%reload_ext autoreload\n",
"%autoreload 2\n",
"%matplotlib inline"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"ExecuteTime": {
"end_time": "2020-09-23T06:29:34.903682Z",
"start_time": "2020-09-23T06:29:34.173512Z"
}
},
"outputs": [],
"source": [
"from matplotlib import pyplot as plt\n",
"from matplotlib import rcParams\n",
"import numpy as np\n",
"from pathlib import Path\n",
"import pandas as pd\n",
"from sklearn.ensemble import RandomForestClassifier\n",
"from sklearn.metrics import accuracy_score\n",
"from sklearn.model_selection import train_test_split\n",
"import seaborn as sns\n",
"import warnings"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"ExecuteTime": {
"end_time": "2020-09-23T06:29:34.929096Z",
"start_time": "2020-09-23T06:29:34.906927Z"
}
},
"outputs": [],
"source": [
"rcParams['figure.figsize'] = (16, 8)\n",
"plt.style.use('fivethirtyeight')\n",
"pd.set_option('max_columns', 100)\n",
"pd.set_option(\"display.precision\", 4)\n",
"warnings.simplefilter('ignore')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 학습데이터 로드"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"[03-pandas-eda.ipynb](https://github.com/kaggler-tv/dku-kaggle-class/blob/master/notebook/03-pandas-eda.ipynb)에서 생성한 `feature.csv` 피처파일 사용"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"ExecuteTime": {
"end_time": "2020-09-23T06:29:34.956062Z",
"start_time": "2020-09-23T06:29:34.931530Z"
}
},
"outputs": [],
"source": [
"data_dir = Path('../data/dacon-dku')\n",
"feature_dir = Path('../build/feature')\n",
"sub_dir = Path('../build/sub')\n",
"\n",
"trn_file = data_dir / 'train.csv'\n",
"tst_file = data_dir / 'test.csv'\n",
"sample_file = data_dir / 'sample_submission.csv'\n",
"\n",
"target_col = 'class'\n",
"seed = 42"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"ExecuteTime": {
"end_time": "2020-09-23T06:29:34.982175Z",
"start_time": "2020-09-23T06:29:34.958196Z"
}
},
"outputs": [],
"source": [
"algo_name = 'rf'\n",
"feature_name = 'feature'\n",
"model_name = f'{algo_name}_{feature_name}'\n",
"\n",
"feature_file = feature_dir / f'{feature_name}.csv'\n",
"sub_file = sub_dir / f'{model_name}.csv'"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"ExecuteTime": {
"end_time": "2020-09-23T06:29:36.402767Z",
"start_time": "2020-09-23T06:29:34.984518Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(400000, 20)\n"
]
},
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" z | \n",
" redshift | \n",
" dered_u | \n",
" dered_g | \n",
" dered_r | \n",
" dered_i | \n",
" dered_z | \n",
" nObserve | \n",
" airmass_u | \n",
" class | \n",
" d_dered_u | \n",
" d_dered_g | \n",
" d_dered_r | \n",
" d_dered_i | \n",
" d_dered_z | \n",
" d_dered_ig | \n",
" d_dered_zg | \n",
" d_dered_rz | \n",
" d_dered_iz | \n",
" d_obs_det | \n",
"
\n",
" \n",
" id | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 16.9396 | \n",
" -8.1086e-05 | \n",
" 23.1243 | \n",
" 20.2578 | \n",
" 18.9551 | \n",
" 17.6321 | \n",
" 16.9089 | \n",
" 2.9444 | \n",
" 1.1898 | \n",
" 0.0 | \n",
" -0.1397 | \n",
" -0.0790 | \n",
" -0.0544 | \n",
" -0.0403 | \n",
" -0.0307 | \n",
" -2.6257 | \n",
" -3.3488 | \n",
" 2.0462 | \n",
" 0.7232 | \n",
" -15.0556 | \n",
"
\n",
" \n",
" 1 | \n",
" 13.1689 | \n",
" 4.5061e-03 | \n",
" 14.9664 | \n",
" 14.0045 | \n",
" 13.4114 | \n",
" 13.2363 | \n",
" 13.1347 | \n",
" 0.6931 | \n",
" 1.2533 | \n",
" 1.0 | \n",
" -0.0857 | \n",
" -0.0574 | \n",
" -0.0410 | \n",
" -0.0322 | \n",
" -0.0343 | \n",
" -0.7683 | \n",
" -0.8698 | \n",
" 0.2767 | \n",
" 0.1016 | \n",
" -0.3069 | \n",
"
\n",
" \n",
" 2 | \n",
" 15.3500 | \n",
" 4.7198e-04 | \n",
" 16.6076 | \n",
" 15.6866 | \n",
" 15.4400 | \n",
" 15.3217 | \n",
" 15.2961 | \n",
" 1.0986 | \n",
" 1.0225 | \n",
" 0.0 | \n",
" -0.1787 | \n",
" -0.1388 | \n",
" -0.0963 | \n",
" -0.0718 | \n",
" -0.0540 | \n",
" -0.3649 | \n",
" -0.3905 | \n",
" 0.1440 | \n",
" 0.0257 | \n",
" -0.9014 | \n",
"
\n",
" \n",
" 3 | \n",
" 19.6346 | \n",
" 5.8143e-06 | \n",
" 25.3536 | \n",
" 20.9947 | \n",
" 20.0873 | \n",
" 19.7947 | \n",
" 19.5552 | \n",
" 1.6094 | \n",
" 1.2054 | \n",
" 0.0 | \n",
" -0.3070 | \n",
" -0.1941 | \n",
" -0.1339 | \n",
" -0.1003 | \n",
" -0.0795 | \n",
" -1.2000 | \n",
" -1.4395 | \n",
" 0.5321 | \n",
" 0.2395 | \n",
" -1.3906 | \n",
"
\n",
" \n",
" 4 | \n",
" 17.9826 | \n",
" -3.3247e-05 | \n",
" 23.7714 | \n",
" 20.4338 | \n",
" 18.8630 | \n",
" 18.1903 | \n",
" 17.8759 | \n",
" 2.6391 | \n",
" 1.1939 | \n",
" 0.0 | \n",
" -0.6820 | \n",
" -0.2653 | \n",
" -0.1794 | \n",
" -0.1339 | \n",
" -0.1067 | \n",
" -2.2436 | \n",
" -2.5579 | \n",
" 0.9871 | \n",
" 0.3144 | \n",
" -9.3609 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" z redshift dered_u dered_g dered_r dered_i dered_z \\\n",
"id \n",
"0 16.9396 -8.1086e-05 23.1243 20.2578 18.9551 17.6321 16.9089 \n",
"1 13.1689 4.5061e-03 14.9664 14.0045 13.4114 13.2363 13.1347 \n",
"2 15.3500 4.7198e-04 16.6076 15.6866 15.4400 15.3217 15.2961 \n",
"3 19.6346 5.8143e-06 25.3536 20.9947 20.0873 19.7947 19.5552 \n",
"4 17.9826 -3.3247e-05 23.7714 20.4338 18.8630 18.1903 17.8759 \n",
"\n",
" nObserve airmass_u class d_dered_u d_dered_g d_dered_r d_dered_i \\\n",
"id \n",
"0 2.9444 1.1898 0.0 -0.1397 -0.0790 -0.0544 -0.0403 \n",
"1 0.6931 1.2533 1.0 -0.0857 -0.0574 -0.0410 -0.0322 \n",
"2 1.0986 1.0225 0.0 -0.1787 -0.1388 -0.0963 -0.0718 \n",
"3 1.6094 1.2054 0.0 -0.3070 -0.1941 -0.1339 -0.1003 \n",
"4 2.6391 1.1939 0.0 -0.6820 -0.2653 -0.1794 -0.1339 \n",
"\n",
" d_dered_z d_dered_ig d_dered_zg d_dered_rz d_dered_iz d_obs_det \n",
"id \n",
"0 -0.0307 -2.6257 -3.3488 2.0462 0.7232 -15.0556 \n",
"1 -0.0343 -0.7683 -0.8698 0.2767 0.1016 -0.3069 \n",
"2 -0.0540 -0.3649 -0.3905 0.1440 0.0257 -0.9014 \n",
"3 -0.0795 -1.2000 -1.4395 0.5321 0.2395 -1.3906 \n",
"4 -0.1067 -2.2436 -2.5579 0.9871 0.3144 -9.3609 "
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df = pd.read_csv(feature_file, index_col=0)\n",
"print(df.shape)\n",
"df.head()"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"ExecuteTime": {
"end_time": "2020-09-23T06:29:36.462180Z",
"start_time": "2020-09-23T06:29:36.404551Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(320000,) (320000, 19) (80000, 19)\n"
]
}
],
"source": [
"y = df[target_col].values[:320000]\n",
"df.drop(target_col, axis=1, inplace=True)\n",
"trn = df.iloc[:320000]\n",
"tst = df.iloc[320000:]\n",
"feature_name = df.columns.tolist()\n",
"print(y.shape, trn.shape, tst.shape)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 학습/검증 데이터 구분"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"ExecuteTime": {
"end_time": "2020-09-23T06:29:36.558469Z",
"start_time": "2020-09-23T06:29:36.464863Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(256000, 19) (64000, 19) (256000,) (64000,)\n"
]
}
],
"source": [
"X_trn, X_val, y_trn, y_val = train_test_split(trn, y, test_size=.2, random_state=seed)\n",
"print(X_trn.shape, X_val.shape, y_trn.shape, y_val.shape)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Random Forest 모델 학습"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"ExecuteTime": {
"end_time": "2020-09-23T06:29:49.049221Z",
"start_time": "2020-09-23T06:29:36.561126Z"
}
},
"outputs": [],
"source": [
"clf = RandomForestClassifier(n_estimators=100,\n",
" min_samples_leaf=10,\n",
" max_features='auto',\n",
" max_samples=.5,\n",
" random_state=seed,\n",
" n_jobs=-1)\n",
"clf.fit(X_trn, y_trn)\n",
"p_val = clf.predict(X_val)\n",
"p_tst = clf.predict(tst)"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"ExecuteTime": {
"end_time": "2020-09-23T06:29:49.080770Z",
"start_time": "2020-09-23T06:29:49.051369Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"92.4531%\n"
]
}
],
"source": [
"print(f'{accuracy_score(y_val, p_val) * 100:.4f}%')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 피처 중요도 시각화"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"ExecuteTime": {
"end_time": "2020-09-23T06:29:49.545263Z",
"start_time": "2020-09-23T06:29:49.083027Z"
}
},
"outputs": [
{
"data": {
"text/plain": [
""
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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6NAhzZgxQz4+Ppo2bVqVmH379un111/Xww8/rM8++0zvvfeeVqxYIUnKzMyU0WhUjx495OrqquzsbJWWllrWnJk6daomTZqkZs2a6f7779cPP/ygAwcO6NSpU5owYcJNc/Xy8tJ9992n8ePH6+LFi/r9739vGYuKilJERIRGjBihWbNmKSAgQGfPntXWrVsVFRWlHj161PKdAwAAAAAAtvCracJIP67psm3bNi1YsEAjRozQhQsX5OHhocGDB2vSpElycXGpcnxCQoIOHTqkRYsW6e6779ZLL71kWWi3WbNm+uSTT7RgwQJ9//33at26tZYsWWJpgowZM0Z33323lixZopdffllNmjRRu3bt9NRTT9Uo12HDhum5557ToEGDquRlMBi0bt06zZkzR4mJiTp37pzc3NwUHh6u2NjYWrpTAAAAAADA1gwlJSXm6g8DgDsXi6wB1kedAdZHnQHWRY2hJn41a8IAAAAAAADUZzRhAAAAAAAAbIAmDAAAAAAAgA3QhAEAAAAAALABmjAAAAAAAAA2QBMGAAAAAADABmjCAAAAAAAA2ABNGAAAAAAAABugCQMAAAAAAGADNGEAAAAAAABsgCYMAAAAAACADdCEAQAAAAAAsAH7uk4AtcNl5ckaHVcy1svKmQAAAAAAgOtpkE/CxMTEKD4+/hefZ+3atfLysl1T4vz583JxcVF2drbN5gQAAAAAAPVDg2zC3Eni4+MVExNT12kAAAAAAIBfiCYMAAAAAACADdT7Jkx5ebni4+Pl5eWlgIAALVq0qMaxJSUleuaZZ9SqVSt5eHjo4Ycf1pEjR645btOmTeratavc3d01aNAgHT161DJ24sQJxcbGys/PT56engoLC9P7779fo/m//PJL9enTR+7u7urVq5f27dt3zTFfffWVhg0bJm9vb/n7++uJJ57QmTNnJEnz5s3Tu+++q08//VQuLi68ygQAAAAAQANW75sw06dPV1ZWltasWaOMjAzl5+crJyenRrHx8fHav3+/3nnnHW3btk2Ojo4aMmSIvv/+e8sxly5d0vz585WamqrNmzfrypUrGjVqlMxmsyRp4sSJ+v777/XRRx9pz549mjdvnpo1a1bt3KWlpRo2bJj8/Py0Y8cOzZw5U9OnT69yzOnTpzVw4EC1a9dO27Zt04cffqjS0lKNGDFCJpNJzz33nB555BFF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TC4uLpZto9Go2NhYBQYGqmXLlurdu7cyMzOrzBcSEqKFCxfqhRdekI+Pj4KDg7VkyZIqx1y4cEETJkxQUFCQ3N3d1b17d/3973+3jH/xxRcaOHCgPD091a5dO02YMEEXL16shbt+LZowAAAAAADcYdavXy8nJydt27ZNL7zwgqZOnaqRI0eqbdu2ysrK0vDhw/X888/r9OnTVeKSk5P19NNPKzs7W1FRURoxYoS+/fZbSdK3336roUOHqmPHjtq1a5eWLl2q999/X7NmzapyjnXr1slsNmvTpk3685//rB07dkj68UM2BQUFlu3S0lL97ne/0wcffKDPPvtM0dHRGj16tL7++usq51u2bJmCg4O1c+dOJSYmasaMGdq7d68kyWw2a9iwYdq9e7dSU1P1xRdfaO7cuXJwcJAkHTp0SI8++qgGDBigzz77TGlpaTp48KDGjRtX+zddkqGkpKT+vhQGAPVAYWGhAgIC6joN4FeNOgOsjzoDaseFCxeu+2qPy8qTNs3jVteEuXph3oceekiVlZXasmWLpB8bFf7+/goLC7M8/fLDDz+oZcuWeuutt/Twww/r2LFjCg0N1bRp0/Tiiy9Kkkwmk8LCwvTII49o2rRpmj17tj744APt27dPdnY/PvOxdu1ajR8/XkePHtXdd9+thx56SP/5z3+Uk5NTJb+argnTv39/PfDAA/rjH/8o6ccnYbp3766//vWvlmO6dOmi2NhY/fGPf9SOHTv06KOP6vPPP1dQUNA153v66afl4OCglJQUy778/Hz17t1bhYWFatGixQ1zudFv4WZYEwYAAAAAgDtM+/btLX8bDAa1aNGiyj4HBwe5uLjo3LlzVeLCwsIsf9vZ2alr16766quvJEkFBQXq1q2bpQEjSZGRkaqsrNQ333yjDh06SJI6depUoxzLyso0f/58ffrppzp9+rQuX76sioqKKnn+/FokycPDw5J3fn6+PDw8rtuAkaQDBw7om2++0QcffGDZ99MCxkaj8aZNmNtBEwYAAAAAgDvMT6/j/MRgMMje3v6afSaTqVbmMxgMlr+bNm1ao5jp06dr69atmj17ttq2bau7775bzzzzTJU1ZqTrX0tNvwRlMpk0ZswYJSQkXDPm6elZo3PcCpowvxI3evTtVh9RAwAAAADgRvbt26c+ffpI+vGJkS+//NLyClFQUJA++OAD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\n",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"imp = pd.DataFrame({'feature': trn.columns, 'importance': clf.feature_importances_})\n",
"imp = imp.sort_values('importance').set_index('feature')\n",
"imp.plot(kind='barh')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 제출 파일 생성"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"ExecuteTime": {
"end_time": "2020-09-23T06:29:49.587973Z",
"start_time": "2020-09-23T06:29:49.547228Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(80000, 1)\n"
]
},
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" class | \n",
"
\n",
" \n",
" id | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" 320000 | \n",
" 0 | \n",
"
\n",
" \n",
" 320001 | \n",
" 0 | \n",
"
\n",
" \n",
" 320002 | \n",
" 0 | \n",
"
\n",
" \n",
" 320003 | \n",
" 0 | \n",
"
\n",
" \n",
" 320004 | \n",
" 0 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" class\n",
"id \n",
"320000 0\n",
"320001 0\n",
"320002 0\n",
"320003 0\n",
"320004 0"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"sub = pd.read_csv(sample_file, index_col=0)\n",
"print(sub.shape)\n",
"sub.head()"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"ExecuteTime": {
"end_time": "2020-09-23T06:29:49.620069Z",
"start_time": "2020-09-23T06:29:49.590167Z"
}
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" class | \n",
"
\n",
" \n",
" id | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" 320000 | \n",
" 2.0 | \n",
"
\n",
" \n",
" 320001 | \n",
" 0.0 | \n",
"
\n",
" \n",
" 320002 | \n",
" 2.0 | \n",
"
\n",
" \n",
" 320003 | \n",
" 0.0 | \n",
"
\n",
" \n",
" 320004 | \n",
" 2.0 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" class\n",
"id \n",
"320000 2.0\n",
"320001 0.0\n",
"320002 2.0\n",
"320003 0.0\n",
"320004 2.0"
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"sub[target_col] = p_tst\n",
"sub.head()"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {
"ExecuteTime": {
"end_time": "2020-09-23T06:29:49.654168Z",
"start_time": "2020-09-23T06:29:49.622396Z"
}
},
"outputs": [
{
"data": {
"text/plain": [
"2.0 42317\n",
"0.0 29937\n",
"1.0 7746\n",
"Name: class, dtype: int64"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"sub[target_col].value_counts()"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {
"ExecuteTime": {
"end_time": "2020-09-23T06:29:49.846982Z",
"start_time": "2020-09-23T06:29:49.656218Z"
}
},
"outputs": [],
"source": [
"sub.to_csv(sub_file)"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.6"
},
"toc": {
"base_numbering": 1,
"nav_menu": {},
"number_sections": true,
"sideBar": true,
"skip_h1_title": true,
"title_cell": "Table of Contents",
"title_sidebar": "Contents",
"toc_cell": false,
"toc_position": {},
"toc_section_display": true,
"toc_window_display": false
}
},
"nbformat": 4,
"nbformat_minor": 4
}