{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# 6장. 모델 평가와 하이퍼파라미터 튜닝의 모범 사례" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**아래 링크를 통해 이 노트북을 주피터 노트북 뷰어(nbviewer.jupyter.org)로 보거나 구글 코랩(colab.research.google.com)에서 실행할 수 있습니다.**\n", "\n", "\n", " \n", " \n", "
\n", " 주피터 노트북 뷰어로 보기\n", " \n", " 구글 코랩(Colab)에서 실행하기\n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "`watermark`는 주피터 노트북에 사용하는 파이썬 패키지를 출력하기 위한 유틸리티입니다. `watermark` 패키지를 설치하려면 다음 셀의 주석을 제거한 뒤 실행하세요." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "#!pip install watermark" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "last updated: 2020-05-22 \n", "\n", "CPython 3.7.3\n", "IPython 7.5.0\n", "\n", "numpy 1.18.4\n", "pandas 1.0.3\n", "matplotlib 3.2.1\n", "sklearn 0.23.1\n" ] } ], "source": [ "%load_ext watermark\n", "%watermark -u -d -v -p numpy,pandas,matplotlib,sklearn" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 위스콘신 유방암 데이터셋 적재하기" ] }, { "cell_type": "code", "execution_count": 3, "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", "
0123456789...22232425262728293031
0842302M17.9910.38122.801001.00.118400.277600.30010.14710...25.3817.33184.602019.00.16220.66560.71190.26540.46010.11890
1842517M20.5717.77132.901326.00.084740.078640.08690.07017...24.9923.41158.801956.00.12380.18660.24160.18600.27500.08902
284300903M19.6921.25130.001203.00.109600.159900.19740.12790...23.5725.53152.501709.00.14440.42450.45040.24300.36130.08758
384348301M11.4220.3877.58386.10.142500.283900.24140.10520...14.9126.5098.87567.70.20980.86630.68690.25750.66380.17300
484358402M20.2914.34135.101297.00.100300.132800.19800.10430...22.5416.67152.201575.00.13740.20500.40000.16250.23640.07678
\n", "

5 rows × 32 columns

\n", "
" ], "text/plain": [ " 0 1 2 3 4 5 6 7 8 \\\n", "0 842302 M 17.99 10.38 122.80 1001.0 0.11840 0.27760 0.3001 \n", "1 842517 M 20.57 17.77 132.90 1326.0 0.08474 0.07864 0.0869 \n", "2 84300903 M 19.69 21.25 130.00 1203.0 0.10960 0.15990 0.1974 \n", "3 84348301 M 11.42 20.38 77.58 386.1 0.14250 0.28390 0.2414 \n", "4 84358402 M 20.29 14.34 135.10 1297.0 0.10030 0.13280 0.1980 \n", "\n", " 9 ... 22 23 24 25 26 27 28 29 \\\n", "0 0.14710 ... 25.38 17.33 184.60 2019.0 0.1622 0.6656 0.7119 0.2654 \n", "1 0.07017 ... 24.99 23.41 158.80 1956.0 0.1238 0.1866 0.2416 0.1860 \n", "2 0.12790 ... 23.57 25.53 152.50 1709.0 0.1444 0.4245 0.4504 0.2430 \n", "3 0.10520 ... 14.91 26.50 98.87 567.7 0.2098 0.8663 0.6869 0.2575 \n", "4 0.10430 ... 22.54 16.67 152.20 1575.0 0.1374 0.2050 0.4000 0.1625 \n", "\n", " 30 31 \n", "0 0.4601 0.11890 \n", "1 0.2750 0.08902 \n", "2 0.3613 0.08758 \n", "3 0.6638 0.17300 \n", "4 0.2364 0.07678 \n", "\n", "[5 rows x 32 columns]" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import pandas as pd\n", "\n", "df = pd.read_csv('https://archive.ics.uci.edu/ml/'\n", " 'machine-learning-databases'\n", " '/breast-cancer-wisconsin/wdbc.data', header=None)\n", "\n", "# UCI 머신 러닝 저장소에서 유방암 데이터셋을 다운로드할 수 없을 때\n", "# 다음 주석을 해제하고 로컬 경로에서 데이터셋을 적재하세요.\n", "\n", "# df = pd.read_csv('wdbc.data', header=None)\n", "\n", "df.head()" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(569, 32)" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.shape" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array(['B', 'M'], dtype=object)" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from sklearn.preprocessing import LabelEncoder\n", "\n", "X = df.loc[:, 2:].values\n", "y = df.loc[:, 1].values\n", "le = LabelEncoder()\n", "y = le.fit_transform(y)\n", "le.classes_" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([1, 0])" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "le.transform(['M', 'B'])" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "from sklearn.model_selection import train_test_split\n", "\n", "X_train, X_test, y_train, y_test = \\\n", " train_test_split(X, y, \n", " test_size=0.20,\n", " stratify=y,\n", " random_state=1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 파이프라인으로 변환기와 추정기 연결하기" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "테스트 정확도: 0.956\n" ] } ], "source": [ "from sklearn.preprocessing import StandardScaler\n", "from sklearn.decomposition import PCA\n", "from sklearn.linear_model import LogisticRegression\n", "from sklearn.pipeline import make_pipeline\n", "\n", "pipe_lr = make_pipeline(StandardScaler(),\n", " PCA(n_components=2),\n", " LogisticRegression(solver='liblinear', random_state=1))\n", "\n", "pipe_lr.fit(X_train, y_train)\n", "y_pred = pipe_lr.predict(X_test)\n", "print('테스트 정확도: %.3f' % pipe_lr.score(X_test, y_test))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# k-겹 교차 검증을 사용한 모델 성능 평가" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## k-겹 교차 검증" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "폴드: 1, 클래스 분포: [256 153], 정확도: 0.913\n", "폴드: 2, 클래스 분포: [256 153], 정확도: 1.000\n", "폴드: 3, 클래스 분포: [256 153], 정확도: 0.957\n", "폴드: 4, 클래스 분포: [256 153], 정확도: 0.978\n", "폴드: 5, 클래스 분포: [256 153], 정확도: 0.870\n", "폴드: 6, 클래스 분포: [257 153], 정확도: 0.933\n", "폴드: 7, 클래스 분포: [257 153], 정확도: 0.956\n", "폴드: 8, 클래스 분포: [257 153], 정확도: 0.978\n", "폴드: 9, 클래스 분포: [257 153], 정확도: 0.978\n", "폴드: 10, 클래스 분포: [257 153], 정확도: 0.911\n", "\n", "CV 정확도: 0.947 +/- 0.038\n" ] } ], "source": [ "import numpy as np\n", "from sklearn.model_selection import StratifiedKFold\n", " \n", "\n", "kfold = StratifiedKFold(n_splits=10, shuffle=True,\n", " random_state=1).split(X_train, y_train)\n", "\n", "scores = []\n", "for k, (train, test) in enumerate(kfold):\n", " pipe_lr.fit(X_train[train], y_train[train])\n", " score = pipe_lr.score(X_train[test], y_train[test])\n", " scores.append(score)\n", " print('폴드: %2d, 클래스 분포: %s, 정확도: %.3f' % (k+1,\n", " np.bincount(y_train[train]), score))\n", " \n", "print('\\nCV 정확도: %.3f +/- %.3f' % (np.mean(scores), np.std(scores)))" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "CV 정확도 점수: [0.93478261 0.93478261 0.95652174 0.95652174 0.93478261 0.95555556\n", " 0.97777778 0.93333333 0.95555556 0.95555556]\n", "CV 정확도: 0.950 +/- 0.014\n" ] } ], "source": [ "from sklearn.model_selection import cross_val_score\n", "\n", "scores = cross_val_score(estimator=pipe_lr,\n", " X=X_train,\n", " y=y_train,\n", " cv=10,\n", " n_jobs=1)\n", "print('CV 정확도 점수: %s' % scores)\n", "print('CV 정확도: %.3f +/- %.3f' % (np.mean(scores), np.std(scores)))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "역자 노트 #####" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "CV 정확도 점수: [0.93478261 0.93478261 0.95652174 0.95652174 0.93478261 0.95555556\n", " 0.97777778 0.93333333 0.95555556 0.95555556]\n", "CV 정확도: 0.950 +/- 0.014\n" ] } ], "source": [ "from sklearn.model_selection import cross_validate\n", "\n", "scores = cross_validate(estimator=pipe_lr, \n", " X=X_train, \n", " y=y_train, \n", " scoring=['accuracy'], \n", " cv=10, \n", " n_jobs=-1,\n", " return_train_score=False)\n", "print('CV 정확도 점수: %s' % scores['test_accuracy'])\n", "print('CV 정확도: %.3f +/- %.3f' % (np.mean(scores['test_accuracy']), \n", " np.std(scores['test_accuracy'])))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#####" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 학습 곡선과 검증 곡선을 사용한 알고리즘 디버깅" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 학습 곡선으로 편향과 분산 문제 분석하기" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [], "source": [ "import matplotlib.pyplot as plt" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "image/png": "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7vLkpIqTiNC7d+8DKlFrglJK5Y0mJ5XrQP8/aIJSSilVkDRBKaUKgmXBX/4CN97ovFrWJzteQ0MDv/71rw9q39NPP52GhoZ9bvNf//VfPPfccwd1fNU52khCKdXjLAtOPRWWL4dwGEpLYdo0ePppcLsP7piZBPXlL3+5zbpUKoXH0/Hl74knnuhwXcYNN9xwcIH1oP197kKjJSilVN599aswa1bH0/jxsGQJhEJgjPO6ZImzvL3tTz89yFe/uu9zXnPNNbz77ruMHz+eb33rWyxdupQTTjiB+fPnc8wxxwDw2c9+lkmTJjF69Ghuv/327L6DBw9m586dbNq0iVGjRnH55ZczevRoTjnlFKLRKAAXX3wxDz/8cHb76667jokTJzJmzBjeeustAHbs2MHcuXMZPXo0l112GaNHj2bnzp1tYv3Sl77E5MmTGT16NNddd112+YoVKzjuuOMYN24cU6dOpampCcuy+OY3v0l9fT1jx47ll7/8ZYuYAVauXMmsWbMAuP7667nwwguZMWMGF154IZs2beKEE05g4sSJTJw4kX/+85/Z8/3kJz9hzJgxjBs3Lvv9nXDCCdn169evZ+LEifv+4rtQ8aRSpdQhKxQC2265zLad5b17H9wxf/zjH7N27VpWr14NwNKlS1m1ahVr167NNnO+8847qa6uJhqNMmXKFM4880x6tzrh+vXreeCBB7jjjjv4/Oc/zyOPPMIFF1zQ5nw1NTWsWrWKX//61yxcuJDf/e53/OAHP+Ckk07iO9/5Dk899RS///3v2431pptuorq6GsuymDNnDmvWrGHkyJGcc845PPjgg0yZMoXGxkaCwSC33347mzZtYvXq1Xg8Hnbv3v9g4+vWrePFF18kGAwSiUR49tlnCQQCrF+/ni984QusXLmSJ598kj//+c8sX76ckpISdu/eTXV1NRUVFaxevZrx48dz1113cckllxzoP8VB0wSllMq7W27Z9/q//AW+8AUnIWWUlcEvfwmf/nTb7Zuaogf1bM7UqVNbPINz66238uijjwLw4Ycfsn79+jYJqq6ujvHjxwMwadIkNm3a1O6xFyxYkN3mj3/8IwAvvvhi9vjz5s2jV69e7e67ePFibr/9dlKpFNu2bWPdunWICH379mXKlCkAVFRUAPDcc8/xxS9+MVtVV11dvd/PPX/+fILBIOA8QH3llVey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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "from sklearn.model_selection import learning_curve\n", "\n", "\n", "pipe_lr = make_pipeline(StandardScaler(),\n", " LogisticRegression(solver='liblinear', \n", " penalty='l2', \n", " random_state=1))\n", "\n", "train_sizes, train_scores, test_scores =\\\n", " learning_curve(estimator=pipe_lr,\n", " X=X_train,\n", " y=y_train,\n", " train_sizes=np.linspace(0.1, 1.0, 10),\n", " cv=10,\n", " n_jobs=1)\n", "\n", "train_mean = np.mean(train_scores, axis=1)\n", "train_std = np.std(train_scores, axis=1)\n", "test_mean = np.mean(test_scores, axis=1)\n", "test_std = np.std(test_scores, axis=1)\n", "\n", "plt.plot(train_sizes, train_mean,\n", " color='blue', marker='o',\n", " markersize=5, label='training accuracy')\n", "\n", "plt.fill_between(train_sizes,\n", " train_mean + train_std,\n", " train_mean - train_std,\n", " alpha=0.15, color='blue')\n", "\n", "plt.plot(train_sizes, test_mean,\n", " color='green', linestyle='--',\n", " marker='s', markersize=5,\n", " label='validation accuracy')\n", "\n", "plt.fill_between(train_sizes,\n", " test_mean + test_std,\n", " test_mean - test_std,\n", " alpha=0.15, color='green')\n", "\n", "plt.grid()\n", "plt.xlabel('Number of training samples')\n", "plt.ylabel('Accuracy')\n", "plt.legend(loc='lower right')\n", "plt.ylim([0.8, 1.03])\n", "plt.tight_layout()\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 검증 곡선으로 과대적합과 과소적합 조사하기" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "from sklearn.model_selection import validation_curve\n", "\n", "\n", "param_range = [0.001, 0.01, 0.1, 1.0, 10.0, 100.0]\n", "train_scores, test_scores = validation_curve(\n", " estimator=pipe_lr, \n", " X=X_train, \n", " y=y_train, \n", " param_name='logisticregression__C', \n", " param_range=param_range,\n", " cv=10)\n", "\n", "train_mean = np.mean(train_scores, axis=1)\n", "train_std = np.std(train_scores, axis=1)\n", "test_mean = np.mean(test_scores, axis=1)\n", "test_std = np.std(test_scores, axis=1)\n", "\n", "plt.plot(param_range, train_mean, \n", " color='blue', marker='o', \n", " markersize=5, label='training accuracy')\n", "\n", "plt.fill_between(param_range, train_mean + train_std,\n", " train_mean - train_std, alpha=0.15,\n", " color='blue')\n", "\n", "plt.plot(param_range, test_mean, \n", " color='green', linestyle='--', \n", " marker='s', markersize=5, \n", " label='validation accuracy')\n", "\n", "plt.fill_between(param_range, \n", " test_mean + test_std,\n", " test_mean - test_std, \n", " alpha=0.15, color='green')\n", "\n", "plt.grid()\n", "plt.xscale('log')\n", "plt.legend(loc='lower right')\n", "plt.xlabel('Parameter C')\n", "plt.ylabel('Accuracy')\n", "plt.ylim([0.8, 1.00])\n", "plt.tight_layout()\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 그리드 서치를 사용한 머신 러닝 모델 세부 튜닝" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 그리드 서치를 사용한 하이퍼파라미터 튜닝" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0.9846859903381642\n", "{'svc__C': 100.0, 'svc__gamma': 0.001, 'svc__kernel': 'rbf'}\n" ] } ], "source": [ "from sklearn.model_selection import GridSearchCV\n", "from sklearn.svm import SVC\n", "\n", "pipe_svc = make_pipeline(StandardScaler(),\n", " SVC(random_state=1))\n", "\n", "param_range = [0.0001, 0.001, 0.01, 0.1, 1.0, 10.0, 100.0, 1000.0]\n", "\n", "param_grid = [{'svc__C': param_range, \n", " 'svc__kernel': ['linear']},\n", " {'svc__C': param_range, \n", " 'svc__gamma': param_range, \n", " 'svc__kernel': ['rbf']}]\n", "\n", "gs = GridSearchCV(estimator=pipe_svc, \n", " param_grid=param_grid, \n", " scoring='accuracy', \n", " cv=10,\n", " n_jobs=-1)\n", "gs = gs.fit(X_train, y_train)\n", "print(gs.best_score_)\n", "print(gs.best_params_)" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "테스트 정확도: 0.974\n" ] } ], "source": [ "clf = gs.best_estimator_\n", "clf.fit(X_train, y_train)\n", "print('테스트 정확도: %.3f' % clf.score(X_test, y_test))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 중첩 교차 검증을 사용한 알고리즘 선택" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "CV 정확도: 0.974 +/- 0.015\n" ] } ], "source": [ "gs = GridSearchCV(estimator=pipe_svc,\n", " param_grid=param_grid,\n", " scoring='accuracy',\n", " cv=2)\n", "\n", "scores = cross_val_score(gs, X_train, y_train, \n", " scoring='accuracy', cv=5)\n", "print('CV 정확도: %.3f +/- %.3f' % (np.mean(scores),\n", " np.std(scores)))" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "CV 정확도: 0.934 +/- 0.016\n" ] } ], "source": [ "from sklearn.tree import DecisionTreeClassifier\n", "\n", "gs = GridSearchCV(estimator=DecisionTreeClassifier(random_state=0),\n", " param_grid=[{'max_depth': [1, 2, 3, 4, 5, 6, 7, None]}],\n", " scoring='accuracy',\n", " cv=2)\n", "\n", "scores = cross_val_score(gs, X_train, y_train, \n", " scoring='accuracy', cv=5)\n", "print('CV 정확도: %.3f +/- %.3f' % (np.mean(scores), \n", " np.std(scores)))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 다른 성능 평가 지표" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 오차 행렬" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[71 1]\n", " [ 2 40]]\n" ] } ], "source": [ "from sklearn.metrics import confusion_matrix\n", "\n", "pipe_svc.fit(X_train, y_train)\n", "y_pred = pipe_svc.predict(X_test)\n", "confmat = confusion_matrix(y_true=y_test, y_pred=y_pred)\n", "print(confmat)" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "fig, ax = plt.subplots(figsize=(2.5, 2.5))\n", "ax.matshow(confmat, cmap=plt.cm.Blues, alpha=0.3)\n", "for i in range(confmat.shape[0]):\n", " for j in range(confmat.shape[1]):\n", " ax.text(x=j, y=i, s=confmat[i, j], va='center', ha='center')\n", "\n", "plt.xlabel('Predicted label')\n", "plt.ylabel('True label')\n", "\n", "plt.tight_layout()\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 분류 모델의 정밀도와 재현율 최적화" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "정밀도: 0.976\n", "재현율: 0.952\n", "F1: 0.964\n" ] } ], "source": [ "from sklearn.metrics import precision_score, recall_score, f1_score\n", "\n", "print('정밀도: %.3f' % precision_score(y_true=y_test, y_pred=y_pred))\n", "print('재현율: %.3f' % recall_score(y_true=y_test, y_pred=y_pred))\n", "print('F1: %.3f' % f1_score(y_true=y_test, y_pred=y_pred))" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0.9861994953378878\n", "{'svc__C': 10.0, 'svc__gamma': 0.01, 'svc__kernel': 'rbf'}\n" ] } ], "source": [ "from sklearn.metrics import make_scorer\n", "\n", "scorer = make_scorer(f1_score, pos_label=0)\n", "\n", "c_gamma_range = [0.01, 0.1, 1.0, 10.0]\n", "\n", "param_grid = [{'svc__C': c_gamma_range,\n", " 'svc__kernel': ['linear']},\n", " {'svc__C': c_gamma_range,\n", " 'svc__gamma': c_gamma_range,\n", " 'svc__kernel': ['rbf']}]\n", "\n", "gs = GridSearchCV(estimator=pipe_svc,\n", " param_grid=param_grid,\n", " scoring=scorer,\n", " cv=10,\n", " n_jobs=-1)\n", "gs = gs.fit(X_train, y_train)\n", "print(gs.best_score_)\n", "print(gs.best_params_)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## ROC 곡선 그리기" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "from sklearn.metrics import roc_curve, auc\n", "from numpy import interp\n", "\n", "pipe_lr = make_pipeline(StandardScaler(),\n", " PCA(n_components=2),\n", " LogisticRegression(solver='liblinear',\n", " penalty='l2', \n", " random_state=1, \n", " C=100.0))\n", "\n", "X_train2 = X_train[:, [4, 14]]\n", " \n", "\n", "cv = list(StratifiedKFold(n_splits=3, shuffle=True,\n", " random_state=1).split(X_train, y_train))\n", "\n", "fig = plt.figure(figsize=(7, 5))\n", "\n", "mean_tpr = 0.0\n", "mean_fpr = np.linspace(0, 1, 100)\n", "all_tpr = []\n", "\n", "for i, (train, test) in enumerate(cv):\n", " probas = pipe_lr.fit(X_train2[train],\n", " y_train[train]).predict_proba(X_train2[test])\n", "\n", " fpr, tpr, thresholds = roc_curve(y_train[test],\n", " probas[:, 1],\n", " pos_label=1)\n", " mean_tpr += interp(mean_fpr, fpr, tpr)\n", " mean_tpr[0] = 0.0\n", " roc_auc = auc(fpr, tpr)\n", " plt.plot(fpr,\n", " tpr,\n", " label='ROC fold %d (area = %0.2f)'\n", " % (i+1, roc_auc))\n", "\n", "plt.plot([0, 1],\n", " [0, 1],\n", " linestyle='--',\n", " color=(0.6, 0.6, 0.6),\n", " label='random guessing')\n", "\n", "mean_tpr /= len(cv)\n", "mean_tpr[-1] = 1.0\n", "mean_auc = auc(mean_fpr, mean_tpr)\n", "plt.plot(mean_fpr, mean_tpr, 'k--',\n", " label='mean ROC (area = %0.2f)' % mean_auc, lw=2)\n", "plt.plot([0, 0, 1],\n", " [0, 1, 1],\n", " linestyle=':',\n", " color='black',\n", " label='perfect performance')\n", "\n", "plt.xlim([-0.05, 1.05])\n", "plt.ylim([-0.05, 1.05])\n", "plt.xlabel('false positive rate')\n", "plt.ylabel('true positive rate')\n", "plt.legend(loc=\"lower right\")\n", "\n", "plt.tight_layout()\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 다중 분류의 성능 지표" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [], "source": [ "pre_scorer = make_scorer(score_func=precision_score, \n", " pos_label=1, \n", " greater_is_better=True, \n", " average='micro')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 불균형한 클래스 다루기" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [], "source": [ "X_imb = np.vstack((X[y == 0], X[y == 1][:40]))\n", "y_imb = np.hstack((y[y == 0], y[y == 1][:40]))" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "89.92443324937027" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "y_pred = np.zeros(y_imb.shape[0])\n", "np.mean(y_pred == y_imb) * 100" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "샘플링하기 전의 클래스 1의 샘플 개수: 40\n", "샘플링한 후의 클래스 1의 샘플 개수: 357\n" ] } ], "source": [ "from sklearn.utils import resample\n", "\n", "print('샘플링하기 전의 클래스 1의 샘플 개수:', X_imb[y_imb == 1].shape[0])\n", "\n", "X_upsampled, y_upsampled = resample(X_imb[y_imb == 1],\n", " y_imb[y_imb == 1],\n", " replace=True,\n", " n_samples=X_imb[y_imb == 0].shape[0],\n", " random_state=123)\n", "\n", "print('샘플링한 후의 클래스 1의 샘플 개수:', X_upsampled.shape[0])" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [], "source": [ "X_bal = np.vstack((X[y == 0], X_upsampled))\n", "y_bal = np.hstack((y[y == 0], y_upsampled))" ] }, { "cell_type": "code", "execution_count": 29, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/plain": [ "50.0" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "y_pred = np.zeros(y_bal.shape[0])\n", "np.mean(y_pred == y_bal) * 100" ] } ], "metadata": { "anaconda-cloud": {}, "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.3" }, "toc": { "nav_menu": {}, "number_sections": true, "sideBar": true, "skip_h1_title": false, "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": 1 }