{ "cells": [ { "cell_type": "markdown", "id": "efb5e0c9-cfe0-4bf4-8c13-b864657365b7", "metadata": {}, "source": [ "### 하이퍼파라미터\r\n", "* 예측력을 높이기 위해 사용\r\n", "* 과대/과소 적합을 방지하기 위해 사용\r\n", "* 사용자가 지정하는 파라미터\r\n", "\r\n", "#### 하이퍼파라미터 튜닝\r\n", "* 특정 알고리즘의 매개변수 값을 변경하면서 최적의 파라미터를 찾는 방식\r\n", "* GridSearchCV클래스를 통해 하이퍼파라미터 탐색과 교차 검증을 한번에 수행\r\n", "\r\n", "#### GridSearchCV\r\n", "* 교차 검증으로 하이퍼파라미터 탐색을 수행한다\r\n", "* 최상의 모델을 찾은 후 훈련 세트 전체를 사용해 최종 모델을 훈련한다\r\n", "* 매개변수\r\n", " - GridSearchCV(모델, param_grid = 파라미터, cv=반복횟수, n_jobs=코어 수(-1, 모든 코어 사용))" ] }, { "cell_type": "code", "execution_count": 2, "id": "cb443f9b-1d9a-4135-acd4-0ff3f3700301", "metadata": {}, "outputs": [], "source": [ "# 교차 검증이란?\n", "# : 70 퍼센트의 학습용 데이터를 다시 쪼개서 학습하고 쪼개서 학습한 단위를\n", "# : 단위 학습이 끝날 때마다 테스트를 진행" ] }, { "cell_type": "markdown", "id": "c4f97d43-a651-4ce6-b075-26a4b01e2dfc", "metadata": {}, "source": [ "### K-최근접 이웃 알고리즘\r\n", "* 주위에서 가장 가까운 다른 데이터를 보고 현재 데이터를 판단\r\n", "\r\n", "#### 하이퍼파라미터\r\n", "* n_neighbors\r\n", " - 기본 가까운 5개의 데이터를 보고 자기 자신이 어디에 속하는지를 판단\r\n", " - 비교하고자 하는 데이터의 수가 적을 수록 과대 적합이 된다\r\n", "* metric : 거리계산 척도\r\n", " - euclidean(녹색) : 유클리디안 거리 측정\r\n", " * 목표 지점까지 가장 짧은 거리\r\n", " - manhattan(빨간색) : 맨하튼 거리 측정 방법\r\n", " * 찾아가는 경로의 모든 길이의 합\r\n", "* weights : 가중치\r\n", " - uniform : 거리에 가중치 부여하지 않음(균일한 가중치)\r\n", " - distance : 거리에 가중치 부여(가까이 있는 데이터에 가중치)" ] }, { "cell_type": "markdown", "id": "9f518611-404e-42fc-9cbc-54a0f8c1b592", "metadata": {}, "source": [ "" ] }, { "cell_type": "code", "execution_count": null, "id": "e507593a-34f6-4383-83b6-a2d44e470b2c", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "53bd692d-32d2-4b15-9972-b4ede3034e07", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": 3, "id": "13905392-f85a-4e79-ab42-3867f1951ece", "metadata": {}, "outputs": [], "source": [ "from sklearn.neighbors import KNeighborsClassifier\n", "from sklearn.preprocessing import MinMaxScaler\n", "from sklearn.model_selection import train_test_split\n", "import pandas as pd\n", "import warnings\n", "warnings.filterwarnings(\"ignore\")" ] }, { "cell_type": "code", "execution_count": 4, "id": "3bdf113e-f4d3-4547-8f1a-b109ac690107", "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", "
PassengerIdSurvivedPclassSexAgeSibSpParchFare
0103022.0107.2500
1211138.01071.2833
2313126.0007.9250
3411135.01053.1000
4503035.0008.0500
\n", "
" ], "text/plain": [ " PassengerId Survived Pclass Sex Age SibSp Parch Fare\n", "0 1 0 3 0 22.0 1 0 7.2500\n", "1 2 1 1 1 38.0 1 0 71.2833\n", "2 3 1 3 1 26.0 0 0 7.9250\n", "3 4 1 1 1 35.0 1 0 53.1000\n", "4 5 0 3 0 35.0 0 0 8.0500" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df = pd.read_csv(\"../data_set/5.스케일링/titanic_cleaning.csv\")\n", "df.head()" ] }, { "cell_type": "code", "execution_count": 6, "id": "5be1cfd9-2174-4f22-a547-c71c32acc712", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Index(['PassengerId', 'Survived', 'Pclass', 'Sex', 'Age', 'SibSp', 'Parch',\n", " 'Fare'],\n", " dtype='object')" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.columns" ] }, { "cell_type": "code", "execution_count": 19, "id": "6f06a6e5-40f2-4131-b562-57f56c80fc06", "metadata": {}, "outputs": [], "source": [ "features = ['Pclass', 'Sex', 'Age', 'SibSp', 'Parch', 'Fare']\n", "label = \"Survived\"\n", "X, y = df[features], df[label]" ] }, { "cell_type": "code", "execution_count": 20, "id": "16545ea2-e10d-4298-b0dc-c8bb53f76176", "metadata": {}, "outputs": [], "source": [ "minMaxScaler = MinMaxScaler()\n", "minMaxScaler.fit(X)\n", "X_scaler = minMaxScaler.transform(X)" ] }, { "cell_type": "code", "execution_count": 21, "id": "433a55c0-2593-4346-9c3b-516aee64c18b", "metadata": {}, "outputs": [], "source": [ "# 학습용 80%, 테스트용 20%\n", "X_train_minMax, X_test_minMax, y_train, y_test = train_test_split(X_scaler, y, test_size=0.2)" ] }, { "cell_type": "code", "execution_count": 22, "id": "856edd77-e8d8-4375-912d-47a47ba04822", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "train 0.8721910112359551\n", "test 0.8212290502793296\n" ] } ], "source": [ "# 알고리즘 생성\n", "knn = KNeighborsClassifier()\n", "\n", "knn.fit(X_train_minMax, y_train)\n", "\n", "print(\"train \", knn.score(X_train_minMax, y_train))\n", "print(\"test \", knn.score(X_test_minMax, y_test))" ] }, { "cell_type": "code", "execution_count": 25, "id": "4ff6d4b7-65c1-4bed-a46a-b359014d35e1", "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", "
ktrain 정확도test 정확도
010.9859550.754190
120.8960670.793296
230.8876400.810056
340.8637640.826816
450.8721910.821229
560.8553370.826816
670.8511240.804469
780.8384830.821229
890.8398880.787709
9100.8412920.787709
\n", "
" ], "text/plain": [ " k train 정확도 test 정확도\n", "0 1 0.985955 0.754190\n", "1 2 0.896067 0.793296\n", "2 3 0.887640 0.810056\n", "3 4 0.863764 0.826816\n", "4 5 0.872191 0.821229\n", "5 6 0.855337 0.826816\n", "6 7 0.851124 0.804469\n", "7 8 0.838483 0.821229\n", "8 9 0.839888 0.787709\n", "9 10 0.841292 0.787709" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "k_param = range(1, 11)\n", "train_list = []\n", "test_list = []\n", "for k in k_param:\n", " knn = KNeighborsClassifier( n_neighbors=k )\n", " knn.fit(X_train_minMax, y_train)\n", " # print(\"k : \", k, \"train : \", knn.score(X_train_minMax, y_train), knn.score(X_test_minMax, y_test))\n", " train_list.append(knn.score(X_train_minMax, y_train))\n", " test_list.append(knn.score(X_test_minMax, y_test))\n", "\n", "dic = {\n", " \"k\" : k_param,\n", " \"train 정확도\" : train_list,\n", " \"test 정확도\" : test_list\n", "}\n", "\n", "score_df = pd.DataFrame(dic)\n", "score_df" ] }, { "cell_type": "code", "execution_count": 29, "id": "af1f063f-b6eb-4b69-bcbe-ce413d40eb7c", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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2muvZefOncTExJCXl0ePHj1YsGCBy+8vIt4nPjKEtKbxpDWNr3a88EgF2487M608S92bd5i8wxWs3JXHyl151Z5TJzSI5gnHhnxbJtShU0osdeuE1uRHEj/jcnBOmjSJiooKAKZNm8YTTzxBWVkZU6dOdel1iouLmTp1Knv27CEoKIiYmBjGjx/P008/XS04161bR8uWLencuTMAl19+OREREWzdupVu3bqRm5tbbV9QEfFP0WHBdG4cR+fGcdWOl5Y72JF97My08mx1d85hisvsrN2bX7VBN0BIUAA3d09hVN/mNIgNr+FPIf7A5eB88skn+ec//wmYDd9dDcxKq1evpmnTptSte6zPZVpaGuvXr8dutxMUZJbWu3dv8vLy+OGHH7j88sv58MMPiY+Pp2PHjgDk5eUpOEVqsfCQQNo1iKFdg5hqx8vtTnbnlFSdmW49VMymzEK2HSpm2rLdfLhiDzd0acS9/VrQuG6ERdWLL3I5OD/++OOq4DwfGRkZJCYmVjuWkJCA3W6nsLCQ+HhzmCYuLo6XXnqJK6+8koiICMrLy1m0aBEhIWZnktzcXL766itSUlJITEzkjjvu4N577z3ldY2ysjLKysqq7h/fqF5E/EdIUAAtE6NoedwG3IZh8POOXF6du5VlO3L4aOVePl29j+s6NeC+/i1oXr+OhRWLr3C5nceECRMYP378aXvWng2Hw3FC277Kln3Hh96KFSt46KGHWLVqFUVFRcyePZshQ4awa9cuAMaOHUteXh579uzhrbfeYuLEiUyePPmU7/vcc88RExNT9ZWSknJen0NEfIfNZqNn87p8OLIH/x3Vk76t6uNwGsz8ZT+XvbiABz5cQ/qBIqvLFC/n8nKU8PBw7HY7TqeT4OBgAgICMAwDm83G4cOHz/p1Zs+ezd/+9jd+++23qmN79+6ldevWFBcXV82sHT58ON26deOhhx6qetzo0aOJiorimWeeOeF1P/roI1577TUWLlx40vc92RlnSkqKlqOI1FJr9+Yzcd42ftx0sOrYle0SeWBAS9o3jDnNM8WfeHQ5yubNm8+5sON16dKF9PR08vLyiIszL/YvWbKEtLS0astRysvLq653VgoICDiha1Elh8NRNYx7MqGhoYSGakadiJguTInlnRHd2JhRyKSftjJn/QG+23CQ7zYcZECbBB4Y0OKECUlSu7k8VLtixQpSU1OrfTVq1Ig1a9a49DpJSUkMHDiQ8ePHY7fbyc7O5tlnn+XBBx+s9rihQ4cyceJE9uzZA8Avv/zCjBkzuOGGGwBYuHAhJSUlAGzbto0JEyZw2223ufqxRKSWu6BBNK8N78r3D/ZhcKcGBNhg3uZDXP/aUm6bspwVO3OtLlG8hMtDtc2aNWPHjh1nffx0srOzufPOO1m6dCmRkZE88sgj3H///cyYMYOVK1fyyiuvAPD222/z0ksvUVJSQlxcHE899RTXXXcdYM7yff311wkLCyM6OpoHH3yQO++886xrUOcgETmZndklvPbTNj5fsx+70/xnMq1pPKMHtKRXi7pqrOBnPNJy77HHHqOoqIgPPvjghK48O3bsICcnh5UrV5571RZRcIrI6ezNPczrC7bz31X7KHeYDes7N45l9ICW9GtdXwHqJzxyjbNdu3bs3LmTgICAE5aRtGnThptvvvncqhUR8WIp8RE8e30HHhjQgjcX7ODDFebuL3e8v5IODWO4f0ALLm+bSECAArS2cHmo9rbbbmP69OmeqqfG6YxTRFxxqOgI7yzayfRluymtMJfQtUmK4v4BLRjUPplABahP0kbWLlBwisi5yC0pZ8riHUxdupviMnOLtOb1I7mvfwuuvbABQYEuz70UCyk4XaDgFJHzUXC4gveW7uTdxTspPLrHaGrdCO7t15zrOzciJEgB6gsUnC5QcIqIOxQdqWD6z7t5Z9FOco/uKdowNpxR/ZpzY9dGhAUHWlyhnI6C0wUKThFxp8Pldv6zfA9vLtxBVpHZpSwxOpSRfZozLK0x4SEK0HNhGAZHKpwUlVVQfMROcZn92H/L7HRsFEOLhKgzv9ApKDhdoOAUEU84UuHg45V7eWPBdjILjgBQr04Id/Vuxq09UqkT6nLjNp9kdzgpKXNQVFZBSZmD4rIKin4XfEVH7JQcDcCi4wPxuGAsLrPjcJ46rp645gLu6NX0nOtUcLpAwSkinlRmdzDzl/28Nn8be3NLAYiNCObOXk0Z0asJ0WHBFld4IsMwKLM7qwVc5ZleSXnl/eoBV3n/99+vnHnsLjabuUF5VGgQdcKCqBMaRJ2wYG7pnsKgDsnn/LoKThcoOEWkJlQ4nHz5awav/bSNHdlmm9CosCBuv7gJf+7VlLjIU/fYPlsOp1F1dlZy9Ezu2JnbsTO9qrO7k5z5VX7ffpqzu3MREhRQPexCg4g6ejvy6PGo0GNBePz3j39OREigR5pOKDhdoOAUkZrkcBrM+i2DyT9tY8vBYgAiQwK5tWcqf+zciAqHs1qAFR0XfKc7sysus3O43L1nd0BVYEWGBhIVFnwszI4G3u/Dzbx/LPgijz43NMi7r+0qOF2g4BQRKzidBt9tOMDEedvYmFno1tcODrQRFRZMZGggdUKDfzeseezMrtqZ3u+DLyyIiODAWtMRyaPbiomIyPkLCLAxqEMyA9snMW/zIV6bv53NmYXVrtvVCQ08enYXfNIzu8iQ3weeed/bz+58nYJTRMRCNpuNS9smcmnbxDM/WLyCWlqIiIi4QMEpIiLiAgWniIiICxScIiIiLlBwioiIuEDBKSIi4gIFp4iIiAsUnCIiIi5QcIqIiLhAwSkiIuICBaeIiIgLFJwiIiIuUHCKiIi4QMEpIiLiAm0rJnIyxYdg45dQJxEadYfoZKsr8n7lhyHzVzi4wfyZNehkdUUiHqHgFDmeYcDaD+HbcXAk/9jx6IbQsCs06maGQnInCImwqkrrOZ2QsxX2rYL9q8z/HtwAhsP8vi0Qrn4Juo6wtk4RD1BwilTK2w2zHoTt88z79dtAQBAc2giF+82vTV+Z37MFQuIF0LCbGaYNu0G9VhDgp1c/SrKrh+T+X6Cs4MTH1UmEqGTzzPPr0ZC3Ewb8w39/LlIr2QzDMKwuwkqFhYXExMRQUFBAdHS01eWIFZwOWPEWzJ0AFSUQFAb9/gY9H4DAICgrNoNg38qjobEaijJPfJ3QaGjYpXqY1qlf4x/nvNnLIPO3YyG5byXk7z7xcUHh5nBs5Zl4w24Q08j83oIXYP5z5u1218Pg1yE4vMY+goirXMkCBaeCs3Y7tBm+ut8MB4DUXnDNq1CvxemfV7D/uGBZZQZrxeETHxebeixUGnWDpI4QHOb2j3HODANyd5i/DFSG5IF14Kw48bH1Wh39HF3N4eqECyAw+NSvvfYj+PJ+87UapcEtH0JkPc99FpHzoOB0gYKzlrKXw+KXYOH/mv+wh0TB5U9B1zvObVjRYTeHdPevgn2rzf9mpQO/++sVEAxJ7c3gqQzT+GZgs7nlY51Rad7RkFxthuT+1VCae+LjIuoera+7GZQNukB4rOvvt3MRfDwcjhRAXBMY/l+o1/J8P4WI2yk4XaDgrIX2rTbPMg9tNO+3Ggh/eBFiGrr3fY4UmNcCjw/TkqwTHxced3S482iYNuwCEfHn//6OCji4/thZ8f5VkLPtxMcFhkDyhccNMXc1Q85dYZ61BT4YYg73hsXCzR9Ak0vc89oibqLgdIGCsxYpL4F5z8Dy18FwmmdVg/4F7W+omTM+w4D8PcfO9Patgsy14Cg78bHxzY/N4G3YFRLbQ1DI6V+7YO/R67BHQzpzLdiPnOS1m1W/DpvUHoJC3fc5T6Y4Cz66xawvIBiumwwX3uTZ9xRxgYLTBQrOWmLHfPhq9LFJLh1vgiufg8i6lpaFvdw8K9y/+tjko9ztJz4uMNQ8K6w8I0zuBIX7jk1W2rcKSg6d+Lyw2OrLaBp2dc/Z7LmoKIXP7zbXxwL0Gwd9H6u5YWpf4HRqBrJFFJwuUHD6udI8+P5/YM0M8350I7jmZWh5uaVlndbh3OOGeI8OsZbmnfl5AUHmmWmj7sfOJus2965gcjph7pOw5BXz/oW3mJOxTnc2XRvsXQGzHjKH92+fZQ6VS41ScLpAwenHNn4Fsx+B4oPm/e5/gcuegNAoa+tyVeXM1+PXUR5YZ3YzOn7INbmj7yz5WPUefPOw2TChSW+4abp5rbe2KSuGuU+by6EqJ5IldYQ7f/Cu2de1gILTBQpOP1R00AzMymYFdVvCtRMhtae1dUl1236ET26H8iLz/9HwTyG+qdVV1ZxtP8LXD0HBHvN+h6GwfS4czoEufzL/zEqNcSULNJgu/sMwzCHZyd3N0AwIgt6PwKjFCk1v1OIy+PO3ZjvDnK3wzmWwd6XVVXne4Vz4fBTMuMEMzdjGcOtMuOFtuOEdwAa/TDt2eUG8joJT/EPuTpg+GL68z7xOlNwJRs6HS/+uIS9vltQe7pprDk8ezoapV8OGL6yuyjMMA9bPhMlpZj9kbHDRPXDPMmhxqfmY5gOg/+Pm7W8eNjs4iddRcIpvczpg2WR4/WJz5mxQGFz+9NF/jDtYXZ2cjehkuGMOtBpkLp/5dIQ5ecifriIVZsBHw+C/d5hreeu3gTu/h0HPQ2id6o/t/TC0vML8WXxyG5TmW1KynJqCU3zXwY0w5Qr4brzZ7q5Jb7hnKfQaY/aYFd8RWsdsjJB2t3n/h3+Ys0wddmvrOl9OpzkRavJFkD7bXMPa929w90JISTv5cwIC4Po3zSHcvF3msK7TWaNly+kpOMX32Mvgp+fgzT7mLNPQaLjmFfjTV+byC/FNAYFw1b9g4AuADVa/B/8ZCkcKra7s3ORsh2nXmjvulBWaa2jvXgj9x5254UREPAydZq7f3TIHlrxcExXLWVJwim/Zu9IMzAXPmz1mW18F9y2Hrrdr4bi/6DEKbv4PBEeYs0zfHQgF+6yu6uw57OZQ8+sXw65F5ue48llziUniBWf/Og06w1X/a96eNwF2LPBMveIyLUfRchTfUFYM8/4Jy98ADIisb7bLa3e9dy3wF/fJWAP/uclch1snCYZ9bG5j5s0OrDN3hMn81bzftK85GnKuy2wMw3y9X2dARD0YtQiiG7itXDlGy1HEv2yfB6/3NHvMYpjdZu5bAe3/qND0Zw06w10/Qv22UHwA3rsK0r+1uqqTqzhi7uf6Vj8zNMNizH68f/ry/Nam2mzwh39DYgdz1vEnI8w2jWIpBad4r8O58MW9MP16szl6TArc+hlc/4Z1/ValZsU2hju/g2b9zU3GP7oFlr9pdVXV7fkZ3uwNi/4NTju0vdb8xa7zre75xS44HG6aBqExsG+FOXFKLKXgFO9jGOZavskXwa8fYK53GwX3/mwumpfaJSzG7CrU5U/mrjZzHoU5fzOXIlmprAhmjzWvwWZvgTqJMHS62T4wKsm97xXfzPyFEcyRl/Wfuff1xSWasy/epeiAufB78yzzfr1WcO0kaHyRtXWJtQKDzWbwcU1h7lNmeOTvNjvthETWfD1bf4CvHzR3qAHz7PKKf3q2326bq+CSv8LiF+HLB8yG/vVbe+795JQ0OUiTg7yDYcCa6fDd/0BZgdku75K/Qp9HPL9XpPiW9TPNtY2OMrND1LBPICqxZt67JAe+Gwe/fWzej001J/80718z7++ww4zrYedC85fKv8zzvU0LvJQmB4lvyd1hrnf76gEzNBt0hpELYMDjCk05Ufs/woivzY3IM3+Fdy41m2F4kmHAuv+a7fJ++xhsAdDzfrh3Wc2FJpiNPW54F6KSzeHhr0b7V4clH6HgFOs4HbB0Erx2sfkbdFC4Odx1549mD1ORU2l8kTnjtm4LKNgL715pzr72hIL98OHN8Nmd5szWhAvMP6NXPmPNMHGd+nDjVHNUZsNM75ssVQsoOMUaBzeYu2F8/zjYS812efcuhYsfULs8OTvxzcymAqm9zM48H9xo7iriLk4nrJxiTlLb8q3ZLq/feHM0pFFX973PuWh8EVzxjHn7+8dhz3Jr66llFJxSs+xlMO8Zs/tPxi/mFPtrJ5pDb/HNrK5OfE1EPNz2OXS8yVwK8tUD8ONT59/bNXubuVPLN3819wtt1N1sPtDvMQgKcU/t5+uiu6HdH83P/ekIKM6yuqJaQ7/aS83Zs9z8hy073bzf5mq46t/m7hgi5yoo1GyKHtfUbMW4+EWzOfrg113fUs5hh2WTYP5z5u4kwRFw6T8gbaTZS9eb2GzmL50HN5h/p/57B9z2hUZsaoDOOMXzyoph9qPmdajsdIhMMK/R3DRDoSnuYbOZzdMHv2EOqW6YaU44K8k++9fI/A3eGQA/PmGGZrP+5uSfHvd4X2hWCq1jrhsNjjT74v70jNUV1QoKTvGsbT/Caz1hxZuAAZ2Gm03Z2w1Wuzxxv063mEO3YTGwd7l5HT176+mfU3HEHN59qx9kroWwWPNs9bbPIa5JDRR9nuq3husmmrcXvwibZ1tbTy2g4BTPOJwLn98DM26Agj1m67RbZ8Lg19QuTzyraW9z0lBsKuTtNMNz15KTP3b3Unijlxk4hgMuGGy2y+s0zLd+sWt/A1x0j3n781HmEi/xGAWnuJdhwIbPzfVua/8D2KDHvXDPMmhxqdXVSW1RvzXcNRcadoMj+TB9MPz2ybHvHyk0O1S9Nwhytpm7r9z0AQydWnPNFNzt8qch5SJzLfTHf4KKUqsr8lvqHKTOQe5TmGn+Y5T+jXm/fhuzXV5Kd2vrktqrohRmjoRNX5n3+403tyab9RAU7jePdfkTXD4BwmOtqtJ9CjPgjd7metPOt5o7tMhZcSULFJwKzvNnGPDLVPj+H0fb5QVD74eh91/V+Ues53SaE36Wvlr9eFwTs/9ts76WlOUxO+abOwoZTnPWbZc/WV2RT1DLPak5Odth6jXw9RgzNBt2hbsXmjMcFZriDQIC4IoJcPVLYAs02+Vd/IB5+cDfQhOgWT8Y8D/m7W8egYxfrazGL+mMU2ec58Zhh59fM6e/V653G/A/5vZf3jp1X+TQZvPPZ72WVlfiWU4nfDQMtswxJ+aNXKBJeWfgM2ecpaWljBw5ktTUVBo1asTYsWNxnqTjxxdffEG7du1o3LgxaWlpLF68uNr3X375ZVq0aEHDhg0ZPHgw2dkurN0S1x1YZzbW/uHvZmg27Qv3LIWe9yk0xbsltPH/0ATzLPv6183h6Pw95kzb8+2mJFUsDc6HH34Yp9PJ9u3b2bBhA/Pnz2fSpEnVHrNz505GjBjBjBkz2LNnD8888wzXXnstBQUFAHzyySdMmzaNFStWsGfPHpKTkxk5cqQVH8f/2ctg3j+Prnf71Vwrd91k+NOXEN/U6upE5HjhcebG2kFhsPU7WPx/VlfkPwyLFBUVGREREUZ2dnbVsZkzZxqdOnWq9rgvv/zS6Nq1a7VjDRs2NFauXGkYhmH07NnT+OKLL6q+l5WVZQQHBxs5OTlnVUdBQYEBGAUFBef6UWqH3csMY2I3w3gi2vz66FbDKMy0uioROZNfph/9extjGNvmWl2N13IlCyw741y9ejVNmzalbt26VcfS0tJYv349dru96ljv3r3Jy8vjhx9+AODDDz8kPj6ejh07YrfbWbVqFb169ap6fL169UhNTWXdunU192H8WVkRzB4L7w409/+rk2j+FnvTdIhKsro6ETmTzrcenVlrwGd3QcE+qyvyeZZ1A87IyCAxsfpC44SEBOx2O4WFhcTHmxey4+LieOmll7jyyiuJiIigvLycRYsWERISQmZmJg6Hg3r16p3wOjk5OSd937KyMsrKyqruFxYWuvmT+ZGtP8KsB839DsH8C3jFP80hIBHxHYP+12wnmLkWPhkBd8zxnl1efJBlZ5wOhwPjdxN6HQ4HALbjWl2tWLGChx56iFWrVlFUVMTs2bMZMmQIu3btqnr8yV7Hdop2Wc899xwxMTFVXykpKe78WP7hcC7MvBs+uMEMzdhUc9eF6yYrNEV8UXAYDJ1mzkvYv8rcw1POmWXBGR8ff8Ls16ysLMLDw4mJiak69sorr3D//ffTpUsXbDYbl112Gddffz1vv/02cXFxGIZBXl7eCa+TlHTyYcRx48ZRUFBQ9bV37173fzhfZRiw/jOY1B1++8hc79bzfnOHiOb9ra5ORM5HXBP449vm7RVvwW+fWlqOL7MsOLt06UJ6enq10FuyZAlpaWkEBBwrq7y8nKCg6iPKAQEBlJeXExkZSevWrVm6dGnV9zIzMzl48CAXXnjhSd83NDSU6Ojoal+C2arro2Hw3z+b7brqtzUbZV/5DIREWl2diLhDqyuhz1jz9tej4dAma+vxUZYFZ1JSEgMHDmT8+PHY7Xays7N59tlnefDBB6s9bujQoUycOJE9e/YA8MsvvzBjxgxuuOEGAEaOHMlTTz1Ffn4+5eXljBs3jr/85S9ERETU9EfyTU4nrHoPJl8E6bPNdnn9xpvdfxp1s7o6EXG3fuPM7kIVh+HjW82G9+ISS7cKnzJlCnfeeSfJyclERkbyyCOPMHjwYGbMmMHKlSt55ZVXuPHGG8nPz2fgwIGUlJQQFxfHlClT6NGjBwBjxoxh//79tGrViqCgIK677jqef/55Kz+W78jZDl+Nht1HG0o06m72tkxoa21dIuI5AYFwwxR4s4+5M8xX95sby/vSNmoWU8u92thyz2GHZZNg/nPH2uVd+g9IG6nOPyK1xd6V5rZqzgq48lmz81ct5jMt98QCmb/BOwPM3SLsR6BZf3PyT497FJoitUlKdxj4nHn7+7+bm3rLWVFw1hYVR2Du00fb5a2FsFgY/Drc9rk5205Eap/ud0GHG8FwwKd3QNFBqyvyCQrO2mD3MnjjElj0f+ZfkAsGw30roNMwXdcQqc1sNrjmFXMWffEBc1a9w37m59VyCk5/t+hFeG8g5GyFOklw0wcwdCpEJZ75uSLi/0IizRaaIXXMiYLznra6Iq+n4PRne1fAvAnm7c63wX3Loe3V1tYkIt6nXkuzMxjAkldg0yxr6/FyCk5/VXEEvrwPDCd0vBmumwThsVZXJSLeqt1gs1MYwBf3mMvV5KQUnP5q/nPHdjOpnDknInI6lz0JjXtCWSF88icoP2x1RV5JwemP9q2Gpa+at69+GSLiLS1HRHxEYDAMeQ8iE+Dgevjmr2YPa6lGwelv7GXw5b3mEG2HG6HNVVZXJCK+JDoZbnwPbIGw9kNY/b7VFXkdBae/WfACZG2GyPow6F9WVyMivqjJJWY3MYA5j8L+X6ytx8soOP3J/l9g8cvm7atf0hCtiJy7XmOgzdXgKDc3vz6ca3VFXsPSJu/iRvayo7NoHdD+Bmh7jdUViYgvs9lg8Gvw1kbI3QEf3wZt/mB1VaeWejE06FQjb6Xg9BcL/w2HNkJEPRj0v1ZXIyL+ICwGhk6Hdy4zmyNU7qTkja58VsEpLsj41WynB/CH/4PIupaWIyJ+JKk93DYTfpkGTi9ux1evVY29lYLT19nLjw3RXjDYXMQsIuJOqRebXwJocpDvW/yiud4qoi5c9W+rqxER8XsKTl92YB0sPHo986r/hTr1ra1HRKQWUHD6KkeF2U/SaTdn0Lb7o9UViYjUCgpOX7X4ZfOMMzwO/vCi9tUUEakhCk5fdHCD2SEIzKUndRKsrUdEpBZRcPoahx2+uBecFdD6D9BhiNUViYjUKgpOX7P0Fcj8FcJi4WoN0YqI1DQFpy85tAnmP2/eHvQCRCVZW4+ISC2k4PQVlUO0jnJoNRA63mR1RSIitZKC01csmwQZv0BojLnziYZoRUQsoeD0BVnp8NOz5u2Bz0F0A2vrERGpxRSc3s7pMHvROsqgxeXQaZjVFYmI1GoKTm/382uwbyWERsM1r2iIVkTEYgpOb5a9Feb907x95TMQ09DaekRERMHptSqHaO1HoPkA6Hyb1RWJiAgKTu+1/E3YuxxCouCaVzVEKyLiJRSc3ihnO8x92rx9xQSITbG2HhERqaLg9DZOJ3x5P9hLoVk/6Hq71RWJiMhxFJzeZuXbsGcpBEdqiFZExAspOL1J7g748Unz9hVPQ1yqpeWIiMiJFJzewumELx+AisPQpDd0/bPVFYmIyEkoOL3FqimwezEER8C1EyFA/2tERLyR/nX2Bnm74IcnzNuXPQXxTS0tR0RETk3BaTXDgK8egIoSSO0F3e+yuiIRETkNBafVVr8HOxdCUDhcN0lDtCIiXk7/Slspfw98/3fz9mVPQHwza+sREZEzUnBaxTDgq9FQXgyNe0La3VZXJCIiZ0HBaZVfpsGOnyAoDK6brCFaEREfoX+trVCwD7573Lw94O9Qt7m19YiIyFlTcNY0w4Cvx0B5ETRKgx73WF2RiIi4QMFZ0379ALb9CIGhMPg1CAi0uiIREXGBgrMmFWbAt+PN2wMeh3otra1HRERcpuCsKYYBXz8IZQXQsBv0vN/qikRE5BwoOGvK2o9g63caohUR8XEKzppQmAnfPmbe7vc3qN/a2npEROScKTg9zTBg1kNwpAAadIaLR1tdkYiInAcFp6et+xS2zIHAELjuNQgMsroiERE5DwpOTyo6CLPHmrf7PgqJF1hbj4iInDcFp6cYBnzzVziSD8kXQq8Hra5IRETcQMHpKes/g82zICD46BBtsNUViYiIGyg4PaH40LEh2j5jIam9tfWIiIjbKDg9YfYjUJoLSR2g91+trkZERNxIweluGz6HjV9CQJCGaEVE/JCC051KsuGbh83bvR+G5I7W1iMiIm6n4HSn2WPhcA4ktIPej1hdjYiIeICC0102fgkbZoIt0OxFGxRidUUiIuIBCk53KMk5NkR7yUPQoJOl5YiIiOcoON3h28egJAvqtzU7BImIiN9ScJ6vgv2Q/u1xQ7ShVlckIiIepI7j5yumIdy7DHYthoZdrK5GREQ8zNIzztLSUkaOHElqaiqNGjVi7NixOJ3Oao8ZMWIETZo0qfYVGRnJAw88AMCaNWsIDQ2t9v0PPvigZj9IbAp0uqVm31NERCxh6Rnnww8/jNPpZPv27ZSUlHDZZZcxadIkRo8+tmfl1KlTqz2nuLiYli1bcv/99wOQl5dHjx49WLBgQY3WLiIitZNlZ5zFxcVMnTqVF154gaCgIGJiYhg/fjzvvffeaZ/30ksvMWjQIFq3bg1Abm4usbGxNVCxiIiIhWecq1evpmnTptStW7fqWFpaGuvXr8dutxMUdGJpJSUlTJw4keXLl1cdy8vLU3CKiEiNseyMMyMjg8TExGrHEhISsNvtFBYWnvQ57777LpdccglNmzatOpabm8tXX31FSkoK3bp1Y/LkyRiGccr3LSsro7CwsNqXiIjI2bIsOB0OxwkB53A4ALDZbCd9zjvvvFPt+ifA2LFjycvLY8+ePbz11ltMnDiRyZMnn/J9n3vuOWJiYqq+UlJSzvOTiIhIbWJZcMbHx5OdnV3tWFZWFuHh4cTExJzw+FWrVpGTk0Pfvn2rHQ8IMD+CzWajS5cuPPnkk3zyySenfN9x48ZRUFBQ9bV37143fBoREaktLLvG2aVLF9LT08nLyyMuLg6AJUuWkJaWVhWGx5sxYwZ//OMfT3k2WsnhcBAScuo+saGhoYSGqkmBiIicG8vOOJOSkhg4cCDjx4/HbreTnZ3Ns88+y4MPPnjSx3/77bdceumlJxxfuHAhJSUlAGzbto0JEyZw2223ebJ0ERGpxSxtgDBlyhQyMjJITk6mW7dujBw5ksGDBzNjxgzGjBlT9bj8/HzS09Pp0uXEzjzz5s2jWbNmpKamcv311zN27FhGjBhRkx9DRERqEZtxuimotUBhYSExMTEUFBQQHR1tdTkiImIBV7JATd5FRERcoOAUERFxgYJTRETEBQpOERERF9T6/Tgr50ap9Z6ISO1VmQFnM1+21gdnUVERgFrviYgIRUVFJ+1ed7xavxzF6XSSkZFBVFTUGbsS+aLCwkJSUlLYu3evltu4SD+7c6Of27nRz+3cuOvnZhgGRUVFNGjQ4KTd645X6884AwICaNSokdVleFx0dLT+Mp4j/ezOjX5u50Y/t3Pjjp/bmc40K2lykIiIiAsUnCIiIi5QcPq50NBQnnjiCe0Icw70szs3+rmdG/3czo0VP7daPzlIRETEFTrjFBERcYGCU0RExAUKThERERcoOP3YvHnz6NWrFy1atKB58+ZMnDjR6pJ8zqhRo2jTpo3VZfiUFStW0KdPH1JTU2nQoAEzZ860uiSvt3//fq655hoaNmxIs2bNmDBhgtUleS3DMJg2bRo9evSodnzNmjX06NGD1NRULrjgAr7//nuPFiF+6q677jI2btxoGIZhbN++3WjQoIExZ84ci6vyHbt37zYiIiKM1q1bW12Kz9i0aZORnJxs/PDDD4ZhGEZZWZlx8OBBi6vyfgMGDDDGjRtnOJ1OIycnx7jwwguN9957z+qyvM6cOXOM9u3bG82aNav297KwsNBo2LBh1Z+7BQsWGDExMUZmZqZH6tAZpx97++23adu2LQDNmjXjpptuYt68eRZX5Tseeugh7rjjDqvL8CmPP/44DzzwAJdddhkAISEhJCQkWFyV91uzZg3Dhg3DZrMRHx/P1VdfzapVq6wuy+sUFxfz7LPPMmXKlGrHP/zwQ7p37171565Pnz707duXjz/+2CN1KDhrkaysrLNuKVXbzZo1i9zcXIYMGWJ1KT6jrKyMWbNm8ec//9nqUnzOsGHDmDRpEuXl5ezevZsvv/xSf/ZOYsiQIVxzzTUnHF+2bBm9evWqdiwtLY1ff/3VI3UoOGuJFStWMGvWLIYNG2Z1KV4vIyOD++67jzfeeMPqUnxKeno64eHhzJs3j44dO9KsWTPuvvtubdl3FiZMmMDcuXOJjY2ladOm9O/fn379+lldls/IyMggMTGx2rGEhARycnI88n4Kzlrg008/5brrrmPatGk0bdrU6nK8mtPpZNiwYYwdO5bWrVtbXY5PKSoqwm63s3z5cpYvX87atWvJyspizJgxVpfm1RwOB1dccQX33HMPBQUF7N+/n7Vr1/LKK69YXZrPcDgcJ+yj6XA4PLbjVa3fHcWfORwORo8ezU8//cT3339Phw4drC7J6z399NNERUVx3333WV2Kz6lXrx5lZWX861//IiQkBICnnnpKZ05nMG/ePMrLy/nrX/8KQHJyMi+99BLXXHONfuk4S/Hx8WRnZ1c7lpWVRVJSkkfeT2ecfmzMmDFs376dFStWKDTP0ptvvsmCBQuIi4sjNjaWq6++mq1btxIbG8vWrVutLs+rpaamEhYWxuHDh6uO2Ww2wsLCLKzK+5WXlxMUVP0cJiAggPLycosq8j1du3Zl6dKl1Y4tWbKEnj17euT9FJx+qrS0lDfeeIOpU6dSp04dq8vxGZmZmRQWFpKfn09+fj6zZs2iZcuW5Ofn07JlS6vL82phYWHcfvvtjB07FrvdTllZGU888QS33nqr1aV5tUsuuYQDBw7wn//8BzCHvB9//HGGDh1qcWW+Y/jw4cydO7dq1cDs2bPZvHkzN954o0feT8Hpp3bu3InT6eSiiy6iSZMmVV+XXnqp1aWJH3v++ecpKyujYcOGtGvXjhYtWmgx/xnExMTw3Xff8f7779OkSRMuvPBC2rZty7///W+rS/MZjRo14qOPPuLee+8lISGBf/7zn3z99ddERkZ65P20O4qIiIgLdMYpIiLiAgWniIiICxScIiIiLlBwioiIuEDBKSIi4gIFp4iIiAsUnCIiIi5QcIrUYk2aNOHnn3+2ugwRn6LgFBERcYGCU0RExAUKThEBzN0kEhISWLBggdWliHg1BaeI8Msvv3DjjTfy8ccf07dvX6vLEfFqCk6RWm7Tpk0MHjyY6dOn079/f6vLEfF62h1FpBZr0qQJpaWlXHfddbz11ltWlyPiE3TGKVLLvfHGG/z000/a/1HkLAVZXYCIWCs5OZm5c+fSu3dvDMNg7NixVpck4tUUnCJC48aNmTt3Ln369MHpdPLYY49ZXZKI19I1ThERERfoGqeIiIgLFJwiIiIuUHCKiIi4QMEpIiLiAgWniIiICxScIiIiLlBwioiIuEDBKSIi4gIFp4iIiAsUnCIiIi5QcIqIiLhAwSkiIuKC/wd0q/NP7HPwKAAAAABJRU5ErkJggg==", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot as plt\n", "import seaborn as sns\n", "\n", "plt.rc(\"font\", family = \"Malgun Gothic\")\n", "\n", "fig, ax = plt.subplots( figsize = (5,5) )\n", "\n", "sns.lineplot( x=\"k\", y=\"train 정확도\", data=score_df )\n", "sns.lineplot( x=\"k\", y=\"test 정확도\", data=score_df )" ] }, { "cell_type": "code", "execution_count": 32, "id": "b9364bae-00cf-4d2b-931d-4c0ba94e6f52", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "최적의 하이퍼 파라미터 : {'metric': 'manhattan', 'n_neighbors': 4, 'weights': 'uniform'}\n", "0.8665730337078652\n", "0.8379888268156425\n" ] } ], "source": [ "from sklearn.model_selection import GridSearchCV\n", "\n", "# params = {\n", "# \"n_neighbors\" : k_param\n", "# }\n", "\n", "params = {\n", " \"n_neighbors\" : range(1, 11),\n", " \"metric\" : [\"manhattan\", \"euclidean\"],\n", " \"weights\" : [\"uniform\", \"distance\"]\n", "}\n", "\n", "knn = KNeighborsClassifier()\n", "\n", "grid_cv = GridSearchCV(knn, param_grid=params, cv=5, n_jobs=-1)\n", "grid_cv.fit( X_train_minMax, y_train )\n", "print(\"최적의 하이퍼 파라미터 : \", grid_cv.best_params_ )\n", "\n", "print( grid_cv.score( X_train_minMax, y_train ) )\n", "print( grid_cv.score( X_test_minMax, y_test ) )" ] }, { "cell_type": "code", "execution_count": 33, "id": "d0781fa3-4603-44d1-bc83-a483d9e839b2", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0.8834269662921348\n", "0.8268156424581006\n" ] } ], "source": [ "knn = KNeighborsClassifier(n_neighbors=3, metric=\"manhattan\", weights=\"uniform\")\n", "knn.fit( X_train_minMax, y_train )\n", "\n", "print( knn.score( X_train_minMax, y_train ) )\n", "print( knn.score( X_test_minMax, y_test ) )" ] }, { "cell_type": "code", "execution_count": null, "id": "f9a71e9f-f566-455b-82cf-b1128d3541b4", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "1d56a5c6-9ccd-43a5-898c-24cb414758e6", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "e8550917-0a68-400f-899e-db2a7ad03f69", "metadata": {}, "source": [ "### 랜덤 포레스트 하이퍼 파라미터\r\n", "* n_estimators\r\n", " - 트리의 개수. default=10\r\n", " - 트리의 개수가 많이면 성능은 좋아지지만, 시간이 오래 걸릴수 있다.\r\n", "* max_depth\r\n", " - 트리의 최대 깊이. default = None\r\n", " - 완벽하게 파라미터값이 결정될 때 까지 분할 또는 min_samples_split보자 작아질 때까지 분할\r\n", " - 깊이가 깊어지면 과대적합될 수 있으므로 적절히 제어 필요\r\n", "* min_samples_leaf\r\n", " - 맆노드(자식노드가 없는 노드)가 되기 위해 최소한의 샘플 데이터 수\r\n", " - min_samples_split과 함께 과대적합 제어용도\r\n", " - 불균형 데이터가 있는 경우 작게 설정하는게 좋다" ] }, { "cell_type": "markdown", "id": "85d8ced0-a68c-4b09-82f9-60df1c89f44f", "metadata": {}, "source": [ "" ] }, { "cell_type": "code", "execution_count": 34, "id": "02dd4348-6223-4056-92a8-9f12c97c5679", "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", "
PassengerIdSurvivedPclassSexAgeSibSpParchFare
0103022.0107.2500
1211138.01071.2833
2313126.0007.9250
3411135.01053.1000
4503035.0008.0500
\n", "
" ], "text/plain": [ " PassengerId Survived Pclass Sex Age SibSp Parch Fare\n", "0 1 0 3 0 22.0 1 0 7.2500\n", "1 2 1 1 1 38.0 1 0 71.2833\n", "2 3 1 3 1 26.0 0 0 7.9250\n", "3 4 1 1 1 35.0 1 0 53.1000\n", "4 5 0 3 0 35.0 0 0 8.0500" ] }, "execution_count": 34, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from sklearn.ensemble import RandomForestClassifier\n", "\n", "df = pd.read_csv(\"../data_set/5.스케일링/titanic_cleaning.csv\")\n", "df.head()" ] }, { "cell_type": "code", "execution_count": 35, "id": "4f4ab82d-24f0-43dc-816f-2a77daa5119b", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Index(['PassengerId', 'Survived', 'Pclass', 'Sex', 'Age', 'SibSp', 'Parch',\n", " 'Fare'],\n", " dtype='object')" ] }, "execution_count": 35, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.columns" ] }, { "cell_type": "code", "execution_count": 36, "id": "0a4be1eb-82a9-4f57-9ea2-5ae996ba9462", "metadata": {}, "outputs": [], "source": [ "f = ['Pclass', 'Sex', 'Age', 'SibSp', 'Parch', 'Fare']\n", "label = \"Survived\"\n", "X, y = df[f], df[label]" ] }, { "cell_type": "code", "execution_count": 37, "id": "cf41396c-7224-4a2a-986d-db4529b33ff9", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "train : 0.9873595505617978\n", "test : 0.8324022346368715\n" ] } ], "source": [ "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)\n", "rfc = RandomForestClassifier()\n", "rfc.fit(X_train, y_train)\n", "print(\"train : \", rfc.score(X_train, y_train))\n", "print(\"test : \", rfc.score(X_test, y_test))" ] }, { "cell_type": "code", "execution_count": 43, "id": "fa8da18f-2a12-4f5c-9f23-ad506df3f07d", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "train : 0.8581460674157303\n", "test : 0.8212290502793296\n" ] } ], "source": [ "rfc = RandomForestClassifier(n_estimators=10, max_depth=10000, min_samples_leaf=10)\n", "rfc.fit(X_train, y_train)\n", "print(\"train : \", rfc.score(X_train, y_train))\n", "print(\"test : \", rfc.score(X_test, y_test))" ] }, { "cell_type": "code", "execution_count": 45, "id": "1359a0e3-ed04-4fdc-9d36-d63e636e489b", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "최적의 하이퍼파라미터 : {'max_depth': 8, 'min_samples_leaf': 5, 'n_estimators': 50}\n", "train : 0.8764044943820225\n", "test : 0.8156424581005587\n" ] } ], "source": [ "params = {\n", " \"n_estimators\" : range(10, 101, 10),\n", " \"max_depth\" : range(4, 11, 2),\n", " \"min_samples_leaf\" : range(5, 21, 5)\n", "}\n", "rfc = RandomForestClassifier()\n", "\n", "grid_cv = GridSearchCV( rfc, param_grid=params, cv=3, n_jobs=-1 )\n", "grid_cv.fit( X_train, y_train )\n", "print(\"최적의 하이퍼파라미터 : \", grid_cv.best_params_)\n", "print(\"train : \", grid_cv.score(X_train, y_train))\n", "print(\"test : \", grid_cv.score(X_test, y_test))" ] }, { "cell_type": "code", "execution_count": 46, "id": "8de6845b-96cd-4561-b741-36efa7a9a8fe", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0,\n", " 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0,\n", " 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 1,\n", " 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1,\n", " 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 0,\n", " 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,\n", " 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0,\n", " 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1,\n", " 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0,\n", " 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,\n", " 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0,\n", " 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0,\n", " 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0,\n", " 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0,\n", " 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1,\n", " 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,\n", " 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1,\n", " 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0,\n", " 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1,\n", " 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0,\n", " 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0,\n", " 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0,\n", " 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1,\n", " 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1,\n", " 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0,\n", " 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0,\n", " 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0,\n", " 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1,\n", " 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0,\n", " 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0,\n", " 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0,\n", " 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1,\n", " 1, 0, 0, 0, 1, 0, 0, 1], dtype=int64)" ] }, "execution_count": 46, "metadata": {}, "output_type": "execute_result" } ], "source": [ "grid_cv.predict( X_train )" ] }, { "cell_type": "code", "execution_count": null, "id": "86253975-6da6-42ed-8e32-5a6bc9253fa2", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "94c57d81-97b2-4404-81e0-eb840922bd2a", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "f2f19192-c0cb-47be-b491-e917dc9883f2", "metadata": {}, "source": [ "### 하이퍼파라미터\r\n", "* n_estimators\r\n", " - 학습기의 수 설정.\r\n", " - 많으면 예측률은 올라가나 시간이 오래걸릴 수 있음.\r\n", "* learning_rate\r\n", " - GBM이 학습을 진행할 때마다 적용하는 학습률로서 순차적으로 오류 값을 보정해가는 데 적용하는 수 이다\r\n", " - 0~1 사이의 값으로 지정한다. default=0.1\r\n", " - 너무 작은 값이면 업데이트를 너무 많이 하게 되어 꼼꼼하지만 시간이 오래 걸린다\r\n", " - 너무 큰 값이면 최소 오류 값을 찾지 못할 수 있지만 빠르다\r\n", "* subsample\r\n", " - 학습기가 학습에 사용하는 데이터 샘플의 비율(0~1). default=1.\r\n", " - 0.5일경우 50%학습데이터를 사용한다는 것이다\r\n", " - 과대적합을 줄이려면 작은 값을 적용해야 한다." ] }, { "cell_type": "code", "execution_count": 47, "id": "535d89d7-157e-47b6-99dd-38e69df8c363", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "train : 0.9044943820224719\n", "test : 0.8212290502793296\n" ] } ], "source": [ "from sklearn.ensemble import GradientBoostingClassifier\n", "gb = GradientBoostingClassifier()\n", "gb.fit(X_train, y_train)\n", "print(\"train : \", gb.score(X_train, y_train))\n", "print(\"test : \", gb.score(X_test, y_test))" ] }, { "cell_type": "code", "execution_count": 54, "id": "1671978e-536f-406b-abc6-312c57ce4ce2", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "train : 0.9058988764044944\n", "test : 0.8324022346368715\n" ] } ], "source": [ "gb = GradientBoostingClassifier( learning_rate=0.1, n_estimators=100, subsample=0.9 )\n", "gb.fit(X_train, y_train)\n", "print(\"train : \", gb.score(X_train, y_train))\n", "print(\"test : \", gb.score(X_test, y_test))" ] }, { "cell_type": "code", "execution_count": 59, "id": "0932b711-5929-4759-8838-f4878a7427a7", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "파라미터 : {'learning_rate': 0.1, 'n_estimators': 100, 'subsample': 0.5000000000000001}\n", "train : 0.898876404494382\n", "test : 0.8491620111731844\n" ] } ], "source": [ "import numpy as np\n", "\n", "params = {\n", " \"learning_rate\" :[0.1, 0.3, 0.5, 0.7, 0.9],\n", " \"n_estimators\" : [100, 200, 300, 400, 500],\n", " \"subsample\" : np.arange(0.1, 1, 0.2)\n", "}\n", "\n", "gb = GradientBoostingClassifier()\n", "\n", "grid_cv = GridSearchCV( gb, param_grid=params, cv=3, n_jobs=-1 )\n", "grid_cv.fit(X_train, y_train)\n", "print(\"파라미터 : \", grid_cv.best_params_)\n", "print(\"train : \", grid_cv.score(X_train, y_train))\n", "print(\"test : \", grid_cv.score(X_test, y_test))" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "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.11.7" } }, "nbformat": 4, "nbformat_minor": 5 }