{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# 머신러닝 기본 개념\n", "![](https://i.imgur.com/mqb8VVO.png)" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import pandas as pd\n", "import matplotlib.pyplot as plt\n", "import seaborn as sns" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 분류 (Classification)\n", "- 어떤 대상을 정해진 범주에 구분해 넣는 작업\n", "- **주어진 특성에 따라 어떤 대상을 범주(target)로 구분하는 방법**\n", " - 레이블 또는 타겟이 범주형일때 사용\n", "- 범주가 2개인 경우 **이진 분류 (Binary Classification)**\n", "- 범주가 세개 이상인 경우 **다중 분류 (MultiClass Classification)**" ] }, { "cell_type": "code", "execution_count": 10, "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
mean radiusmean texturemean perimetermean areamean smoothnessmean compactnessmean concavitymean concave pointsmean symmetrymean fractal dimension...worst textureworst perimeterworst areaworst smoothnessworst compactnessworst concavityworst concave pointsworst symmetryworst fractal dimensiontarget
017.9910.38122.801001.00.118400.277600.300100.147100.24190.07871...17.33184.602019.00.162200.665600.71190.26540.46010.118900
120.5717.77132.901326.00.084740.078640.086900.070170.18120.05667...23.41158.801956.00.123800.186600.24160.18600.27500.089020
219.6921.25130.001203.00.109600.159900.197400.127900.20690.05999...25.53152.501709.00.144400.424500.45040.24300.36130.087580
311.4220.3877.58386.10.142500.283900.241400.105200.25970.09744...26.5098.87567.70.209800.866300.68690.25750.66380.173000
420.2914.34135.101297.00.100300.132800.198000.104300.18090.05883...16.67152.201575.00.137400.205000.40000.16250.23640.076780
..................................................................
56421.5622.39142.001479.00.111000.115900.243900.138900.17260.05623...26.40166.102027.00.141000.211300.41070.22160.20600.071150
56520.1328.25131.201261.00.097800.103400.144000.097910.17520.05533...38.25155.001731.00.116600.192200.32150.16280.25720.066370
56616.6028.08108.30858.10.084550.102300.092510.053020.15900.05648...34.12126.701124.00.113900.309400.34030.14180.22180.078200
56720.6029.33140.101265.00.117800.277000.351400.152000.23970.07016...39.42184.601821.00.165000.868100.93870.26500.40870.124000
5687.7624.5447.92181.00.052630.043620.000000.000000.15870.05884...30.3759.16268.60.089960.064440.00000.00000.28710.070391
\n", "

569 rows × 31 columns

\n", "
" ], "text/plain": [ " mean radius mean texture mean perimeter mean area mean smoothness \\\n", "0 17.99 10.38 122.80 1001.0 0.11840 \n", "1 20.57 17.77 132.90 1326.0 0.08474 \n", "2 19.69 21.25 130.00 1203.0 0.10960 \n", "3 11.42 20.38 77.58 386.1 0.14250 \n", "4 20.29 14.34 135.10 1297.0 0.10030 \n", ".. ... ... ... ... ... \n", "564 21.56 22.39 142.00 1479.0 0.11100 \n", "565 20.13 28.25 131.20 1261.0 0.09780 \n", "566 16.60 28.08 108.30 858.1 0.08455 \n", "567 20.60 29.33 140.10 1265.0 0.11780 \n", "568 7.76 24.54 47.92 181.0 0.05263 \n", "\n", " mean compactness mean concavity mean concave points mean symmetry \\\n", "0 0.27760 0.30010 0.14710 0.2419 \n", "1 0.07864 0.08690 0.07017 0.1812 \n", "2 0.15990 0.19740 0.12790 0.2069 \n", "3 0.28390 0.24140 0.10520 0.2597 \n", "4 0.13280 0.19800 0.10430 0.1809 \n", ".. ... ... ... ... \n", "564 0.11590 0.24390 0.13890 0.1726 \n", "565 0.10340 0.14400 0.09791 0.1752 \n", "566 0.10230 0.09251 0.05302 0.1590 \n", "567 0.27700 0.35140 0.15200 0.2397 \n", "568 0.04362 0.00000 0.00000 0.1587 \n", "\n", " mean fractal dimension ... worst texture worst perimeter worst area \\\n", "0 0.07871 ... 17.33 184.60 2019.0 \n", "1 0.05667 ... 23.41 158.80 1956.0 \n", "2 0.05999 ... 25.53 152.50 1709.0 \n", "3 0.09744 ... 26.50 98.87 567.7 \n", "4 0.05883 ... 16.67 152.20 1575.0 \n", ".. ... ... ... ... ... \n", "564 0.05623 ... 26.40 166.10 2027.0 \n", "565 0.05533 ... 38.25 155.00 1731.0 \n", "566 0.05648 ... 34.12 126.70 1124.0 \n", "567 0.07016 ... 39.42 184.60 1821.0 \n", "568 0.05884 ... 30.37 59.16 268.6 \n", "\n", " worst smoothness worst compactness worst concavity \\\n", "0 0.16220 0.66560 0.7119 \n", "1 0.12380 0.18660 0.2416 \n", "2 0.14440 0.42450 0.4504 \n", "3 0.20980 0.86630 0.6869 \n", "4 0.13740 0.20500 0.4000 \n", ".. ... ... ... \n", "564 0.14100 0.21130 0.4107 \n", "565 0.11660 0.19220 0.3215 \n", "566 0.11390 0.30940 0.3403 \n", "567 0.16500 0.86810 0.9387 \n", "568 0.08996 0.06444 0.0000 \n", "\n", " worst concave points worst symmetry worst fractal dimension target \n", "0 0.2654 0.4601 0.11890 0 \n", "1 0.1860 0.2750 0.08902 0 \n", "2 0.2430 0.3613 0.08758 0 \n", "3 0.2575 0.6638 0.17300 0 \n", "4 0.1625 0.2364 0.07678 0 \n", ".. ... ... ... ... \n", "564 0.2216 0.2060 0.07115 0 \n", "565 0.1628 0.2572 0.06637 0 \n", "566 0.1418 0.2218 0.07820 0 \n", "567 0.2650 0.4087 0.12400 0 \n", "568 0.0000 0.2871 0.07039 1 \n", "\n", "[569 rows x 31 columns]" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# 분류 데이터 불러오기\n", "import pandas as pd\n", "df = pd.read_csv('data/breast_cancer.csv')\n", "df" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/plain": [ "mean radius 0\n", "mean texture 0\n", "mean perimeter 0\n", "mean area 0\n", "mean smoothness 0\n", "mean compactness 0\n", "mean concavity 0\n", "mean concave points 0\n", "mean symmetry 0\n", "mean fractal dimension 0\n", "radius error 0\n", "texture error 0\n", "perimeter error 0\n", "area error 0\n", "smoothness error 0\n", "compactness error 0\n", "concavity error 0\n", "concave points error 0\n", "symmetry error 0\n", "fractal dimension error 0\n", "worst radius 0\n", "worst texture 0\n", "worst perimeter 0\n", "worst area 0\n", "worst smoothness 0\n", "worst compactness 0\n", "worst concavity 0\n", "worst concave points 0\n", "worst symmetry 0\n", "worst fractal dimension 0\n", "target 0\n", "dtype: int64" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.isna().sum() #결측치 조회" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/plain": [ "mean radius float64\n", "mean texture float64\n", "mean perimeter float64\n", "mean area float64\n", "mean smoothness float64\n", "mean compactness float64\n", "mean concavity float64\n", "mean concave points float64\n", "mean symmetry float64\n", "mean fractal dimension float64\n", "radius error float64\n", "texture error float64\n", "perimeter error float64\n", "area error float64\n", "smoothness error float64\n", "compactness error float64\n", "concavity error float64\n", "concave points error float64\n", "symmetry error float64\n", "fractal dimension error float64\n", "worst radius float64\n", "worst texture float64\n", "worst perimeter float64\n", "worst area float64\n", "worst smoothness float64\n", "worst compactness float64\n", "worst concavity float64\n", "worst concave points float64\n", "worst symmetry float64\n", "worst fractal dimension float64\n", "target int64\n", "dtype: object" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.dtypes #데이터 타입조회" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "scrolled": 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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
mean radiusmean texturemean perimetermean areamean smoothnessmean compactnessmean concavitymean concave pointsmean symmetrymean fractal dimension...worst radiusworst textureworst perimeterworst areaworst smoothnessworst compactnessworst concavityworst concave pointsworst symmetryworst fractal dimension
017.9910.38122.801001.00.118400.277600.300100.147100.24190.07871...25.38017.33184.602019.00.162200.665600.71190.26540.46010.11890
120.5717.77132.901326.00.084740.078640.086900.070170.18120.05667...24.99023.41158.801956.00.123800.186600.24160.18600.27500.08902
219.6921.25130.001203.00.109600.159900.197400.127900.20690.05999...23.57025.53152.501709.00.144400.424500.45040.24300.36130.08758
311.4220.3877.58386.10.142500.283900.241400.105200.25970.09744...14.91026.5098.87567.70.209800.866300.68690.25750.66380.17300
420.2914.34135.101297.00.100300.132800.198000.104300.18090.05883...22.54016.67152.201575.00.137400.205000.40000.16250.23640.07678
..................................................................
56421.5622.39142.001479.00.111000.115900.243900.138900.17260.05623...25.45026.40166.102027.00.141000.211300.41070.22160.20600.07115
56520.1328.25131.201261.00.097800.103400.144000.097910.17520.05533...23.69038.25155.001731.00.116600.192200.32150.16280.25720.06637
56616.6028.08108.30858.10.084550.102300.092510.053020.15900.05648...18.98034.12126.701124.00.113900.309400.34030.14180.22180.07820
56720.6029.33140.101265.00.117800.277000.351400.152000.23970.07016...25.74039.42184.601821.00.165000.868100.93870.26500.40870.12400
5687.7624.5447.92181.00.052630.043620.000000.000000.15870.05884...9.45630.3759.16268.60.089960.064440.00000.00000.28710.07039
\n", "

569 rows × 30 columns

\n", "
" ], "text/plain": [ " mean radius mean texture mean perimeter mean area mean smoothness \\\n", "0 17.99 10.38 122.80 1001.0 0.11840 \n", "1 20.57 17.77 132.90 1326.0 0.08474 \n", "2 19.69 21.25 130.00 1203.0 0.10960 \n", "3 11.42 20.38 77.58 386.1 0.14250 \n", "4 20.29 14.34 135.10 1297.0 0.10030 \n", ".. ... ... ... ... ... \n", "564 21.56 22.39 142.00 1479.0 0.11100 \n", "565 20.13 28.25 131.20 1261.0 0.09780 \n", "566 16.60 28.08 108.30 858.1 0.08455 \n", "567 20.60 29.33 140.10 1265.0 0.11780 \n", "568 7.76 24.54 47.92 181.0 0.05263 \n", "\n", " mean compactness mean concavity mean concave points mean symmetry \\\n", "0 0.27760 0.30010 0.14710 0.2419 \n", "1 0.07864 0.08690 0.07017 0.1812 \n", "2 0.15990 0.19740 0.12790 0.2069 \n", "3 0.28390 0.24140 0.10520 0.2597 \n", "4 0.13280 0.19800 0.10430 0.1809 \n", ".. ... ... ... ... \n", "564 0.11590 0.24390 0.13890 0.1726 \n", "565 0.10340 0.14400 0.09791 0.1752 \n", "566 0.10230 0.09251 0.05302 0.1590 \n", "567 0.27700 0.35140 0.15200 0.2397 \n", "568 0.04362 0.00000 0.00000 0.1587 \n", "\n", " mean fractal dimension ... worst radius worst texture \\\n", "0 0.07871 ... 25.380 17.33 \n", "1 0.05667 ... 24.990 23.41 \n", "2 0.05999 ... 23.570 25.53 \n", "3 0.09744 ... 14.910 26.50 \n", "4 0.05883 ... 22.540 16.67 \n", ".. ... ... ... ... \n", "564 0.05623 ... 25.450 26.40 \n", "565 0.05533 ... 23.690 38.25 \n", "566 0.05648 ... 18.980 34.12 \n", "567 0.07016 ... 25.740 39.42 \n", "568 0.05884 ... 9.456 30.37 \n", "\n", " worst perimeter worst area worst smoothness worst compactness \\\n", "0 184.60 2019.0 0.16220 0.66560 \n", "1 158.80 1956.0 0.12380 0.18660 \n", "2 152.50 1709.0 0.14440 0.42450 \n", "3 98.87 567.7 0.20980 0.86630 \n", "4 152.20 1575.0 0.13740 0.20500 \n", ".. ... ... ... ... \n", "564 166.10 2027.0 0.14100 0.21130 \n", "565 155.00 1731.0 0.11660 0.19220 \n", "566 126.70 1124.0 0.11390 0.30940 \n", "567 184.60 1821.0 0.16500 0.86810 \n", "568 59.16 268.6 0.08996 0.06444 \n", "\n", " worst concavity worst concave points worst symmetry \\\n", "0 0.7119 0.2654 0.4601 \n", "1 0.2416 0.1860 0.2750 \n", "2 0.4504 0.2430 0.3613 \n", "3 0.6869 0.2575 0.6638 \n", "4 0.4000 0.1625 0.2364 \n", ".. ... ... ... \n", "564 0.4107 0.2216 0.2060 \n", "565 0.3215 0.1628 0.2572 \n", "566 0.3403 0.1418 0.2218 \n", "567 0.9387 0.2650 0.4087 \n", "568 0.0000 0.0000 0.2871 \n", "\n", " worst fractal dimension \n", "0 0.11890 \n", "1 0.08902 \n", "2 0.08758 \n", "3 0.17300 \n", "4 0.07678 \n", ".. ... \n", "564 0.07115 \n", "565 0.06637 \n", "566 0.07820 \n", "567 0.12400 \n", "568 0.07039 \n", "\n", "[569 rows x 30 columns]" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# 특성 추출 [행, 열]\n", "X = df.iloc[:, :-1]\n", "X" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/plain": [ "0 0\n", "1 0\n", "2 0\n", "3 0\n", "4 0\n", " ..\n", "564 0\n", "565 0\n", "566 0\n", "567 0\n", "568 1\n", "Name: target, Length: 569, dtype: int64" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# 레이블 추출\n", "Y = df.iloc[:, -1]\n", "Y" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "# 데이터 분할 (학습 및 평가)\n", "from sklearn.model_selection import train_test_split\n", "x_train, x_test, y_train, y_test = train_test_split(X, Y, random_state=0)" ] }, { "cell_type": "code", "execution_count": 61, "metadata": {}, "outputs": [], "source": [ "# 모델 생성 및 학습\n", "from sklearn.ensemble import RandomForestClassifier\n", "rf = RandomForestClassifier().fit(x_train, y_train)" ] }, { "cell_type": "code", "execution_count": 62, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(1.0, 0.972027972027972)" ] }, "execution_count": 62, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# 모델 정확도 확인\n", "rf.score(x_train, y_train), rf.score(x_test, y_test)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 분류 모델 평가 지표" ] }, { "cell_type": "code", "execution_count": 63, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0,\n", " 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1,\n", " 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1,\n", " 0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1,\n", " 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 0,\n", " 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1,\n", " 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0], dtype=int64)" ] }, "execution_count": 63, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# 실제값 확인\n", "y_test.values" ] }, { "cell_type": "code", "execution_count": 64, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0,\n", " 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1,\n", " 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1,\n", " 0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1,\n", " 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 0,\n", " 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1,\n", " 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0], dtype=int64)" ] }, "execution_count": 64, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# 예측값 확인\n", "p_test = rf.predict(x_test)\n", "p_test" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 정확도\n", "- 실제값과 예측값이 얼마나 일치하는지 비율\n", "- (TP + TN) / (TP + FP + FN + TN)" ] }, { "cell_type": "code", "execution_count": 65, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.972027972027972" ] }, "execution_count": 65, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# 정확도\n", "from sklearn.metrics import accuracy_score\n", "accuracy_score(y_test, p_test)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 혼동행렬\n", "![](https://i.imgur.com/E4djUzb.png)" ] }, { "cell_type": "code", "execution_count": 66, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(52, 1, 3, 87)" ] }, "execution_count": 66, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# 혼동행렬\n", "from sklearn.metrics import confusion_matrix\n", "tn, fp, fn, tp = confusion_matrix(y_test, p_test).ravel()\n", "tn, fp, fn, tp" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 정밀도 (precision)\n", "- 양성으로 예측한 값(TP+FP)중 실제 양성 값(TP)의 비율\n", " - 양성 예측의 정확도 \n", "- TP / (TP + FP)" ] }, { "cell_type": "code", "execution_count": 67, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.9666666666666667" ] }, "execution_count": 67, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# 정밀도\n", "from sklearn.metrics import recall_score\n", "recall_score(y_test, p_test)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 재현율 (recall)\n", "- 실제 양성값(TP+FN)중 양성으로 잘 예측한 값(TP)의 비율\n", "- TP / (TP + FN)\n", "- 민감도(sensitivity), 참 양성 비율 (true positive rate)라고도 함" ] }, { "cell_type": "code", "execution_count": 68, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.9886363636363636" ] }, "execution_count": 68, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# 재현율\n", "from sklearn.metrics import precision_score\n", "precision_score(y_test, p_test)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## F1 Score\n", "- 정밀도와 재현율의 조화평균\n", " - 정밀도와 재현율을 동시에 사용할때 사용\n", "- 2 * (precision x recall) / (precision + recall)" ] }, { "cell_type": "code", "execution_count": 69, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.9775280898876404" ] }, "execution_count": 69, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# F1-Score\n", "from sklearn.metrics import f1_score\n", "f1_score(y_test, p_test)" ] }, { "cell_type": "code", "execution_count": 70, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " precision recall f1-score support\n", "\n", " 0 0.95 0.98 0.96 53\n", " 1 0.99 0.97 0.98 90\n", "\n", " accuracy 0.97 143\n", " macro avg 0.97 0.97 0.97 143\n", "weighted avg 0.97 0.97 0.97 143\n", "\n" ] } ], "source": [ "from sklearn.metrics import classification_report\n", "print(classification_report(y_test, p_test))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## ROC-AUC\n", "- 참 양성 비율(TPR)과 거짓 양성 비율(FPR)을 나타낸 곡선\n", "- AUC는 ROC 곡선의 아랫 면적을 의미" ] }, { "cell_type": "code", "execution_count": 71, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(array([0. , 0.01886792, 1. ]),\n", " array([0. , 0.96666667, 1. ]),\n", " array([2, 1, 0], dtype=int64))" ] }, "execution_count": 71, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from sklearn.metrics import roc_curve\n", "fpr, tpr, thresholds = roc_curve(y_test, p_test)\n", "fpr, tpr, thresholds" ] }, { "cell_type": "code", "execution_count": 72, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.9738993710691825" ] }, "execution_count": 72, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# AUC 계산\n", "from sklearn.metrics import auc\n", "auc_score = auc(fpr, tpr) # RoC Curve를 그리는 요소인 fpr, tpr\n", "auc_score" ] }, { "cell_type": "code", "execution_count": 73, "metadata": {}, "outputs": [ { "data": { "image/png": "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09PZv38/1apVC/hztkoERbFpaPv27dSoUYOIiAjmzJlDjRo1qFTJ0tm41Xk6ffq0JgFVpIkI5cqV48iRIwX6XNEqFS1WlJqGMjIyGDFiBPXr12fy5MkAXHfddZoEijhNAqqoO5+/UVvVCJyZRaNGsGbNGpKSktiyZQv33HMPPXv2DHVISikbC32pGERFoY/gtddeo3nz5v6xAfPmzaN8+fIhjUmFB4fDQUJCAnFxcXTr1o3jx48XynFnz57NoEGDCuVY2bVp04Y6derQoEEDWrZsyfbt28/7WNljnDp1Ku+8806u+6alpfHee+/5n69du5ZHH330vL/bDmyWCEJXI8iaDqJJkyb069ePrVu30rVr15DEosJT6dKlSU5OZsuWLfztb3/zNykWZfPmzWPjxo307t2bp5566pz33W53gY/Zv39/7rvvvlzfPzsRJCYmMnHixAJ/j53YKhFkhKCP4MSJEzz00EM89thjALRo0YKpU6dy6aWXBjUOVfjatGlzzmPKlCkAnDp1Ksf3Z8+eDXinDTn7vYJo3rw5Bw5413las2YNzZs3p2HDhrRo0cJ/5T179mxuu+02OnXqRK1atXj66af9n581axa1a9emSZMmrFy50v96Wloa119/PfHx8bRr1469e/cC0KdPHx5++GGaNWtG9erVWb58OX379iUmJoY+ffrkG2/r1q1JTU0F4OKLL+aJJ56gQYMGrF69mnfffZcmTZqQkJDAQw895E8OucU4fPhwxo4dC0Bqairt27enQYMGNGrUiJ9++olnn32Wb775hoSEBCZMmMDy5cv9F12//vort9xyC/Hx8TRr1oxNmzb5j9m3b1/atGlD9erVbZc4bJUIvDWC4DUNffLJJ8TGxvLWW29RqlQpnSROFQq3282XX37JTTd5l/WoW7cu33zzDRs2bGDkyJE899xz/n2Tk5NZuHAhmzdvZuHChezbt4+DBw8ybNgwVq5cybfffktKSop//0ceeYTevXuzadMmevbseUaTyrFjx1i9ejUTJkzgpptu4rHHHmPr1q1s3ryZ5OTkPGP+5JNPqF+/PgB//PEHTZs2ZePGjZQrV46FCxeycuVKkpOTcTgczJs3L88Ys+vZsycDBw5k48aNrFq1iiuvvJKXX36ZVq1akZyc7L8AyzJs2DAaNmzIpk2bGD169Bk1ix9//JFly5axZs0aRowYQWZmZmD/IMWAvTqLgzTFxJEjRxg8eDDz58+nfv36fPTRR1xzzTWWf68KruXLl+f6XpkyZfJ8v3z58nm+n5M///yThIQEDhw4QExMDDfccAPgrXX27t2bnTt3IiJnFGDt2rXz1z5jY2PZs2ePvzZSoUIFAHr06MGOHTsAWL16NR988AEAvXr1OqMW0a1bN0SE+vXrc8UVV/gL9nr16pGWlkZCQsI5Mffs2ZPSpUsTHR3NpEmTAG9fx+233w7Al19+ybp16/z/P/78808qVqzI999/n2uMWU6ePMmBAwe49dZbAe9Aqvx8++23/Pvf/wbg+uuvJz09nd9++w2ALl26UKpUKUqVKkXFihX55ZdfbHMXn81qBMGZdO7EiRMsXbqUESNGsHbtWk0CqlBk9RHs2bMHY4y/j+DFF1+kbdu2bNmyhU8++eSMkc+lSpXybzscDlwu13l/f9axSpQoccZxS5Qoketx582bR3JyMh999JF//eyoqCgcDm/N3BhD7969SU5OJjk5me3btzN8+PDzjvFCFObvKtzYLBFYVyPYt28fL730EsYYatasyZ49exg6dCglS5a05PuUfZUpU4aJEycybtw4XC4XJ06c4Oqrrwbw90HkpWnTpnz99dekp6eTmZnJokWL/O+1aNGCBQsWAN5CvFWrVpacQ5Z27dqxePFiDh/2Lln+66+/smfPnjxjzFK2bFkqVarERx99BIDT6eTUqVOULVuWkydP5vh9rVq1Yt68eYC3Rle+fHkuueQSa04ujNgmERhjfCOLC7ePwOPxMHXqVOrVq8eoUaP8k8RpZ7CyUsOGDYmPj2f+/Pk8/fTTDBkyhIYNGwZ0FXvllVcyfPhwmjdvTsuWLYmJifG/N2nSJGbNmkV8fDxz587l9ddft/I0iI2NZdSoUXTo0IH4+HhuuOEGDh48mGeM2c2dO5eJEycSHx9PixYtOHToEPHx8TgcDho0aMCECRPO2H/48OGsW7eO+Ph4nn32WebMmWPp+YULCbcOzMTERLN27doCf87pclPnhc95qmMdBrYtnIncdu7cSb9+/fj6669p164d06dPp3r16oVybFX0bNu2LdcCSamiJKe/VRFZZ4xJzGl/23QWF/YylS6XixtuuIHjx4/z9ttvc//99+v0A0qpsGSfRJBZOIlg27Zt1KpVi4iICObOnUuNGjW46qqrCiNEpZQKCdv0EWS4sxLB+fUROJ1Ohg0bRnx8PG+88Qbg7XjSJKCUCnc2qhF4Ryuez8ji7777jqSkJFJSUujVqxe9evUq7PCUUipkbFMjON8+gnHjxtGiRQtOnjzJ0qVLeeeddyhXrpwVISqlVEjYJhFkZCWCAMcReDze/Zs3b07//v3ZsmULnTt3tiw+pZQKFdskgqwaQUlH3n0Ex48fJykpicGDBwPeATZTpkzRQScq5MJhGuro6Gjq169PQkICCQkJrFq1qlCOe7bk5GSWLl2a6/sbNmwgKSnpjNduueUWmjVrdsZrffr0YfHixWe8dvHFF/u3d+zYwY033kitWrVo1KgRd955J7/88kvAce7evZumTZtSs2ZNevToQUZGxjn7ZGRkcP/991O/fn0aNGjgn3rk5MmT/t9jQkIC5cuX5x//+AcAb7zxBjNnzgw4jvzYKBF4+wjyqhF89NFHxMbGMmfOHMqWLauTxKkiJVymof7qq6/8U0a0aNEioM8UdDqH/BLB6NGjz5gw7/jx46xbt44TJ06wa9eugL7j9OnTdOnShYcffpidO3eyfv16BgwYUKBlIJ955hkee+wxUlNTufzyy3n77bfP2WfGjBkAbN68mS+++IInnngCj8dD2bJl/b/H5ORkqlatym233QZA3759/XM3FQbbdBZn5NFHcPjwYQYNGsSiRYtISEjg008/pVGjRsEOUYWREZ9sJeXn3wr1mLFXXcKwbvUC2rd58+b+KZTXrFnD4MGDOX36NKVLl2bWrFnUqVOH2bNns2TJEk6dOsVPP/3ErbfeyiuvvAJ4p3h+6aWXuOyyy2jQoIF/np20tDT69u3L0aNHqVChArNmzaJKlSr06dOH0qVLs2HDBg4fPszMmTN55513WL16NU2bNs1zaou8jhkVFcWGDRto2bIlAwcOZODAgRw5coQyZcowY8YM6taty6JFixgxYgQOh4NLL72U//73vwwdOpQ///yTb7/9liFDhtCjRw//9508eZJNmzbRoEED/2sffPAB3bp144orrmDBggVnzNCam/fee4/mzZvTrVs3/2sFmS7cGMP//vc//9oIvXv3Zvjw4Tz88MNn7JeSksL1118PQMWKFbnssstYu3YtTZo08e+zY8cODh8+7J/yo0yZMkRHR7NmzZoz9jtfNqoR+JqGckgEv/32G1988QX/+te/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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Roc Curve 시각화\n", "import matplotlib.pyplot as plt\n", "label = \"RandomForest (AUC : %.2f)\" % auc_score\n", "plt.plot([0, 1], [0, 1], 'k--', label=\"Random Prediction\")\n", "plt.plot(fpr, tpr, label=label)\n", "plt.xlabel('False Positive Rate')\n", "plt.ylabel('True Positive Rate')\n", "plt.legend()\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 회귀 (Regression)\n", "- 독립변수(특성)과 종속변수(레이블)간 관계를 모델링하는 방법\n", "- 레이블 또는 타겟이 연속형일때 사용\n", "- 독립변수와 종속변수의 관계를 기반으로 최적의 회귀 계수를 찾음" ] }, { "cell_type": "code", "execution_count": 74, "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", "
CRIMZNINDUSCHASNOXRMAGEDISRADTAXPTRATIOBLSTATtarget
00.0063218.02.310.00.5386.57565.24.09001.0296.015.3396.904.9824.0
10.027310.07.070.00.4696.42178.94.96712.0242.017.8396.909.1421.6
20.027290.07.070.00.4697.18561.14.96712.0242.017.8392.834.0334.7
30.032370.02.180.00.4586.99845.86.06223.0222.018.7394.632.9433.4
40.069050.02.180.00.4587.14754.26.06223.0222.018.7396.905.3336.2
.............................................
5010.062630.011.930.00.5736.59369.12.47861.0273.021.0391.999.6722.4
5020.045270.011.930.00.5736.12076.72.28751.0273.021.0396.909.0820.6
5030.060760.011.930.00.5736.97691.02.16751.0273.021.0396.905.6423.9
5040.109590.011.930.00.5736.79489.32.38891.0273.021.0393.456.4822.0
5050.047410.011.930.00.5736.03080.82.50501.0273.021.0396.907.8811.9
\n", "

506 rows × 14 columns

\n", "
" ], "text/plain": [ " CRIM ZN INDUS CHAS NOX RM AGE DIS RAD TAX \\\n", "0 0.00632 18.0 2.31 0.0 0.538 6.575 65.2 4.0900 1.0 296.0 \n", "1 0.02731 0.0 7.07 0.0 0.469 6.421 78.9 4.9671 2.0 242.0 \n", "2 0.02729 0.0 7.07 0.0 0.469 7.185 61.1 4.9671 2.0 242.0 \n", "3 0.03237 0.0 2.18 0.0 0.458 6.998 45.8 6.0622 3.0 222.0 \n", "4 0.06905 0.0 2.18 0.0 0.458 7.147 54.2 6.0622 3.0 222.0 \n", ".. ... ... ... ... ... ... ... ... ... ... \n", "501 0.06263 0.0 11.93 0.0 0.573 6.593 69.1 2.4786 1.0 273.0 \n", "502 0.04527 0.0 11.93 0.0 0.573 6.120 76.7 2.2875 1.0 273.0 \n", "503 0.06076 0.0 11.93 0.0 0.573 6.976 91.0 2.1675 1.0 273.0 \n", "504 0.10959 0.0 11.93 0.0 0.573 6.794 89.3 2.3889 1.0 273.0 \n", "505 0.04741 0.0 11.93 0.0 0.573 6.030 80.8 2.5050 1.0 273.0 \n", "\n", " PTRATIO B LSTAT target \n", "0 15.3 396.90 4.98 24.0 \n", "1 17.8 396.90 9.14 21.6 \n", "2 17.8 392.83 4.03 34.7 \n", "3 18.7 394.63 2.94 33.4 \n", "4 18.7 396.90 5.33 36.2 \n", ".. ... ... ... ... \n", "501 21.0 391.99 9.67 22.4 \n", "502 21.0 396.90 9.08 20.6 \n", "503 21.0 396.90 5.64 23.9 \n", "504 21.0 393.45 6.48 22.0 \n", "505 21.0 396.90 7.88 11.9 \n", "\n", "[506 rows x 14 columns]" ] }, "execution_count": 74, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# 분류 데이터 불러오기\n", "import pandas as pd\n", "df = pd.read_csv('data/boston.csv')\n", "df" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# 특성 추출\n", "X = df.iloc[:, :-1]" ] }, { "cell_type": "code", "execution_count": 88, "metadata": {}, "outputs": [], "source": [ "# 특성 추출\n", "X = df.iloc[:, :-1]\n", "X = df.loc[:, 'CRIM':'LSTAT'] # 끝 포함\n", "X = df[['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD', 'TAX', 'PTRATIO', 'B', 'LSTAT']]\n", "X = df.drop('target', axis=1)\n", "X = df.loc[: , df.columns != 'target']\n", "X" ] }, { "cell_type": "code", "execution_count": 91, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0 24.0\n", "1 21.6\n", "2 34.7\n", "3 33.4\n", "4 36.2\n", " ... \n", "501 22.4\n", "502 20.6\n", "503 23.9\n", "504 22.0\n", "505 11.9\n", "Name: target, Length: 506, dtype: float64" ] }, "execution_count": 91, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# 레이블 추출\n", "Y = df.iloc[:, -1]\n", "Y" ] }, { "cell_type": "code", "execution_count": 92, "metadata": {}, "outputs": [], "source": [ "# 데이터 분할 (학습 및 평가)\n", "from sklearn.model_selection import train_test_split\n", "x_train, x_test, y_train, y_test = train_test_split(X, Y, random_state=0)" ] }, { "cell_type": "code", "execution_count": 93, "metadata": {}, "outputs": [], "source": [ "# 모델 생성 및 학습\n", "from sklearn.ensemble import RandomForestRegressor\n", "rf = RandomForestRegressor().fit(x_train, y_train)" ] }, { "cell_type": "code", "execution_count": 94, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(0.9825758296955616, 0.8012845818434341)" ] }, "execution_count": 94, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# 모델 정확도 확인\n", "rf.score(x_train, y_train), rf.score(x_test, y_test)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 회귀 모델 평가 지표" ] }, { "cell_type": "code", "execution_count": 95, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([22.6, 50. , 23. , 8.3, 21.2, 19.9, 20.6, 18.7, 16.1, 18.6, 8.8,\n", " 17.2, 14.9, 10.5, 50. , 29. , 23. , 33.3, 29.4, 21. , 23.8, 19.1,\n", " 20.4, 29.1, 19.3, 23.1, 19.6, 19.4, 38.7, 18.7, 14.6, 20. , 20.5,\n", " 20.1, 23.6, 16.8, 5.6, 50. , 14.5, 13.3, 23.9, 20. , 19.8, 13.8,\n", " 16.5, 21.6, 20.3, 17. , 11.8, 27.5, 15.6, 23.1, 24.3, 42.8, 15.6,\n", " 21.7, 17.1, 17.2, 15. , 21.7, 18.6, 21. , 33.1, 31.5, 20.1, 29.8,\n", " 15.2, 15. , 27.5, 22.6, 20. , 21.4, 23.5, 31.2, 23.7, 7.4, 48.3,\n", " 24.4, 22.6, 18.3, 23.3, 17.1, 27.9, 44.8, 50. , 23. , 21.4, 10.2,\n", " 23.3, 23.2, 18.9, 13.4, 21.9, 24.8, 11.9, 24.3, 13.8, 24.7, 14.1,\n", " 18.7, 28.1, 19.8, 26.7, 21.7, 22. , 22.9, 10.4, 21.9, 20.6, 26.4,\n", " 41.3, 17.2, 27.1, 20.4, 16.5, 24.4, 8.4, 23. , 9.7, 50. , 30.5,\n", " 12.3, 19.4, 21.2, 20.3, 18.8, 33.4])" ] }, "execution_count": 95, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# 실제값 확인\n", "y_test.values" ] }, { "cell_type": "code", "execution_count": 96, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([24.272, 30.284, 22.11 , 10.697, 20.457, 20.859, 21.178, 20.233,\n", " 20.753, 19.135, 8.033, 15.003, 14.717, 8.337, 47.728, 33.837,\n", " 21.156, 34.412, 25.156, 21.325, 23.781, 21.864, 19.865, 24.319,\n", " 20.274, 18.422, 18.651, 16.081, 43.988, 18.644, 14.517, 17.321,\n", " 20.823, 20.661, 23.108, 17.225, 8.028, 30.526, 14.242, 14.369,\n", " 22.877, 20.658, 23.068, 14.646, 23.489, 22.694, 20.008, 16.508,\n", " 14.723, 25.036, 16.622, 19.53 , 21.684, 39.522, 15.004, 19.732,\n", " 19.469, 19.045, 24.337, 20.122, 21.234, 21.167, 32.905, 27.583,\n", " 17.887, 26.377, 15.755, 17.755, 20.099, 21.747, 19.879, 23.054,\n", " 24.162, 31.294, 30.986, 8.372, 42.581, 21.699, 22.969, 20.244,\n", " 26.608, 17.672, 22.898, 41.882, 41.265, 24.368, 23.172, 14.707,\n", " 25.49 , 16.19 , 18.824, 12.178, 22.39 , 29.974, 21.577, 22.107,\n", " 12.37 , 23.181, 14.598, 19.398, 24.101, 19.845, 28.313, 21.179,\n", " 28.423, 19.866, 8.407, 19.233, 21.362, 23.47 , 31.357, 12.678,\n", " 18.037, 18.65 , 17.192, 20.837, 9.702, 19.631, 9.414, 46.653,\n", " 29.494, 10.237, 19.093, 21.333, 21.142, 18.681, 35.013])" ] }, "execution_count": 96, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# 예측값 확인\n", "p_test = rf.predict(x_test)\n", "p_test" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## R Squared\n", "- 회귀직선의 적합도를 평가하거나 종속변수(레이블)에 대한 독립변수(특성)의 설명력을 알고싶을때 사용" ] }, { "cell_type": "code", "execution_count": 98, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.7213662707778133" ] }, "execution_count": 98, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from sklearn.metrics import r2_score\n", "r2_score(p_test, y_test)\n", "# 최악 -inf, 최고 1" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## MAE\n", "- 예측값과 실제값의 차이인 오차 절댓값 평균\n", "- 기존 레이블의 단위를 그대로 활용할 수 있음" ] }, { "cell_type": "code", "execution_count": 102, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2.5740472440944897" ] }, "execution_count": 102, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from sklearn.metrics import mean_absolute_error\n", "mean_absolute_error(p_test, y_test)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## MSE\n", "- 예측값과 실제값의 차이인 오차 제곱 평균\n", "- 제곱을 하기 때문에 특이치(아웃라이어)에 민감" ] }, { "cell_type": "code", "execution_count": 103, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "16.234854015748038" ] }, "execution_count": 103, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from sklearn.metrics import mean_squared_error\n", "mean_squared_error(p_test, y_test)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## RMSE\n", "- MSE 지표에 루트를 적용한 결과\n", "- 오류 지표를 실제 값과 유사한 단위로 변환해 해석이 용이해짐" ] }, { "cell_type": "code", "execution_count": 104, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "4.029249808059564" ] }, "execution_count": 104, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from sklearn.metrics import mean_squared_error\n", "mean_squared_error(p_test, y_test) ** 0.5" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## MSLE\n", "- MSE방식에 로그를 적용한 것\n", "- 결정 값이 클수록 오류값도 커지기 때문에 일부 큰 오류값들로 인해 전체 오류값이 커지는 것을 막아줌" ] }, { "cell_type": "code", "execution_count": 105, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.02428535183373342" ] }, "execution_count": 105, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from sklearn.metrics import mean_squared_log_error\n", "mean_squared_log_error(p_test, y_test)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## RMSLE\n", "- 아웃라이어에 덜 민감함 (robust)\n", " - 값의 변동폭이 크지 않음\n", "- 상대적 Error를 측정함\n", " - 예측값 = 100, 실제값 = 90일 때, RMSLE = 0.1053, RMSE = 10\n", " - 예측값 = 10,000, 실제값 = 9,000일 때, RMSLE = 0.1053, RMSE = 1,000\n", "- Under Estimation에 큰 패널티를 부여" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.15788148332339436" ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from sklearn.metrics import mean_squared_log_error\n", "mean_squared_log_error(p_test, y_test, squared=False)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 데이터 인코딩\n", "- 레이블 인코딩 (label encoding)\n", " - 범주형 데이터를 숫자로 일대일 매핑해주는 인코딩 방식\n", " - 범주형 데이터를 숫자로 치환\n", " - scikit-learn의 LabelEncoder로 변환 가능\n", " - 명목형 데이터를 레이블 인코딩 하는 경우 모델의 성능이 떨어짐\n", " - 바나나(0)와 사과(2)보다 복숭아(1)와 더 비슷하다고 판단\n", " - 바나나, 사과, 복숭아는 별개의 데이터임" ] }, { "cell_type": "code", "execution_count": 107, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array(['사과', '복숭아', '바나나', '키위', '사과', '바나나', '복숭아', '사과'], dtype='\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
바나나복숭아사과키위
00010
10100
21000
30001
40010
51000
60100
70010
\n", "" ], "text/plain": [ " 바나나 복숭아 사과 키위\n", "0 0 0 1 0\n", "1 0 1 0 0\n", "2 1 0 0 0\n", "3 0 0 0 1\n", "4 0 0 1 0\n", "5 1 0 0 0\n", "6 0 1 0 0\n", "7 0 0 1 0" ] }, "execution_count": 111, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Pandas 활용\n", "pd.get_dummies(data)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 스케일링\n", "- 서로 다른 특성 값의 범위(단위)를 일치하도록 값을 조정하는 방법\n", " - 값의 범위가 데이터마다 다르면 모델 훈련이 제대로 안 될 수도 있음\n", "\n", "## 최소최대정규화 (min max normalization)\n", "- 특성 값 범위를 0(최소) ~ 1(최대)로 조정하는 기법\n", " - (X - MIN) / (MAX - MIN)\n", "\n", "- scikit-learn의 MinMaxScaler로 변환 가능" ] }, { "cell_type": "code", "execution_count": 112, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXcAAAD4CAYAAAAXUaZHAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAAAgFUlEQVR4nO3dfXAc9Z3n8fdXoydLBksijvD6IeYO47VlnowrR7DPFYOJEZuKzR2bismBg73liw+05PKAzblqL9QVDnDJZh1DGXyxOJsL3iQkAc5lJxBF3B5hYWMS4tgWeyjBxhZI1uKnINDz9/6YljKSJWtGmp7RtD+vqqnp/k1P/34taT7q+XX3r83dERGRaMnLdgNERCT9FO4iIhGkcBcRiSCFu4hIBCncRUQiKD/bDQD4yEc+4jNnzsx2M0REcsprr732L+4+eajXxkW4z5w5k3379mW7GSIiOcXMjgz3mrplREQiSOEuIhJBCncRkQhSuIuIRJDCXUQkghTuIiIRpHAXEYkghbuISASNGO5mNtvMXk94nDGzL5lZhZm9YGZvBs/lwfJmZt8xs0Yz229m88PfDBHJNjMb9iGZN2K4u/s/u/tV7n4VcA3wAfATYANQ5+6zgLpgHqAamBU81gJbQ2i3iIwz7t7/GGpeMivVbpkbgN+7+xFgObAjKN8BrAimlwM7Pe4VoMzMpqSjsSIikpxUw/1zwK5gutLd3w2mm4HKYHoqcDThPceCsgHMbK2Z7TOzfa2trSk2Q0REziXpcDezQuAzwA8Hv+bx710pffdy923uvsDdF0yePOSgZiIiMkqp7LlXA79295ZgvqWvuyV4Ph6UNwHTE943LSgTEZEMSSXcV/KnLhmA54BVwfQq4NmE8juCs2auBU4ndN+IiEgGJDWeu5mVAjcC/zGh+EHgB2a2BjgCfDYo3wPcDDQSP7PmzrS1VkREkpJUuLt7G3DRoLL3iJ89M3hZB+5KS+tERGRUdIWqiEgEKdxFRCJI4S4iEkEKdxGRCFK4i8ioVFRUnHOgsKHKKyoqstzq80dSZ8uIiAx28uTJlAcF0wiRmaM9dxGRCFK4i4hEkMJdRCSCFO4iIhGkcBcRiSCFu4hIBCncRUQiSOEuIhJBCncRkQhSuIuIRJDCXUQkghTuIiIRpHAXEYmgpMLdzMrM7Gkze8PMGszsE2ZWYWYvmNmbwXN5sKyZ2XfMrNHM9pvZ/HA3QUREBkt2z30z8FN3/3PgSqAB2ADUufssoC6YB6gGZgWPtcDWtLZYRERGNGK4m9kkYDGwHcDdO939FLAc2BEstgNYEUwvB3Z63CtAmZlNSXO7RUTkHJLZc78EaAWeMLPfmNl3zawUqHT3d4NlmoHKYHoqcDTh/ceCsgHMbK2Z7TOzfa2traPfAhEROUsy4Z4PzAe2uvvVQBt/6oIBwOO3Y0nplizuvs3dF7j7gsmTJ6fyVhERGUEy4X4MOOburwbzTxMP+5a+7pbg+XjwehMwPeH904IyERHJkBHD3d2bgaNmNjsougE4BDwHrArKVgHPBtPPAXcEZ81cC5xO6L4REZEMSPYG2TXA98ysEPgDcCfxfww/MLM1wBHgs8Gye4CbgUbgg2BZERHJoKTC3d1fBxYM8dINQyzrwF1ja5aIiIyFrlAVEYkghbuISAQp3EVEIkjhLiISQQp3EZEIUriLiESQwl1EJIIU7iIiEaRwFxGJIIW7iEgEKdxFRCJI4S4iEkEKdxGRCFK4i4hEkMJdRCSCFO4iIhGkcBcRiSCFu4hIBCncRUQiKKlwN7PDZvY7M3vdzPYFZRVm9oKZvRk8lwflZmbfMbNGM9tvZvPD3AARETlbKnvuS9z9Knfvu1H2BqDO3WcBdcE8QDUwK3isBbamq7EiIpKcsXTLLAd2BNM7gBUJ5Ts97hWgzMymjKEeERFJUbLh7sDzZvaama0Nyird/d1guhmoDKanAkcT3nssKBvAzNaa2T4z29fa2jqKpouIyHDyk1xukbs3mdlHgRfM7I3EF93dzcxTqdjdtwHbABYsWJDSe0VE5NyS2nN396bg+TjwE+DjQEtfd0vwfDxYvAmYnvD2aUGZiIhkyIjhbmalZnZB3zTwKeAA8BywKlhsFfBsMP0ccEdw1sy1wOmE7hsREcmAZLplKoGfmFnf8k+5+0/N7FfAD8xsDXAE+Gyw/B7gZqAR+AC4M+2tFhGRcxox3N39D8CVQ5S/B9wwRLkDd6WldSIiMiq6QlVEJIIU7iIiEaRwFxGJIIW7iEgEKdxFRCJI4S4iEkEKdxGRCFK4i4hEkMJdRCSCFO4iIhGkcBcRiSCFu4hIBCncRUQiSOEuIhJBCncRkQhSuIuIRJDCXUQkghTuIiIRpHAXEYmgpMPdzGJm9hsz2x3MX2Jmr5pZo5l938wKg/KiYL4xeH1mSG0XEZFhpLLnfg/QkDD/EPBtd78UOAmsCcrXACeD8m8Hy4mISAYlFe5mNg34C+C7wbwB1wNPB4vsAFYE08uDeYLXbwiWFxGRDEl2z/3vgHuB3mD+IuCUu3cH88eAqcH0VOAoQPD66WD5AcxsrZntM7N9ra2to2u9iIgMacRwN7NPA8fd/bV0Vuzu29x9gbsvmDx5cjpXLSKSsoqKCswspUdFRUW2mz2s/CSWWQh8xsxuBoqBC4HNQJmZ5Qd759OApmD5JmA6cMzM8oFJwHtpb7mISBqd+Ose4vGWip4wmpIWI4a7u98H3AdgZp8EvurunzezHwK3An8PrAKeDd7yXDD/j8Hrv3B3T3vLRUTSyO4/Q6pRZWb418Npz1iN5Tz39cCXzayReJ/69qB8O3BRUP5lYMPYmigiIqlKplumn7u/CLwYTP8B+PgQy7QDf5mGtomIyCjpClURkQhKac9dRCTKUr0kp7y8PKSWjJ3CXUQEhj2YamYpH2gdD9QtIyISQQp3EZEIUriLiESQwl1EZAg1NTUUFxcDUFxcTE1NTZZblBodUBURGaSmpoZHH32UvLz4/m93dzePPvooAFu2bMlm05Jm4+Eo8IIFC3zfvn3ZboaIpGA0Z5Hkypkn+fn59PScPW5MLBaju7t7iHdkh5m95u4LhnpN3TIiIoMMFeznKh+PFO4iIhGkcBcRGUZVVRVHjhyhqqoq201JmQ6oiogM44033uBjH/sYsVgs201JmcJdREbF/+uF8PVJqb8nh/T1sedSX3sfhbuIjErUbm4RNepzFxEZRkFBAWZGQUFBtpuSMoW7iMgQJk2aRFdXF+5OV1cXkyal1gWVbQp3EZEhXHjhhRQVFQFQVFTEhRfm1vGCEcPdzIrN7J/M7LdmdtDM7g/KLzGzV82s0cy+b2aFQXlRMN8YvD4z5G0QEUm7o0eP0tHRAUBHRwdHjx7NcotSk8yeewdwvbtfCVwF3GRm1wIPAd9290uBk8CaYPk1wMmg/NvBciIikkEjhrvHvR/MFgQPB64Hng7KdwArgunlwTzB6zdYqveuEhHJsr5Bw4abH++Saq2ZxczsdeA48ALwe+CUu/eNoHMMmBpMTwWOAgSvnwYuSmObRURCN3v27AF97rNnz85yi1KTVLi7e4+7XwVMAz4O/PlYKzaztWa2z8z2tba2jnV1IiJp1dDQQGdnJwCdnZ00NDRkuUWpSel7hrufAuqBTwBlZtZ3EdQ0oCmYbgKmAwSvTwLeG2Jd29x9gbsvmDx58uhaLyIiQ0rmbJnJZlYWTE8AbgQaiIf8rcFiq4Bng+nngnmC13/huTCAs4hIgsLCQvLz4/uv+fn5FBYWZrlFqUlmz30KUG9m+4FfAS+4+25gPfBlM2sk3qe+PVh+O3BRUP5lYEP6my0iEq5bbrmFyy67jLy8PC677DJuueWWbDcpJboTk4iMSpTvxBSLxXB3KisrOX78OB/96EdpaWnBzMbVIGK6E5OIhMLMUnqUl5dnu8lJWbp0Ke7O8ePH6e3t5fjx47g7S5cuzXbTkqZwF5FRcfdhH8O9fuLEiSy3OjlNTU2sWLGif8CwgoICVqxYQVNT0wjvHD8U7iIigzQ0NDBlypQBZVOmTMmp0yEV7iIig5SVlfH444+zadMm2tra2LRpE48//jhlZWXZblrSdEBVRNIuVw6cDqegoICioiImT57M22+/zYwZM2htbaWjo4Ourq5sN6+fDqiKiKSgu7ubkpISgP5/UiUlJXR3d5/rbeOKwl1EZBAz44orrqC0tBQzo7S0lCuuuIJcGgNR4S4iMoi7U1dXx+LFizlx4gSLFy+mrq4up7qa1OcuImmX633uxcXFlJeX09zc3F928cUXc/LkSdrb27PYsoHU5y4ikoKOjg6am5tZt24dp06dYt26dTQ3N/ffmSkXKNxFRAYxM6qqqqitraWsrIza2lqqqqrU5y4iksvcnYaGhgHnuTc0NORUV5P63EUk7XK9zz0vL4+5c+fS2NhIR0cHRUVFXHrppRw6dIje3t5sN6+f+txFRFLg7hw8eJDVq1dz6tQpVq9ezcGDB3PqH5bCXURkkKKiIhYuXDigz33hwoX991TNBQp3EZFBOjs7aWpqYu/evXR2drJ3716ampr676maC/JHXkRE5Pwyd+5cZs2aRXV1dX+fe3V1NaWlpdluWtK05y4iMsiSJUvYvXv3gLNldu/ezZIlS7LdtKQp3EVEBqmvr2f9+vXU1tZywQUXUFtby/r166mvr89205I24qmQZjYd2AlUAg5sc/fNZlYBfB+YCRwGPuvuJy1+lv9m4GbgA+AL7v7rc9WhUyFFoiXXT4WMxWK0t7f334kJoKuri+Li4kjdQ7Ub+Iq7zwWuBe4ys7nABqDO3WcBdcE8QDUwK3isBbaOsf0iIhk1Z84cXnrppQFlL730EnPmzMlSi1I3Yri7+7t9e97u/kegAZgKLAd2BIvtAFYE08uBnR73ClBmZgPvVyUiMo5t3LiRNWvWUF9fT1dXF/X19axZs4aNGzdmu2lJS+lsGTObCVwNvApUuvu7wUvNxLttIB78RxPediwoezehDDNbS3zPnhkzZqTabhGR0KxcuRKAmpoaGhoamDNnDg888EB/eS5IOtzNbCLwI+BL7n4mcQAdd3czS6mDzd23Adsg3ueeyntFRMK2cuXKnArzwZI6W8bMCogH+/fc/cdBcUtfd0vwfDwobwKmJ7x9WlAmIiIZMmK4B2e/bAca3P1vE156DlgVTK8Cnk0ov8PirgVOJ3TfiIjkhF27djFv3jxisRjz5s1j165d2W5SSpLpllkI3A78zsxeD8r+C/Ag8AMzWwMcAT4bvLaH+GmQjcRPhbwznQ0WkfFp8Fjng7puM92cMdm1axcbN25k+/btLFq0iJdeeok1a9YA5ExXjYb8FREZZN68eaxYsYJnnnmm/4Bq3/yBAwey3bx+5zrPXWPLiIgMcujQIVpaWpg4cSIAbW1tPP7447z33ntZblnyNPyAiMggsViM3t5eamtraW9vp7a2lt7eXmKxWLabljSFu4jIIN3d3RQWFg4oKywspLu7O0stSp3CXURkCHfeeSc1NTUUFxdTU1PDnXfm1rkh6nMXERlk2rRpPPHEEzz11FP9Z8vcdtttTJs2LdtNS5r23EVEBnn44Yfp6elh9erVFBUVsXr1anp6enj44Yez3bSkKdxFRAZZuXIlmzdvprS0FDOjtLSUzZs358w57qDz3EVEctZYx3MXEZEco3AXEYkghbuIyBDOh4HDRETOKxo4LE10QFVExhMNHCYiEkGHDh3igw8+OGvP/fDhw9luWtLU5y4iMkhhYSF33303S5YsoaCggCVLlnD33XefNd7MeKZwFxEZpLOzky1btlBfX09XVxf19fVs2bKFzs7ObDctaeqWEREZZO7cucyaNYvq6mo6OjooKiqiurqa0tLSbDctadpzFxEZZMmSJezevZtNmzbR1tbGpk2b2L17N0uWLMl205KmcBcRGaS+vp7169dTW1vLBRdcQG1tLevXr6e+vj7bTUvaiOFuZrVmdtzMDiSUVZjZC2b2ZvBcHpSbmX3HzBrNbL+ZzQ+z8WHK9QsYRGT0GhoaOHHiBI2NjfT29tLY2MiJEydoaGjIdtOSlsye+/8EbhpUtgGoc/dZQF0wD1ANzAoea4Gt6WlmZvVdwLBlyxba29vZsmULGzduVMCLnCfKysrYunVr/52Xuru72bp1K2VlZdltWApGDHd3/wfgxKDi5cCOYHoHsCKhfKfHvQKUmdmUNLU1Yx544AEArr/+egoLC7n++usHlItItJ08eRKAtWvXcurUKdauXTugPBeMts+90t3fDaabgcpgeipwNGG5Y0HZWcxsrZntM7N9ra2tSVecie6SgwcP8tZbbw0oe+uttzh48GDa65Lxx8zO+ZDoc3cqKyv799a3bt1KZWUl4+GK/mSN+YCqx7c25S12923uvsDdF0yePDmp92S6u6Tvg6wP9PnF3fsfg+dz6cMtY9PS0sK6des4deoU69ato6WlJdtNSslow72lr7sleD4elDcB0xOWmxaUpcUDDzzA9u3bB1w1tn379tC6SxTu54+Kioph99KH24OvqKjIcqslbNu2baOsrIxt27ZluykpG224PwesCqZXAc8mlN8RnDVzLXA6oftmzBoaGli0aNGAskWLFoV2BLu3t3fAs0TXyZMnz9pDH+mRS/2vMjqJ395yTTKnQu4C/hGYbWbHzGwN8CBwo5m9CSwN5gH2AH8AGoH/AfyndDZ2zpw53H///QP63O+//37mzJmTzmpERLj44ospKCgAoKCggIsvvjjLLUpNMmfLrHT3Ke5e4O7T3H27u7/n7je4+yx3X+ruJ4Jl3d3vcvd/7e6Xu3tax/FdsmQJDz30EKtXr+aPf/wjq1ev5qGHHsqpq8ZEJDc0NzdTUlICQElJCc3NzVluUWpyajz3efPmMWvWLPbu3TtgvIc333wzrWMsn6uPfTz8vCQEX580yvedTm87ZFwoKCigp6dnwOfdzIjFYnR1dWWxZQNFZjz3Q4cO0dbWxt69e/vHWF69ejVHjhwJpb5YLEZPT0//s0SX3X8m5X/cZoZ/PZz2SHYVFRXR1tbGunXr+MY3vsF9993H1q1bKSoqynbTkpZTY8sUFhZSU1Mz4GyZmpqa0MZY7gt0BbvI+aWtrY358+fz2GOPUVZWxmOPPcb8+fNpa2vLdtOSllPh3tnZySOPPDJgjOVHHnkkp8ZYFpHc8M4771BXV0dnZyd1dXW888472W5SSnKqW2bu3LmsWLGCmpqa/vsa3nbbbTzzzDPZbpqIREh+fj4dHR0Dyjo6OsjPz53IzJ2WAhs3buSee+7pHzC/ra2Nbdu2sXnz5iy3TESipKenhw8//LB/XCmA4uLinOqizaluGYD29naampro7e2lqamJ9vb2bDdJRCKmvLycjo4OKisrMTMqKyvp6OigvLw8201LWk6F+7333kssFmPq1KmYGVOnTiUWi3HvvfeGUt/EiRN57bXXmDhxYijrF5Hx6cyZM5SUlDBhwgTMjAkTJlBSUsKZM2ey3bSk5VS4Hzt2jI6ODpqamnB3mpqa6Ojo4NixY6HU9/7773PNNdfw/vvvh7J+ERmfuru7mTBhAvCna1smTJjQP757OoU10m1OhTvED2o8+OCDtLW18eCDD5510ENktEYa6nfwI5e+oktqzIwrr7yS0tJSzIzS0lKuvPLKtA8iuGvXLm6//XYOHjxIb28vBw8e5Pbbb09LwOdcuJeUlHD11VdTUFDA1Vdf3X95sMhYDDc42LleO3Fi8D1sJCrcnbq6OhYvXsyJEydYvHgxdXV1ab9C/Y477qCnp4fi4mLgTwdt77jjjjGvO+fCvaenh2XLllFYWMiyZctCPXqtPneR81NRURGTJk0acLOOSZMmpf0K1e7ubgoLC9mzZw+dnZ3s2bOHwsLCtHT/5FS4x2IxPvzww/6xHbq6uvjwww+JxWKh1Kc+d5HzU0dHB6dPn+7fsZs4cSKnT58OpRt4w4YNA66637Bhw8hvSkJODRyWl5c35NciM0vrmOt9/WozZ87k5z//OUuXLuXw4cOABg4735iZfufnob7jKoMHDkv33bjGOkhhZAYOG25jw/phHz58mEsvvTRt6x6unqEoUESyy93Jy8ujt7e3/znd8vPz6e7upri4mPb29v7ndFwJm1PdMpng7lx++eVDvjZc+Wjr0X06JSzD3TYwCrcMzORNy/vu75zsfZ5TtXPnTmKxWP/FmO3t7cRiMXbu3DnmdSvch7B///6zgvzyyy9n//79WWqRJFq2bBl5eXmYGXl5eSxbtizbTRq1GTNmDAipGTNmpGW9qd42cDzfMnDwP6qhhPXPqrW1dcBzuq1cuZInn3ySqqoqAKqqqnjyySdZuXLlmNedU33u2biJRjr7XCsqKlL+EJWXl+uUuwTLli3j+eefP6v8U5/6FD/72c/SXl+Yfe4zZszg6NGjXHfddTz99NPceuutvPzyy0yfPp233357TOtOtd3j+thCFm6kEmbWpJoD58qAc/W5K9zJXOiO5gM0rj90WZDpf/Bh/vzNjOuuu45f/vKX/WULFy7k5ZdfHnOdkQr3BJk6VhXm31k6fzcZD3czuwnYDMSA77r7g+daPtvhnrHQzdKt3Ib6ueXCB3kofdtSWVnJiy++yCc/+UlaWlqA3Az34YynABlP+rpdEg9u9p1FN57OYjmn0eTAMBmQ0XA3sxjw/4AbgWPAr4CV7n5ouPecL+E+mgM/Y+2WSazzq1/9Kt/85jf753Phw5zte5umO/TG67fEXAr3vue9e/dSXV094KSEdNZjZuTn59PV1UVBQQHd3d1p+SeSag6Mm24ZM/sE8HV3XxbM3wfg7t8Y7j3nCvd09k+do81Z7S7JxN7h4PN1B5flikx0y4T61T9T/6zSuHc43mTim2hfHd/61rf44he/yGOPPcZXvvKVtNcV5nnuYYT7rcBN7v5XwfztwL9x97sHLbcWWAswY8aMa4a9yXUm/kjH2QEbUIAMJxsH1cOSqW2J0s8sU/p+ZrFYjJ6env5nGF8/s3F5EZO7bwO2QXzPfdgFM7E3kYU9llD/QBK2J9Q99yz83IqKioa8BDyX7krfJ1MhMZ7CKFf0/Z319e33PefS31kY57k3AdMT5qcFZZJFZsbXvva1UC/4yIT29vazPmBFRUW6I5ek1RNPPEFBQcGA/vyCggKeeOKJLLcseWGE+6+AWWZ2iZkVAp8DnguhHklC4l5bzh1MHUZ7e/uAC3AU7JJuK1euZMeOHVRVVZGXl0dVVRU7duxIy8VFmRLWqZA3A39H/FTIWnd/4FzLJ3u2jIiI/EnG+9zdfQ+wJ4x1i4jIyDS2jIhIBCncRUQiSOEuIhJBCncRkQgaF6NCmlkrMMwlqsP6CPAvITQnG/VEaVuiVk+UtiVq9URpW0Zbz8fcfcg7iYyLcB8NM9s33ClAuVZPlLYlavVEaVuiVk+UtiWMetQtIyISQQp3EZEIyuVw3xaheqK0LVGrJ0rbErV6orQtaa8nZ/vcRURkeLm85y4iIsNQuIuIRFDOhbuZ1ZrZcTM7EGId082s3swOmdlBM7snpHqKzeyfzOy3QT33h1FPQn0xM/uNme0OsY7DZvY7M3vdzEIZ6tPMyszsaTN7w8wagls7pruO2cE29D3OmNmX0l1PUNd/Dn7/B8xsl5kVh1DHPcH6D6Z7O4b6TJpZhZm9YGZvBs/lIdTxl8H29JpZWk4hHKae/x78re03s5+YWVlI9fy3oI7Xzex5M/uzMVWSOC52LjyAxcB84ECIdUwB5gfTFxC/4ffcEOoxYGIwXQC8Clwb4nZ9GXgK2B1iHYeBj4T8N7AD+KtguhAoC7m+GNBM/IKRdK97KvAWMCGY/wHwhTTXMQ84AJQQHwn258ClaVz/WZ9J4GFgQzC9AXgohDrmALOBF4EFIW7Lp4D8YPqhsW7LOeq5MGH6r4HHxlJHzu25u/s/AKndATv1Ot51918H038EGoh/CNNdj7v7+8FsQfAI5Qi3mU0D/gL4bhjrzxQzm0T8g7EdwN073f1UyNXeAPze3VO9ijpZ+cAEM8snHsDvpHn9c4BX3f0Dd+8G/g/w79K18mE+k8uJ/xMmeF6R7jrcvcHd/3ks602ynueDnxvAK8TvLhdGPWcSZksZYxbkXLhnmpnNBK4mvlcdxvpjZvY6cBx4wd1DqYf4zVPuBXpDWn8fB543s9eCm6Cn2yVAK/BE0MX0XTMrDaGeRJ8DdoWxYndvAr4JvA28C5x29+fTXM0B4N+a2UVmVgLczMBbYYah0t3fDaabgcqQ68uU1cDesFZuZg+Y2VHg88DfjGVdCvdzMLOJwI+ALw36r5o27t7j7lcR3xv4uJnNS3cdZvZp4Li7v5budQ9hkbvPB6qBu8xscZrXn0/86+xWd78aaCP+tT8Uwa0iPwP8MKT1lxPfy70E+DOg1Mz+QzrrcPcG4t0JzwM/BV4HetJZxwj1OyF9I80kM9sIdAPfC6sOd9/o7tODOu4ey7oU7sMwswLiwf49d/9x2PUFXQv1wE0hrH4h8BkzOwz8PXC9mf2vEOrp2xPF3Y8DPwE+nuYqjgHHEr7hPE087MNSDfza3VtCWv9S4C13b3X3LuDHwHXprsTdt7v7Ne6+GDhJ/DhSmFrMbApA8Hw85PpCZWZfAD4NfD74ZxW27wH/fiwrULgPwcyMeJ9ug7v/bYj1TO478m5mE4AbgTfSXY+73+fu09x9JvEuhl+4e1r3DgHMrNTMLuibJn4gKq1nNbl7M3DUzGYHRTcAh9JZxyArCalLJvA2cK2ZlQR/dzcQP8aTVmb20eB5BvH+9qfSXccgzwGrgulVwLMh1xcaM7uJeJfmZ9z9gxDrmZUwu5yxZkE6jjBn8kH8g/Yu0EV8L25NCHUsIv41cj/xr7CvAzeHUM8VwG+Ceg4Af5OBn98nCelsGeBfAb8NHgeBjSHVcxWwL/i5PQOUh1RPKfAeMCnk38n9wQf5APAkUBRCHf+X+D/B3wI3pHndZ30mgYuAOuBN4mfnVIRQxy3BdAfQAvwspG1pBI4mZMGYzmI5Rz0/Cv4G9gP/G5g6ljo0/ICISASpW0ZEJIIU7iIiEaRwFxGJIIW7iEgEKdxFRCJI4S4iEkEKdxGRCPr/A8jpcQRlNL0AAAAASUVORK5CYII=\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.boxplot(X)\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 115, "metadata": {}, "outputs": [], "source": [ "from sklearn.preprocessing import MinMaxScaler\n", "scaler = MinMaxScaler()\n", "X_Scaled = scaler.fit_transform(X)" ] }, { "cell_type": "code", "execution_count": 116, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.boxplot(X_Scaled)\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 표준화 (standardization)\n", "- 평균이 0, 표준편차가 1이 되도록 조정하는 기법\n", " - 표준정규분포로 변환\n", " - (X - MEAN) / STD\n", "- scikit-learn의 StandardScaler로 변환 가능" ] }, { "cell_type": "code", "execution_count": 117, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.boxplot(X)\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 118, "metadata": {}, "outputs": [], "source": [ "from sklearn.preprocessing import StandardScaler\n", "scaler = StandardScaler()\n", "X_Scaled = scaler.fit_transform(X)" ] }, { "cell_type": "code", "execution_count": 119, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.boxplot(X_Scaled)\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 데이터 분할\n", "\n", "- 머신러닝을 통해 우리가 하고자 하는것은 **예측**\n", "- 일반적으로 학습데이터로 모델을 학습하고 평가데이터로 모델의 성능을 측정함\n", " - 평가 데이터 세트가 없는 경우 데이터중 일부를 평가 데이터로 지정\n", " - train_test_split 함수 이용\n", "- 만약 평가데이터를 이용하지 않는 경우 과대적합이 발생하고 모델 성능 확인이 어려움" ] }, { "cell_type": "code", "execution_count": 120, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "((379, 13), (379,), (127, 13), (127,))" ] }, "execution_count": 120, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from sklearn.model_selection import train_test_split\n", "x_train, x_test, y_train, y_test = train_test_split(X, Y, random_state=0) # 셔플 후 데이터 분할\n", "x_train.shape, y_train.shape, x_test.shape, y_test.shape" ] }, { "cell_type": "code", "execution_count": 124, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "((404, 13), (404,), (102, 13), (102,))" ] }, "execution_count": 124, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x_train, x_test, y_train, y_test = train_test_split(X, Y, test_size=0.2, random_state=0) # 평가데이터 비율 조정\n", "x_train.shape, y_train.shape, x_test.shape, y_test.shape" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# K Fold Cross Validation\n", "1) 전체 데이터를 K개의 그룹으로 나눔\n", "\n", "2) 1개의 Fold는 평가 나머지는 학습으로 사용\n", "\n", "3) 각각의 Fold가 한번씩 평가데이터로 사용하여 결과를 평균\n", "\n", "![](https://i.imgur.com/QxHgiXb.png)" ] }, { "cell_type": "code", "execution_count": 122, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])" ] }, "execution_count": 122, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from sklearn.model_selection import KFold\n", "data = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])\n", "data" ] }, { "cell_type": "code", "execution_count": 123, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "학습 : [2 3 4 5 6 7 8 9], 평가 : [0 1]\n", "학습 : [0 1 4 5 6 7 8 9], 평가 : [2 3]\n", "학습 : [0 1 2 3 6 7 8 9], 평가 : [4 5]\n", "학습 : [0 1 2 3 4 5 8 9], 평가 : [6 7]\n", "학습 : [0 1 2 3 4 5 6 7], 평가 : [8 9]\n" ] } ], "source": [ "folds = KFold(n_splits=5, shuffle=False)\n", "\n", "for train_index, test_index in folds.split(data):\n", " print(f'학습 : {data[train_index]}, 평가 : {data[test_index]}')" ] }, { "cell_type": "code", "execution_count": 47, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "학습 : [0 1 2 4 6 7 8 9], 평가 : [3 5]\n", "학습 : [0 2 3 4 5 7 8 9], 평가 : [1 6]\n", "학습 : [1 3 4 5 6 7 8 9], 평가 : [0 2]\n", "학습 : [0 1 2 3 5 6 7 8], 평가 : [4 9]\n", "학습 : [0 1 2 3 4 5 6 9], 평가 : [7 8]\n" ] } ], "source": [ "folds = KFold(n_splits=5, shuffle=True)\n", "for train_index, test_index in folds.split(data):\n", " print(f'학습 : {data[train_index]}, 평가 : {data[test_index]}')" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.4" } }, "nbformat": 4, "nbformat_minor": 5 }