From 9539bfecb160d1581bfaa4ff5da22364f8d855b6 Mon Sep 17 00:00:00 2001 From: pmonormal Date: Thu, 11 Oct 2018 12:50:16 +0900 Subject: [PATCH] Update Frauud detection Kernel as Korean about 78% MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 2.2 케라스 신경망 파트를 마무리 하고 있습니다. --- .../Fraud detection analysis with NN.ipynb | 2407 +++++++++++++---- 1 file changed, 1823 insertions(+), 584 deletions(-) diff --git a/Korean/Fraud detection analysis with NN/Fraud detection analysis with NN.ipynb b/Korean/Fraud detection analysis with NN/Fraud detection analysis with NN.ipynb index 0addaef..ece030e 100644 --- a/Korean/Fraud detection analysis with NN/Fraud detection analysis with NN.ipynb +++ b/Korean/Fraud detection analysis with NN/Fraud detection analysis with NN.ipynb @@ -1975,27 +1975,27 @@ " \n", " \n", " \n", - " 143333\n", + " 16863\n", " 578.28934\n", " 0.0\n", " \n", " \n", - " 17480\n", + " 241254\n", " 578.28934\n", " 0.0\n", " \n", " \n", - " 6641\n", + " 76929\n", " 578.28934\n", " 0.0\n", " \n", " \n", - " 12369\n", + " 235634\n", " 578.28934\n", " 0.0\n", " \n", " \n", - " 87354\n", + " 23308\n", " 578.28934\n", " 0.0\n", " \n", @@ -2005,11 +2005,11 @@ ], "text/plain": [ " Fraud Normal\n", - "143333 578.28934 0.0\n", - "17480 578.28934 0.0\n", - "6641 578.28934 0.0\n", - "12369 578.28934 0.0\n", - "87354 578.28934 0.0" + "16863 578.28934 0.0\n", + "241254 578.28934 0.0\n", + "76929 578.28934 0.0\n", + "235634 578.28934 0.0\n", + "23308 578.28934 0.0" ] }, "execution_count": 30, @@ -2145,240 +2145,240 @@ " \n", " \n", " mean\n", - " 0.001775\n", - " 0.004433\n", - " 0.001241\n", - " -0.002806\n", - " -0.005931\n", - " -0.001400\n", - " -0.002919\n", - " 0.006406\n", - " -0.006651\n", - " -0.002855\n", - " 0.004204\n", - " -0.002575\n", - " 0.003172\n", - " 0.000578\n", - " -0.006489\n", - " -0.006705\n", - " -0.003444\n", - " -0.000166\n", - " 0.004815\n", - " -0.002209\n", - " -0.001280\n", - " -0.000847\n", - " 0.005033\n", - " -0.005521\n", - " 0.000037\n", - " -0.003663\n", - " -0.000076\n", - " 0.004578\n", - " 0.004613\n", - " 0.000661\n", - " -0.006340\n", + " -0.001224\n", + " -0.001042\n", + " -0.002830\n", + " -0.005544\n", + " 0.005997\n", + " 0.000293\n", + " 0.001331\n", + " -0.005805\n", + " -0.004224\n", + " 0.003585\n", + " -0.003315\n", + " 0.006343\n", + " 0.014670\n", + " -0.005487\n", + " 0.004601\n", + " -0.002224\n", + " -0.000504\n", + " -0.001790\n", + " -0.006839\n", + " 0.001810\n", + " -0.002665\n", + " -0.002930\n", + " 0.001825\n", + " 0.000312\n", + " 0.002653\n", + " -0.001334\n", + " 0.001097\n", + " 0.000116\n", + " 0.000894\n", + " 0.001173\n", + " -0.000229\n", " \n", " \n", " std\n", - " 1.001101\n", - " 0.994830\n", - " 0.996210\n", - " 0.986656\n", - " 0.997242\n", - " 0.977614\n", - " 0.990565\n", - " 0.969458\n", - " 1.003326\n", - " 1.001119\n", - " 0.994826\n", - " 0.993596\n", - " 0.989928\n", - " 1.002852\n", - " 0.998493\n", " 1.001920\n", - " 0.997151\n", - " 0.993978\n", - " 1.000924\n", - " 0.996003\n", - " 0.992029\n", - " 1.008943\n", - " 1.002597\n", - " 0.982256\n", - " 0.995826\n", - " 1.004384\n", - " 1.002220\n", - " 0.984900\n", - " 0.990007\n", - " 0.982990\n", - " 0.928776\n", + " 1.020089\n", + " 1.018808\n", + " 1.011348\n", + " 0.998416\n", + " 0.999303\n", + " 0.998207\n", + " 1.018658\n", + " 1.088381\n", + " 0.991733\n", + " 0.990113\n", + " 0.997706\n", + " 0.996597\n", + " 1.001690\n", + " 0.990480\n", + " 0.996792\n", + " 0.996392\n", + " 0.991946\n", + " 0.997001\n", + " 1.001586\n", + " 1.009827\n", + " 1.068501\n", + " 1.009975\n", + " 1.072639\n", + " 1.003264\n", + " 1.003527\n", + " 1.003375\n", + " 1.010746\n", + " 1.039948\n", + " 0.985931\n", + " 0.997525\n", " \n", " \n", " min\n", " -1.996369\n", - " -21.406457\n", - " -36.616183\n", - " -21.741294\n", - " -3.955598\n", - " -23.251009\n", - " -15.009219\n", - " -25.218244\n", - " -42.215404\n", - " -8.613050\n", - " -20.376630\n", - " -4.587901\n", - " -17.783345\n", - " -4.027674\n", - " -20.044245\n", - " -4.397796\n", - " -15.478720\n", - " -29.626400\n", - " -11.081002\n", - " -8.523283\n", + " -20.661780\n", + " -28.722479\n", + " -22.213271\n", + " -3.717201\n", + " -21.540062\n", + " -15.052954\n", + " -33.551864\n", + " -61.302416\n", + " -12.227994\n", + " -22.411893\n", + " -4.363472\n", + " -17.242432\n", + " -5.819382\n", + " -19.292570\n", + " -4.584886\n", + " -14.141290\n", + " -26.540290\n", + " -10.846039\n", + " -6.059567\n", " -29.624863\n", - " -31.162149\n", - " -13.089986\n", - " -36.151218\n", - " -4.566222\n", - " -13.584545\n", - " -5.401088\n", + " -47.418984\n", + " -12.246104\n", + " -58.716303\n", + " -4.584519\n", + " -16.683278\n", + " -3.847473\n", " -24.515479\n", - " -24.804228\n", + " -25.260665\n", " -0.353229\n", " -0.046062\n", " \n", " \n", " 25%\n", - " -0.860612\n", - " -0.462792\n", - " -0.359678\n", - " -0.591207\n", - " -0.601024\n", - " -0.506230\n", - " -0.580421\n", - " -0.444144\n", - " -0.176127\n", - " -0.589594\n", - " -0.490031\n", - " -0.745758\n", - " -0.406042\n", - " -0.655290\n", - " -0.451371\n", - " -0.643494\n", - " -0.540564\n", - " -0.571829\n", - " -0.589950\n", - " -0.563178\n", - " -0.274852\n", - " -0.310767\n", - " -0.747075\n", - " -0.258595\n", - " -0.588752\n", - " -0.612822\n", - " -0.679188\n", - " -0.174095\n", - " -0.159881\n", + " -0.858169\n", + " -0.470222\n", + " -0.358188\n", + " -0.589043\n", + " -0.592879\n", + " -0.497053\n", + " -0.575976\n", + " -0.445508\n", + " -0.175328\n", + " -0.575156\n", + " -0.487916\n", + " -0.740248\n", + " -0.391293\n", + " -0.656250\n", + " -0.439695\n", + " -0.634752\n", + " -0.535462\n", + " -0.571714\n", + " -0.596332\n", + " -0.557152\n", + " -0.272606\n", + " -0.309250\n", + " -0.744022\n", + " -0.257902\n", + " -0.579922\n", + " -0.605941\n", + " -0.679235\n", + " -0.175332\n", + " -0.159296\n", " -0.331279\n", " -0.046062\n", " \n", " \n", " 50%\n", - " -0.205438\n", - " 0.009624\n", - " 0.041337\n", - " 0.114507\n", - " -0.018562\n", - " -0.039359\n", - " -0.208009\n", - " 0.034818\n", - " 0.015724\n", - " -0.047991\n", - " -0.084941\n", - " -0.033111\n", - " 0.140522\n", - " -0.010926\n", - " 0.049060\n", - " 0.045656\n", - " 0.072575\n", - " -0.081757\n", - " -0.001062\n", - " -0.000870\n", - " -0.081319\n", - " -0.039553\n", - " 0.015440\n", - " -0.019763\n", - " 0.066587\n", - " 0.028921\n", - " -0.108500\n", - " 0.004913\n", - " 0.035269\n", - " -0.264951\n", + " -0.214577\n", + " 0.013992\n", + " 0.035383\n", + " 0.112973\n", + " -0.000758\n", + " -0.042363\n", + " -0.203824\n", + " 0.030520\n", + " 0.020143\n", + " -0.039460\n", + " -0.085708\n", + " -0.024836\n", + " 0.153613\n", + " -0.018689\n", + " 0.055610\n", + " 0.047554\n", + " 0.077496\n", + " -0.079770\n", + " -0.010362\n", + " 0.005983\n", + " -0.080698\n", + " -0.041409\n", + " 0.007294\n", + " -0.017332\n", + " 0.072023\n", + " 0.028636\n", + " -0.115717\n", + " 0.003963\n", + " 0.032194\n", + " -0.263912\n", " -0.046062\n", " \n", " \n", " 75%\n", - " 0.937963\n", - " 0.671790\n", - " 0.486854\n", - " 0.671008\n", - " 0.521349\n", - " 0.443249\n", - " 0.298778\n", - " 0.468235\n", - " 0.270448\n", - " 0.538766\n", - " 0.422601\n", - " 0.719480\n", - " 0.622925\n", - " 0.673880\n", - " 0.511166\n", - " 0.703773\n", - " 0.591952\n", - " 0.474241\n", - " 0.600049\n", - " 0.563023\n", - " 0.172138\n", - " 0.254958\n", - " 0.739301\n", - " 0.235829\n", - " 0.730778\n", - " 0.673369\n", - " 0.502075\n", - " 0.227578\n", - " 0.240531\n", - " -0.041379\n", + " 0.939522\n", + " 0.672490\n", + " 0.487033\n", + " 0.677709\n", + " 0.534019\n", + " 0.439335\n", + " 0.301598\n", + " 0.458236\n", + " 0.275742\n", + " 0.550495\n", + " 0.403495\n", + " 0.730971\n", + " 0.625753\n", + " 0.662847\n", + " 0.513317\n", + " 0.699394\n", + " 0.593329\n", + " 0.468597\n", + " 0.592829\n", + " 0.564164\n", + " 0.173084\n", + " 0.252904\n", + " 0.733052\n", + " 0.236988\n", + " 0.729891\n", + " 0.668831\n", + " 0.496408\n", + " 0.227238\n", + " 0.231837\n", + " -0.039260\n", " -0.046062\n", " \n", " \n", " max\n", - " 1.641507\n", - " 1.253349\n", - " 11.011647\n", - " 2.705162\n", - " 11.918722\n", - " 20.838790\n", - " 16.057594\n", - " 27.728845\n", - " 16.049132\n", - " 8.117551\n", - " 14.080677\n", - " 11.775017\n", - " 4.476496\n", - " 4.486616\n", - " 8.089541\n", - " 6.249731\n", - " 7.352670\n", - " 9.293592\n", - " 5.622204\n", - " 5.792269\n", - " 49.443471\n", + " 1.641929\n", + " 1.229413\n", + " 13.000116\n", + " 2.657487\n", + " 8.568820\n", + " 21.022418\n", + " 15.993545\n", + " 25.484930\n", + " 15.697933\n", + " 9.388014\n", + " 12.531076\n", + " 11.432405\n", + " 7.854665\n", + " 3.923102\n", + " 10.981446\n", + " 6.211952\n", + " 6.528161\n", + " 8.592238\n", + " 4.522099\n", + " 5.897892\n", + " 34.033648\n", " 37.034649\n", - " 9.988628\n", - " 27.700472\n", - " 6.628356\n", + " 14.473016\n", + " 30.430985\n", + " 6.642261\n", " 14.425293\n", - " 6.468519\n", - " 26.033296\n", + " 7.181774\n", + " 21.576490\n", " 68.528383\n", - " 75.250448\n", + " 51.265692\n", " 21.709793\n", " \n", " \n", @@ -2388,68 +2388,68 @@ "text/plain": [ " Time V1 V2 V3 V4 \\\n", "count 56961.000000 56961.000000 56961.000000 56961.000000 56961.000000 \n", - "mean 0.001775 0.004433 0.001241 -0.002806 -0.005931 \n", - "std 1.001101 0.994830 0.996210 0.986656 0.997242 \n", - "min -1.996369 -21.406457 -36.616183 -21.741294 -3.955598 \n", - "25% -0.860612 -0.462792 -0.359678 -0.591207 -0.601024 \n", - "50% -0.205438 0.009624 0.041337 0.114507 -0.018562 \n", - "75% 0.937963 0.671790 0.486854 0.671008 0.521349 \n", - "max 1.641507 1.253349 11.011647 2.705162 11.918722 \n", + "mean -0.001224 -0.001042 -0.002830 -0.005544 0.005997 \n", + "std 1.001920 1.020089 1.018808 1.011348 0.998416 \n", + "min -1.996369 -20.661780 -28.722479 -22.213271 -3.717201 \n", + "25% -0.858169 -0.470222 -0.358188 -0.589043 -0.592879 \n", + "50% -0.214577 0.013992 0.035383 0.112973 -0.000758 \n", + "75% 0.939522 0.672490 0.487033 0.677709 0.534019 \n", + "max 1.641929 1.229413 13.000116 2.657487 8.568820 \n", "\n", " V5 V6 V7 V8 V9 \\\n", "count 56961.000000 56961.000000 56961.000000 56961.000000 56961.000000 \n", - "mean -0.001400 -0.002919 0.006406 -0.006651 -0.002855 \n", - "std 0.977614 0.990565 0.969458 1.003326 1.001119 \n", - "min -23.251009 -15.009219 -25.218244 -42.215404 -8.613050 \n", - "25% -0.506230 -0.580421 -0.444144 -0.176127 -0.589594 \n", - "50% -0.039359 -0.208009 0.034818 0.015724 -0.047991 \n", - "75% 0.443249 0.298778 0.468235 0.270448 0.538766 \n", - "max 20.838790 16.057594 27.728845 16.049132 8.117551 \n", + "mean 0.000293 0.001331 -0.005805 -0.004224 0.003585 \n", + "std 0.999303 0.998207 1.018658 1.088381 0.991733 \n", + "min -21.540062 -15.052954 -33.551864 -61.302416 -12.227994 \n", + "25% -0.497053 -0.575976 -0.445508 -0.175328 -0.575156 \n", + "50% -0.042363 -0.203824 0.030520 0.020143 -0.039460 \n", + "75% 0.439335 0.301598 0.458236 0.275742 0.550495 \n", + "max 21.022418 15.993545 25.484930 15.697933 9.388014 \n", "\n", " V10 V11 V12 V13 V14 \\\n", "count 56961.000000 56961.000000 56961.000000 56961.000000 56961.000000 \n", - "mean 0.004204 -0.002575 0.003172 0.000578 -0.006489 \n", - "std 0.994826 0.993596 0.989928 1.002852 0.998493 \n", - "min -20.376630 -4.587901 -17.783345 -4.027674 -20.044245 \n", - "25% -0.490031 -0.745758 -0.406042 -0.655290 -0.451371 \n", - "50% -0.084941 -0.033111 0.140522 -0.010926 0.049060 \n", - "75% 0.422601 0.719480 0.622925 0.673880 0.511166 \n", - "max 14.080677 11.775017 4.476496 4.486616 8.089541 \n", + "mean -0.003315 0.006343 0.014670 -0.005487 0.004601 \n", + "std 0.990113 0.997706 0.996597 1.001690 0.990480 \n", + "min -22.411893 -4.363472 -17.242432 -5.819382 -19.292570 \n", + "25% -0.487916 -0.740248 -0.391293 -0.656250 -0.439695 \n", + "50% -0.085708 -0.024836 0.153613 -0.018689 0.055610 \n", + "75% 0.403495 0.730971 0.625753 0.662847 0.513317 \n", + "max 12.531076 11.432405 7.854665 3.923102 10.981446 \n", "\n", " V15 V16 V17 V18 V19 \\\n", "count 56961.000000 56961.000000 56961.000000 56961.000000 56961.000000 \n", - "mean -0.006705 -0.003444 -0.000166 0.004815 -0.002209 \n", - "std 1.001920 0.997151 0.993978 1.000924 0.996003 \n", - "min -4.397796 -15.478720 -29.626400 -11.081002 -8.523283 \n", - "25% -0.643494 -0.540564 -0.571829 -0.589950 -0.563178 \n", - "50% 0.045656 0.072575 -0.081757 -0.001062 -0.000870 \n", - "75% 0.703773 0.591952 0.474241 0.600049 0.563023 \n", - "max 6.249731 7.352670 9.293592 5.622204 5.792269 \n", + "mean -0.002224 -0.000504 -0.001790 -0.006839 0.001810 \n", + "std 0.996792 0.996392 0.991946 0.997001 1.001586 \n", + "min -4.584886 -14.141290 -26.540290 -10.846039 -6.059567 \n", + "25% -0.634752 -0.535462 -0.571714 -0.596332 -0.557152 \n", + "50% 0.047554 0.077496 -0.079770 -0.010362 0.005983 \n", + "75% 0.699394 0.593329 0.468597 0.592829 0.564164 \n", + "max 6.211952 6.528161 8.592238 4.522099 5.897892 \n", "\n", " V20 V21 V22 V23 V24 \\\n", "count 56961.000000 56961.000000 56961.000000 56961.000000 56961.000000 \n", - "mean -0.001280 -0.000847 0.005033 -0.005521 0.000037 \n", - "std 0.992029 1.008943 1.002597 0.982256 0.995826 \n", - "min -29.624863 -31.162149 -13.089986 -36.151218 -4.566222 \n", - "25% -0.274852 -0.310767 -0.747075 -0.258595 -0.588752 \n", - "50% -0.081319 -0.039553 0.015440 -0.019763 0.066587 \n", - "75% 0.172138 0.254958 0.739301 0.235829 0.730778 \n", - "max 49.443471 37.034649 9.988628 27.700472 6.628356 \n", + "mean -0.002665 -0.002930 0.001825 0.000312 0.002653 \n", + "std 1.009827 1.068501 1.009975 1.072639 1.003264 \n", + "min -29.624863 -47.418984 -12.246104 -58.716303 -4.584519 \n", + "25% -0.272606 -0.309250 -0.744022 -0.257902 -0.579922 \n", + "50% -0.080698 -0.041409 0.007294 -0.017332 0.072023 \n", + "75% 0.173084 0.252904 0.733052 0.236988 0.729891 \n", + "max 34.033648 37.034649 14.473016 30.430985 6.642261 \n", "\n", " V25 V26 V27 V28 Amount \\\n", "count 56961.000000 56961.000000 56961.000000 56961.000000 56961.000000 \n", - "mean -0.003663 -0.000076 0.004578 0.004613 0.000661 \n", - "std 1.004384 1.002220 0.984900 0.990007 0.982990 \n", - "min -13.584545 -5.401088 -24.515479 -24.804228 -0.353229 \n", - "25% -0.612822 -0.679188 -0.174095 -0.159881 -0.331279 \n", - "50% 0.028921 -0.108500 0.004913 0.035269 -0.264951 \n", - "75% 0.673369 0.502075 0.227578 0.240531 -0.041379 \n", - "max 14.425293 6.468519 26.033296 68.528383 75.250448 \n", + "mean -0.001334 0.001097 0.000116 0.000894 0.001173 \n", + "std 1.003527 1.003375 1.010746 1.039948 0.985931 \n", + "min -16.683278 -3.847473 -24.515479 -25.260665 -0.353229 \n", + "25% -0.605941 -0.679235 -0.175332 -0.159296 -0.331279 \n", + "50% 0.028636 -0.115717 0.003963 0.032194 -0.263912 \n", + "75% 0.668831 0.496408 0.227238 0.231837 -0.039260 \n", + "max 14.425293 7.181774 21.576490 68.528383 51.265692 \n", "\n", " Amount_max_fraud \n", "count 56961.000000 \n", - "mean -0.006340 \n", - "std 0.928776 \n", + "mean -0.000229 \n", + "std 0.997525 \n", "min -0.046062 \n", "25% -0.046062 \n", "50% -0.046062 \n", @@ -2645,7 +2645,7 @@ }, { "cell_type": "code", - "execution_count": 40, + "execution_count": 39, "metadata": { "_cell_guid": "3f0b796a-8454-4cc9-b5ec-3075b9565bc3", "_uuid": "825805efc899b013c6bf7eaebdf10a68aee89d1a", @@ -2656,27 +2656,27 @@ "name": "stdout", "output_type": "stream", "text": [ - "Epoch: 0 Acc = 0.93682 Cost = 72292.81250 Valid_Acc = 0.93725 Valid_Cost = 8597.14648\n", - "Epoch: 5 Acc = 0.93256 Cost = 59755.20703 Valid_Acc = 0.93174 Valid_Cost = 7915.83301\n", - "Epoch: 10 Acc = 0.93574 Cost = 53739.06250 Valid_Acc = 0.93490 Valid_Cost = 7608.52051\n", - "Epoch: 15 Acc = 0.95158 Cost = 42080.82031 Valid_Acc = 0.95004 Valid_Cost = 7097.75000\n", - "Epoch: 20 Acc = 0.96637 Cost = 31364.65234 Valid_Acc = 0.96545 Valid_Cost = 6864.34570\n", - "Epoch: 25 Acc = 0.98125 Cost = 21488.47266 Valid_Acc = 0.97978 Valid_Cost = 7460.70605\n", - "Epoch: 30 Acc = 0.98849 Cost = 14415.88770 Valid_Acc = 0.98785 Valid_Cost = 8910.00977\n", - "Epoch: 35 Acc = 0.98893 Cost = 13119.75000 Valid_Acc = 0.98820 Valid_Cost = 11685.54688\n", - "Epoch: 40 Acc = 0.98359 Cost = 12100.78711 Valid_Acc = 0.98227 Valid_Cost = 11338.14648\n", - "Epoch: 45 Acc = 0.98684 Cost = 10194.38477 Valid_Acc = 0.98617 Valid_Cost = 12333.08691\n", - "Epoch: 50 Acc = 0.95153 Cost = 30340.25000 Valid_Acc = 0.94993 Valid_Cost = 12908.94727\n", - "Epoch: 55 Acc = 0.99233 Cost = 6217.56738 Valid_Acc = 0.99122 Valid_Cost = 18185.65234\n", - "Epoch: 60 Acc = 0.98603 Cost = 10973.65039 Valid_Acc = 0.98490 Valid_Cost = 22597.33984\n", - "Epoch: 65 Acc = 0.99398 Cost = 5309.19678 Valid_Acc = 0.99333 Valid_Cost = 24412.04297\n", - "Epoch: 70 Acc = 0.99533 Cost = 4424.54004 Valid_Acc = 0.99438 Valid_Cost = 33113.28516\n", - "Epoch: 75 Acc = 0.98873 Cost = 9013.62500 Valid_Acc = 0.98718 Valid_Cost = 20797.70117\n", - "Epoch: 80 Acc = 0.99629 Cost = 3814.94922 Valid_Acc = 0.99551 Valid_Cost = 32202.07227\n", - "Epoch: 85 Acc = 0.99641 Cost = 3504.27686 Valid_Acc = 0.99547 Valid_Cost = 39097.82812\n", - "Epoch: 90 Acc = 0.99131 Cost = 6182.81982 Valid_Acc = 0.98978 Valid_Cost = 30556.54883\n", - "Epoch: 95 Acc = 0.97816 Cost = 17193.08203 Valid_Acc = 0.97647 Valid_Cost = 24212.60938\n", - "Epoch: 100 Acc = 0.99717 Cost = 2946.98804 Valid_Acc = 0.99614 Valid_Cost = 41408.02344\n", + "Epoch: 0 Acc = 0.98030 Cost = 70089.28125 Valid_Acc = 0.98034 Valid_Cost = 15254.80078\n", + "Epoch: 5 Acc = 0.98767 Cost = 58580.29297 Valid_Acc = 0.98750 Valid_Cost = 14394.41895\n", + "Epoch: 10 Acc = 0.98854 Cost = 48541.71875 Valid_Acc = 0.98883 Valid_Cost = 14806.13574\n", + "Epoch: 15 Acc = 0.98865 Cost = 39388.20703 Valid_Acc = 0.98894 Valid_Cost = 16517.65625\n", + "Epoch: 20 Acc = 0.99094 Cost = 31618.80859 Valid_Acc = 0.99122 Valid_Cost = 20146.30859\n", + "Epoch: 25 Acc = 0.99130 Cost = 22800.29883 Valid_Acc = 0.99136 Valid_Cost = 24841.26758\n", + "Epoch: 30 Acc = 0.99118 Cost = 18227.08789 Valid_Acc = 0.99143 Valid_Cost = 28714.44141\n", + "Epoch: 35 Acc = 0.99246 Cost = 11901.30176 Valid_Acc = 0.99305 Valid_Cost = 36806.41406\n", + "Epoch: 40 Acc = 0.99238 Cost = 14242.89941 Valid_Acc = 0.99238 Valid_Cost = 45021.91797\n", + "Epoch: 45 Acc = 0.99631 Cost = 9457.01465 Valid_Acc = 0.99586 Valid_Cost = 56201.80469\n", + "Epoch: 50 Acc = 0.99604 Cost = 10883.57422 Valid_Acc = 0.99582 Valid_Cost = 58257.39453\n", + "Epoch: 55 Acc = 0.99695 Cost = 6030.76562 Valid_Acc = 0.99666 Valid_Cost = 62535.69531\n", + "Epoch: 60 Acc = 0.99780 Cost = 6262.52979 Valid_Acc = 0.99758 Valid_Cost = 74222.21094\n", + "Epoch: 65 Acc = 0.99716 Cost = 4710.59668 Valid_Acc = 0.99673 Valid_Cost = 65601.07031\n", + "Epoch: 70 Acc = 0.99813 Cost = 4759.97021 Valid_Acc = 0.99726 Valid_Cost = 75777.33594\n", + "Epoch: 75 Acc = 0.99081 Cost = 6893.59326 Valid_Acc = 0.99119 Valid_Cost = 59490.25781\n", + "Epoch: 80 Acc = 0.99744 Cost = 2822.39600 Valid_Acc = 0.99695 Valid_Cost = 82329.80469\n", + "Epoch: 85 Acc = 0.99785 Cost = 2602.71289 Valid_Acc = 0.99740 Valid_Cost = 94100.67969\n", + "Epoch: 90 Acc = 0.99610 Cost = 3647.93262 Valid_Acc = 0.99582 Valid_Cost = 75909.85156\n", + "Epoch: 95 Acc = 0.99828 Cost = 3060.12622 Valid_Acc = 0.99775 Valid_Cost = 99243.14844\n", + "Epoch: 100 Acc = 0.99632 Cost = 3478.99805 Valid_Acc = 0.99558 Valid_Cost = 93043.17969\n", "\n", "Optimization Finished!\n", "\n", @@ -2761,7 +2761,7 @@ }, { "cell_type": "code", - "execution_count": 41, + "execution_count": 40, "metadata": { "_cell_guid": "c04813ad-3bbb-45c5-8098-06a78605d7b2", "_uuid": "2cc553c14ddcfcee1e3f833238da31fa18688c1e" @@ -2769,7 +2769,7 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -2807,7 +2807,7 @@ }, { "cell_type": "code", - "execution_count": 42, + "execution_count": 41, "metadata": { "_cell_guid": "362ce01d-2582-47ea-9c04-3f2eb71dd87b", "_uuid": "a37daaf1fe266f2ee7840d08b9406bfa1b9ee841" @@ -2818,7 +2818,7 @@ "output_type": "stream", "text": [ "INFO:tensorflow:Restoring parameters from ./model/model.ckpt\n", - "Testing Accuracy = 0.9968049\n" + "Testing Accuracy = 0.9961027\n" ] } ], @@ -2841,27 +2841,29 @@ }, { "cell_type": "markdown", - "metadata": { - "_cell_guid": "32e42917-d3a8-4c4d-8eba-e21aeb743b70", - "_uuid": "09dbb6a1dbb178b242f9f2834f8deb390590c0f1" - }, + "metadata": {}, "source": [ - "## 2.2 Train Neural Net with Keras\n", + "## 2.2 Keras 신경망 학습\n", "\n", - "Below I am implementing a similar NN with Keras starting from the original dataset and based on the understanding in EDA above.\n", - "Keras is high level framework (i.e. simpler codes) that actually runs on Tensorflow.\n", - "We shall evaluate NN model accuracy with Keras" + "아래의 코드는 원본 데이터와 EDA 이해를 바탕으로 Keras를 사용한 신경망(NN)입니다. Keras는 Tensorflow로 구성된 High Level 프레임워크입니다. (Higl Level 프레임워크는 코드를 간결하게 만들어, 코드 이해를 쉽게 만듭니다.) Keras로 신경망(NN) 모델의 정확도를 계산해 보겠습니다." ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 42, "metadata": { "_cell_guid": "83d06e55-189a-4acb-bb42-934accebec99", - "_uuid": "6918fa3e8198317d3b4e706e01366831ecc86c1e", - "collapsed": true + "_uuid": "6918fa3e8198317d3b4e706e01366831ecc86c1e" }, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Using TensorFlow backend.\n" + ] + } + ], "source": [ "import itertools\n", "from keras.models import Sequential\n", @@ -2871,317 +2873,1556 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 43, "metadata": { "_cell_guid": "0e090edc-f544-41b6-8035-bf61c9e86205", - "_uuid": "d0bdc4d26b0a9f23c9ed7df460d57e2f489ef164", - "collapsed": true + "_uuid": "d0bdc4d26b0a9f23c9ed7df460d57e2f489ef164" }, "outputs": [], "source": [ - "data = pd.read_csv(\"../input/creditcard.csv\")" + "data = pd.read_csv(\"./input/creditcard.csv\")" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 44, "metadata": { "_cell_guid": "5748a40a-3665-4ae6-8b21-36b0dedc2f83", - "_uuid": "d800b296c079bf6e11d874cd482058c7fe9db931", - "collapsed": true - }, - "outputs": [], - "source": [ - "#data['Normal']=1-data['Class'], instead I am converting Class to categorical\n", - "data['Amount_max_fraud'] = 1\n", - "data.loc[data.Amount <= 2125.87, 'Amount_max_fraud'] = 0\n", - "data.head()" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "_cell_guid": "fd799d34-4e12-4fff-8b0b-2f1006722544", - "_uuid": "dd4cc5fcc249a2d2cc7324ed68e377accdc4fd3e" - }, - "source": [ - "**Stratify Class column** in train -test split to keep the same Fraud/Normal ratio in train and test data.\n", - "I am not using any validation dataset here." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "_cell_guid": "b2967228-de84-4f0a-b1bb-502d3d45c28d", - "_uuid": "87e7f5a83c48a98ae52cc55cf805cdf9a57d8426", - "collapsed": true - }, - "outputs": [], - "source": [ - "train,test=train_test_split(data,test_size=0.2,random_state=0,stratify=data['Class'])# stratify the Class" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "_cell_guid": "0c2923f1-59a3-45b5-ab73-1ffc250ddf40", - "_uuid": "0c430eecba7217f93d1ea970249fbbe85cd5f137", - "collapsed": true - }, - "outputs": [], - "source": [ - "count_train = pd.value_counts(train['Class'], sort = True).sort_index()\n", - "count_test = pd.value_counts(test['Class'], sort = True).sort_index()\n", - "print (count_train) \n", - "'\\n' \n", - "print(count_test)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "_cell_guid": "21f6399e-0394-4d33-a7f8-798cd3d6dbd6", - "_uuid": "2409d161a9e8233a31e82f81b4cc59d9530c3bc6" - }, - "source": [ - "Drop target columns from model input datsets" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "_cell_guid": "78dcafd6-c7e5-4396-b4f4-cba7ae30de9f", - "_uuid": "e9eb5647ea9a1daf4f91f4577f3d4d0e8064f096", - "collapsed": true - }, - "outputs": [], - "source": [ - "X_train = train.drop(['Class'], axis = 1)\n", - "X_test = test.drop(['Class'], axis = 1)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "_cell_guid": "134879e1-a328-4be0-87ac-a1e5bebc9f6f", - "_uuid": "ccc85f3af1d26a61bd3844d0a26110ba341a3572" - }, - "source": [ - "Define target sets:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "_cell_guid": "952ab8e5-cccd-4188-8690-c33e405545d4", - "_uuid": "7ae50c4c16bf36e9b001f658909116004a86aed3", - "collapsed": true - }, - "outputs": [], - "source": [ - "Y_train = train.loc[:, ['Class']]\n", - "Y_test = test.loc[:, ['Class']]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "_cell_guid": "5c03b27c-581a-452b-86dd-ae4ce2b37877", - "_uuid": "92cce9a63827d1a9e11bc143b46f605f3879eeae", - "collapsed": true - }, - "outputs": [], - "source": [ - "# Just sanity check\n", - "print(np.shape(X_train))\n", - "print(np.shape(Y_train))\n", - "print(np.shape(X_test))\n", - "print(np.shape(Y_test))" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "_cell_guid": "51e117b1-cc6f-4855-b0b9-e716f933d3c4", - "_uuid": "a784732de39c7687270cfaa734a6f77942132443" - }, - "source": [ - "Now convert Y_train and Y_test to categorical values with 2 classes." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "_cell_guid": "94bb1a46-193f-47fd-bf1f-f0e917492298", - "_uuid": "add388ac1620f9fb2eb1850b35a81411c30055a6", - "collapsed": true - }, - "outputs": [], - "source": [ - "Y_train = to_categorical(Y_train, num_classes = 2)\n", - "Y_test = to_categorical(Y_test, num_classes = 2)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "_cell_guid": "cb55954d-4632-4f06-9d0c-a81e560f9b7f", - "_uuid": "078fca56926f75046c3b3e8d4b0e8d19a42b0508" - }, - "source": [ - "Centering and scaling of input datasets" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "_cell_guid": "9136cfd3-7e69-4fdf-a658-d0677cb32e26", - "_uuid": "94754afc163a673cfc20a64ae01032d0b6e60454", - "collapsed": true - }, - "outputs": [], - "source": [ - "#Names of all of the features in X_train.\n", - "features = X_train.columns.values\n", - "\n", - "for feature in features:\n", - " mean, std = data[feature].mean(), data[feature].std()\n", - " X_train.loc[:, feature] = (X_train[feature] - mean) / std\n", - " X_test.loc[:, feature] = (X_test[feature] - mean) / std" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "_cell_guid": "77bce954-a51b-486c-9f6d-df2510b69c47", - "_uuid": "1ee9f2cf77a99b1fbf99cbe70e2ba61595c5bc08", - "collapsed": true - }, - "source": [ - "Now we start Keras model building" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "_cell_guid": "6c0f7416-412a-4415-94e8-362fa13948ea", - "_uuid": "9c648e3b03efea588dea1d20893bf148151447f7", - "collapsed": true - }, - "outputs": [], - "source": [ - "# fix random seed for reproducibility\n", - "np.random.seed(2)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "_cell_guid": "92b9a9f3-a529-4ce1-8882-be4c26bac2a5", - "_uuid": "4adc5dc848bd35cd6cc78cae6e5a2d21c2ab750d" - }, - "source": [ - "Set up a 5 layer network with last layer being the output layer.\n", - "First layer has input dimention as 31 (number of columns in X_train).\n", - "Activation is relu except last layer is with softmax activation\n", - "Each layer has dropout at 0.9 (90% of data used at each layer)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "_cell_guid": "bbf4cf25-3052-4b8f-9ac7-700865de4905", - "_uuid": "cf449dc135ffd673be7ef9b800df733c6c48831d", - "collapsed": true - }, - "outputs": [], - "source": [ - "model = Sequential()\n", - "model.add(Dense(64, input_dim=31, activation='relu'))\n", - "model.add(Dropout(0.9))\n", - "model.add(Dense(64, activation='relu'))\n", - "model.add(Dropout(0.9))\n", - "model.add(Dense(64, activation='relu'))\n", - "model.add(Dropout(0.9))\n", - "model.add(Dense(64, activation='relu'))\n", - "model.add(Dropout(0.9))\n", - "model.add(Dense(2, activation='softmax')) # With 2 outputs" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "_cell_guid": "f05652b6-31d8-4da9-a9e9-9bd5d9a8df5a", - "_uuid": "348f00981f35f87c22ccdac414d86de99f3ac0a1" - }, - "source": [ - "Compile model using binary crossentropy loss and adam optimizer for loss.\n", - "Collect accuracy in metric." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "_cell_guid": "2dec00ca-e47c-4142-89bc-e7a445314ebc", - "_uuid": "086c950d76895f638b313701200a144fdf3851b6", - "collapsed": true - }, - "outputs": [], - "source": [ - "model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "_cell_guid": "88ca1b60-db7e-4994-8c2c-88c788538033", - "_uuid": "c708ccee01d5faa3935c01742603e2d9870c968f" + "_uuid": "d800b296c079bf6e11d874cd482058c7fe9db931" }, - "source": [ - "Fit the compiled model on training data.\n", - "I am using only 10 epochs to save time with batch_size of 2048." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "_cell_guid": "bbbd50fb-41e8-4f71-b497-f8e19038dad0", - "_uuid": "239658b1175b942a7aa179f8ae8b71dccbcb8f6d", - "collapsed": true - }, - "outputs": [], - "source": [ - "epoch = 10\n", - "batch_size = 2048\n", - "model.fit(X_train, Y_train, epochs=epoch, batch_size=batch_size)" - ] + "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", + "
TimeV1V2V3V4V5V6V7V8V9V10V11V12V13V14V15V16V17V18V19V20V21V22V23V24V25V26V27V28AmountClassAmount_max_fraud
00.0-1.359807-0.0727812.5363471.378155-0.3383210.4623880.2395990.0986980.3637870.090794-0.551600-0.617801-0.991390-0.3111691.468177-0.4704010.2079710.0257910.4039930.251412-0.0183070.277838-0.1104740.0669280.128539-0.1891150.133558-0.021053149.6200
10.01.1918570.2661510.1664800.4481540.060018-0.082361-0.0788030.085102-0.255425-0.1669741.6127271.0652350.489095-0.1437720.6355580.463917-0.114805-0.183361-0.145783-0.069083-0.225775-0.6386720.101288-0.3398460.1671700.125895-0.0089830.0147242.6900
21.0-1.358354-1.3401631.7732090.379780-0.5031981.8004990.7914610.247676-1.5146540.2076430.6245010.0660840.717293-0.1659462.345865-2.8900831.109969-0.121359-2.2618570.5249800.2479980.7716790.909412-0.689281-0.327642-0.139097-0.055353-0.059752378.6600
31.0-0.966272-0.1852261.792993-0.863291-0.0103091.2472030.2376090.377436-1.387024-0.054952-0.2264870.1782280.507757-0.287924-0.631418-1.059647-0.6840931.965775-1.232622-0.208038-0.1083000.005274-0.190321-1.1755750.647376-0.2219290.0627230.061458123.5000
42.0-1.1582330.8777371.5487180.403034-0.4071930.0959210.592941-0.2705330.8177390.753074-0.8228430.5381961.345852-1.1196700.175121-0.451449-0.237033-0.0381950.8034870.408542-0.0094310.798278-0.1374580.141267-0.2060100.5022920.2194220.21515369.9900
\n", + "
" + ], + "text/plain": [ + " Time V1 V2 V3 V4 V5 V6 V7 \\\n", + "0 0.0 -1.359807 -0.072781 2.536347 1.378155 -0.338321 0.462388 0.239599 \n", + "1 0.0 1.191857 0.266151 0.166480 0.448154 0.060018 -0.082361 -0.078803 \n", + "2 1.0 -1.358354 -1.340163 1.773209 0.379780 -0.503198 1.800499 0.791461 \n", + "3 1.0 -0.966272 -0.185226 1.792993 -0.863291 -0.010309 1.247203 0.237609 \n", + "4 2.0 -1.158233 0.877737 1.548718 0.403034 -0.407193 0.095921 0.592941 \n", + "\n", + " V8 V9 V10 V11 V12 V13 V14 \\\n", + "0 0.098698 0.363787 0.090794 -0.551600 -0.617801 -0.991390 -0.311169 \n", + "1 0.085102 -0.255425 -0.166974 1.612727 1.065235 0.489095 -0.143772 \n", + "2 0.247676 -1.514654 0.207643 0.624501 0.066084 0.717293 -0.165946 \n", + "3 0.377436 -1.387024 -0.054952 -0.226487 0.178228 0.507757 -0.287924 \n", + "4 -0.270533 0.817739 0.753074 -0.822843 0.538196 1.345852 -1.119670 \n", + "\n", + " V15 V16 V17 V18 V19 V20 V21 \\\n", + "0 1.468177 -0.470401 0.207971 0.025791 0.403993 0.251412 -0.018307 \n", + "1 0.635558 0.463917 -0.114805 -0.183361 -0.145783 -0.069083 -0.225775 \n", + "2 2.345865 -2.890083 1.109969 -0.121359 -2.261857 0.524980 0.247998 \n", + "3 -0.631418 -1.059647 -0.684093 1.965775 -1.232622 -0.208038 -0.108300 \n", + "4 0.175121 -0.451449 -0.237033 -0.038195 0.803487 0.408542 -0.009431 \n", + "\n", + " V22 V23 V24 V25 V26 V27 V28 \\\n", + "0 0.277838 -0.110474 0.066928 0.128539 -0.189115 0.133558 -0.021053 \n", + "1 -0.638672 0.101288 -0.339846 0.167170 0.125895 -0.008983 0.014724 \n", + "2 0.771679 0.909412 -0.689281 -0.327642 -0.139097 -0.055353 -0.059752 \n", + "3 0.005274 -0.190321 -1.175575 0.647376 -0.221929 0.062723 0.061458 \n", + "4 0.798278 -0.137458 0.141267 -0.206010 0.502292 0.219422 0.215153 \n", + "\n", + " Amount Class Amount_max_fraud \n", + "0 149.62 0 0 \n", + "1 2.69 0 0 \n", + "2 378.66 0 0 \n", + "3 123.50 0 0 \n", + "4 69.99 0 0 " + ] + }, + "execution_count": 44, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "#data['Normal']=1-data['Class'], instead I am converting Class to categorical\n", + "data['Amount_max_fraud'] = 1\n", + "data.loc[data.Amount <= 2125.87, 'Amount_max_fraud'] = 0\n", + "data.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Train-Test 데이터를 나눌 때, 사기/보통 거래의 비율을 같게하기 위해 **Class 칼럼을 계층화(Stratify)**합니다. 여기에선 Validation 셋을 쓰지 않겠습니다." + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "metadata": { + "_cell_guid": "b2967228-de84-4f0a-b1bb-502d3d45c28d", + "_uuid": "87e7f5a83c48a98ae52cc55cf805cdf9a57d8426" + }, + "outputs": [], + "source": [ + "train,test=train_test_split(data,test_size=0.2,random_state=0,stratify=data['Class'])# stratify the Class" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "metadata": { + "_cell_guid": "0c2923f1-59a3-45b5-ab73-1ffc250ddf40", + "_uuid": "0c430eecba7217f93d1ea970249fbbe85cd5f137", + "scrolled": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0 227451\n", + "1 394\n", + "Name: Class, dtype: int64\n", + "0 56864\n", + "1 98\n", + "Name: Class, dtype: int64\n" + ] + } + ], + "source": [ + "count_train = pd.value_counts(train['Class'], sort = True).sort_index()\n", + "count_test = pd.value_counts(test['Class'], sort = True).sort_index()\n", + "print(count_train) \n", + "print(count_test)" + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.001729245759178389\n", + "0.0017204452090867595\n" + ] + } + ], + "source": [ + "print(count_train[1] / (count_train[0] + count_train[1])) # Fraud/Nomal Ratio\n", + "print(count_test[1] / (count_test[0] + count_test[1])) # Fraud/Nomal Ratio" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "타겟 칼럼(Class)를 입력 데이터셋에서 삭제(Drop)합니다." + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "metadata": { + "_cell_guid": "78dcafd6-c7e5-4396-b4f4-cba7ae30de9f", + "_uuid": "e9eb5647ea9a1daf4f91f4577f3d4d0e8064f096" + }, + "outputs": [], + "source": [ + "X_train = train.drop(['Class'], axis = 1)\n", + "X_test = test.drop(['Class'], axis = 1)" + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
TimeV1V2V3V4V5V6V7V8V9V10V11V12V13V14V15V16V17V18V19V20V21V22V23V24V25V26V27V28AmountAmount_max_fraud
3600138355.01.0439490.3185551.0458102.805989-0.561113-0.3679560.032736-0.042333-0.3226740.499167-0.5726650.346009-0.047407-0.098964-0.6632840.181411-0.124345-0.790453-0.720944-0.084556-0.240105-0.6803150.0853280.6848120.318620-0.2049630.0016620.03789449.670
1284422555.0-1.6651590.8084401.8056271.903416-0.8216270.934790-0.8248020.9758901.747469-0.6587511.281502-1.4300870.3720281.403024-2.739413-1.3317661.964590-0.2056391.325588-0.373759-0.335332-0.5109940.0358390.147565-0.529358-0.566950-0.595998-0.22008616.940
28732431.0-0.3240960.6018360.865329-2.1380000.294663-1.2515531.072114-0.3348961.071268-1.109522-1.016020-0.654945-1.4734700.3173451.067491-0.372642-0.6747250.3698410.095583-0.0398680.0122200.352856-0.341505-0.1457910.094194-0.8040260.229428-0.0216231.000
14526386773.0-0.2582701.217501-0.585348-0.8753471.222481-0.3110271.073860-0.1614080.2006650.1543070.8826730.5478900.269484-1.253302-0.8839630.495221-0.1532120.2967100.1361480.382305-0.424626-0.7811580.0193160.178614-0.3156160.0966650.269740-0.02063510.780
186658127202.02.142162-0.494988-1.936511-0.818288-0.025213-1.027245-0.151627-0.305750-0.8694820.4287291.1366660.2734760.697123-1.222134-0.9388201.2981490.912921-0.7937211.0649840.1065920.0101150.0217220.079463-0.4808990.023846-0.279076-0.030121-0.04388839.960
3427137590.0-6.3416671.192815-3.686579-2.754006-5.0071643.9881181.693606-13.5775222.557965-0.931438-1.1893330.762725-0.5178570.067279-0.0994980.837768-0.156679-0.402600-0.238742-7.1713429.779321-3.660198-1.507217-0.1791850.002092-0.0191683.611243-0.8944941437.080
7678256739.0-0.4639280.2047452.7957341.546200-0.7203741.108212-0.5811330.5440751.099843-0.653523-1.4208380.427211-0.436201-1.055012-1.225903-1.1792680.846734-0.3745020.623190-0.0523930.0944310.788161-0.1003440.126248-0.461584-0.2009850.2801680.18004611.100
1169912.0-1.3946190.554224-0.617805-0.3137062.1574133.537534-0.5673051.380888-0.1122910.107269-0.6377280.099510-0.0625330.2548240.318805-0.3352450.0528700.0487831.6546990.336595-0.196300-0.546172-0.1247581.046780-0.0894740.3636740.2156920.22569824.080
282674171058.0-2.121785-1.5184852.667942-2.458839-1.4149520.807935-1.8701600.516477-0.5533590.645799-0.5149410.6181991.461221-2.116306-3.244732-0.3452860.3688700.6996370.031145-0.684797-0.0795910.659885-1.000976-0.2129910.420722-0.019645-0.482792-0.40778028.000
13087279450.0-2.254788-0.9559670.5905960.114744-5.8765313.3648586.365904-1.2529600.243849-1.637022-0.6264340.1054570.859541-1.306715-0.7246930.553933-0.590110-0.471491-0.291435-0.772127-0.601908-0.0929180.5178550.5343610.4944930.3014140.507071-0.5608881354.980
\n", + "
" + ], + "text/plain": [ + " Time V1 V2 V3 V4 V5 V6 \\\n", + "36001 38355.0 1.043949 0.318555 1.045810 2.805989 -0.561113 -0.367956 \n", + "12844 22555.0 -1.665159 0.808440 1.805627 1.903416 -0.821627 0.934790 \n", + "2873 2431.0 -0.324096 0.601836 0.865329 -2.138000 0.294663 -1.251553 \n", + "145263 86773.0 -0.258270 1.217501 -0.585348 -0.875347 1.222481 -0.311027 \n", + "186658 127202.0 2.142162 -0.494988 -1.936511 -0.818288 -0.025213 -1.027245 \n", + "34271 37590.0 -6.341667 1.192815 -3.686579 -2.754006 -5.007164 3.988118 \n", + "76782 56739.0 -0.463928 0.204745 2.795734 1.546200 -0.720374 1.108212 \n", + "1169 912.0 -1.394619 0.554224 -0.617805 -0.313706 2.157413 3.537534 \n", + "282674 171058.0 -2.121785 -1.518485 2.667942 -2.458839 -1.414952 0.807935 \n", + "130872 79450.0 -2.254788 -0.955967 0.590596 0.114744 -5.876531 3.364858 \n", + "\n", + " V7 V8 V9 V10 V11 V12 V13 \\\n", + "36001 0.032736 -0.042333 -0.322674 0.499167 -0.572665 0.346009 -0.047407 \n", + "12844 -0.824802 0.975890 1.747469 -0.658751 1.281502 -1.430087 0.372028 \n", + "2873 1.072114 -0.334896 1.071268 -1.109522 -1.016020 -0.654945 -1.473470 \n", + "145263 1.073860 -0.161408 0.200665 0.154307 0.882673 0.547890 0.269484 \n", + "186658 -0.151627 -0.305750 -0.869482 0.428729 1.136666 0.273476 0.697123 \n", + "34271 1.693606 -13.577522 2.557965 -0.931438 -1.189333 0.762725 -0.517857 \n", + "76782 -0.581133 0.544075 1.099843 -0.653523 -1.420838 0.427211 -0.436201 \n", + "1169 -0.567305 1.380888 -0.112291 0.107269 -0.637728 0.099510 -0.062533 \n", + "282674 -1.870160 0.516477 -0.553359 0.645799 -0.514941 0.618199 1.461221 \n", + "130872 6.365904 -1.252960 0.243849 -1.637022 -0.626434 0.105457 0.859541 \n", + "\n", + " V14 V15 V16 V17 V18 V19 V20 \\\n", + "36001 -0.098964 -0.663284 0.181411 -0.124345 -0.790453 -0.720944 -0.084556 \n", + "12844 1.403024 -2.739413 -1.331766 1.964590 -0.205639 1.325588 -0.373759 \n", + "2873 0.317345 1.067491 -0.372642 -0.674725 0.369841 0.095583 -0.039868 \n", + "145263 -1.253302 -0.883963 0.495221 -0.153212 0.296710 0.136148 0.382305 \n", + "186658 -1.222134 -0.938820 1.298149 0.912921 -0.793721 1.064984 0.106592 \n", + "34271 0.067279 -0.099498 0.837768 -0.156679 -0.402600 -0.238742 -7.171342 \n", + "76782 -1.055012 -1.225903 -1.179268 0.846734 -0.374502 0.623190 -0.052393 \n", + "1169 0.254824 0.318805 -0.335245 0.052870 0.048783 1.654699 0.336595 \n", + "282674 -2.116306 -3.244732 -0.345286 0.368870 0.699637 0.031145 -0.684797 \n", + "130872 -1.306715 -0.724693 0.553933 -0.590110 -0.471491 -0.291435 -0.772127 \n", + "\n", + " V21 V22 V23 V24 V25 V26 V27 \\\n", + "36001 -0.240105 -0.680315 0.085328 0.684812 0.318620 -0.204963 0.001662 \n", + "12844 -0.335332 -0.510994 0.035839 0.147565 -0.529358 -0.566950 -0.595998 \n", + "2873 0.012220 0.352856 -0.341505 -0.145791 0.094194 -0.804026 0.229428 \n", + "145263 -0.424626 -0.781158 0.019316 0.178614 -0.315616 0.096665 0.269740 \n", + "186658 0.010115 0.021722 0.079463 -0.480899 0.023846 -0.279076 -0.030121 \n", + "34271 9.779321 -3.660198 -1.507217 -0.179185 0.002092 -0.019168 3.611243 \n", + "76782 0.094431 0.788161 -0.100344 0.126248 -0.461584 -0.200985 0.280168 \n", + "1169 -0.196300 -0.546172 -0.124758 1.046780 -0.089474 0.363674 0.215692 \n", + "282674 -0.079591 0.659885 -1.000976 -0.212991 0.420722 -0.019645 -0.482792 \n", + "130872 -0.601908 -0.092918 0.517855 0.534361 0.494493 0.301414 0.507071 \n", + "\n", + " V28 Amount Amount_max_fraud \n", + "36001 0.037894 49.67 0 \n", + "12844 -0.220086 16.94 0 \n", + "2873 -0.021623 1.00 0 \n", + "145263 -0.020635 10.78 0 \n", + "186658 -0.043888 39.96 0 \n", + "34271 -0.894494 1437.08 0 \n", + "76782 0.180046 11.10 0 \n", + "1169 0.225698 24.08 0 \n", + "282674 -0.407780 28.00 0 \n", + "130872 -0.560888 1354.98 0 " + ] + }, + "execution_count": 50, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "X_train.head(n=10)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "그리고 타겟을 정의합니다." + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "metadata": { + "_cell_guid": "952ab8e5-cccd-4188-8690-c33e405545d4", + "_uuid": "7ae50c4c16bf36e9b001f658909116004a86aed3" + }, + "outputs": [], + "source": [ + "Y_train = train.loc[:, ['Class']]\n", + "Y_test = test.loc[:, ['Class']]" + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "metadata": { + "_cell_guid": "5c03b27c-581a-452b-86dd-ae4ce2b37877", + "_uuid": "92cce9a63827d1a9e11bc143b46f605f3879eeae" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(227845, 31)\n", + "(227845, 1)\n", + "(56962, 31)\n", + "(56962, 1)\n" + ] + } + ], + "source": [ + "# Just sanity check\n", + "print(np.shape(X_train))\n", + "print(np.shape(Y_train))\n", + "print(np.shape(X_test))\n", + "print(np.shape(Y_test))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "이번엔 Y_train과 Y_Test를 2개의 클래스를 가지는 Categorical Values로 변환합니다." + ] + }, + { + "cell_type": "code", + "execution_count": 53, + "metadata": { + "_cell_guid": "94bb1a46-193f-47fd-bf1f-f0e917492298", + "_uuid": "add388ac1620f9fb2eb1850b35a81411c30055a6" + }, + "outputs": [], + "source": [ + "Y_train = to_categorical(Y_train, num_classes = 2)\n", + "Y_test = to_categorical(Y_test, num_classes = 2)" + ] + }, + { + "cell_type": "code", + "execution_count": 65, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[0., 1.],\n", + " [1., 0.]], dtype=float32)" + ] + }, + "execution_count": 65, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "np.unique(Y_train, axis=0)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "입력 데이터셋에 정규화(Centering and Scaling)를 적용합니다." + ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 59, "metadata": { - "_cell_guid": "e45c27c0-1e29-47cf-befe-bba155dd21cf", - "_uuid": "a6790157aaf0370faa31223ebd4c1faeeaf84f9a", - "collapsed": true + "_cell_guid": "9136cfd3-7e69-4fdf-a658-d0677cb32e26", + "_uuid": "94754afc163a673cfc20a64ae01032d0b6e60454" + }, + "outputs": [], + "source": [ + "#Names of all of the features in X_train.\n", + "features = X_train.columns.values\n", + "\n", + "for feature in features:\n", + " mean, std = data[feature].mean(), data[feature].std()\n", + " X_train.loc[:, feature] = (X_train[feature] - mean) / std\n", + " X_test.loc[:, feature] = (X_test[feature] - mean) / std" + ] + }, + { + "cell_type": "code", + "execution_count": 60, + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
TimeV1V2V3V4V5V6V7V8V9V10V11V12V13V14V15V16V17V18V19V20V21V22V23V24V25V26V27V28AmountAmount_max_fraud
count56962.00000056962.00000056962.00000056962.00000056962.00000056962.00000056962.00000056962.00000056962.00000056962.00000056962.00000056962.00000056962.00000056962.00000056962.00000056962.00000056962.00000056962.00000056962.00000056962.00000056962.00000056962.00000056962.00000056962.00000056962.00000056962.00000056962.00000056962.00000056962.00000056962.00000056962.000000
mean0.0051390.0067830.004003-0.0028110.001057-0.002541-0.0023110.000114-0.0054430.0014230.002917-0.008161-0.000041-0.000321-0.0038720.003222-0.0019780.0000350.0039670.000940-0.003482-0.003067-0.0068040.006418-0.001680-0.0016730.0093580.003430-0.006029-0.002762-0.005195
std0.9989590.9910840.9757261.0003951.0022871.0373011.0205481.0523061.0056811.0046021.0057920.9952850.9984880.9993050.9959020.9969601.0020950.9910840.9975651.0069870.9916011.0018341.0063370.9954560.9975950.9994710.9992321.0324980.9865381.0316760.942043
min-1.996537-18.640252-28.722479-31.871677-3.927001-82.407952-15.052954-22.807581-34.734141-8.630238-19.239745-3.927948-18.568526-3.867219-20.044245-4.470963-14.449819-25.561333-10.569916-5.674207-70.691337-29.434190-11.841840-52.571789-4.660608-16.683278-3.687188-21.996904-46.746035-0.353229-0.046062
25%-0.853426-0.463875-0.363474-0.589585-0.598655-0.502851-0.578069-0.445477-0.176824-0.584429-0.491456-0.752641-0.406027-0.651183-0.442192-0.629025-0.538465-0.570989-0.590404-0.559835-0.274473-0.313414-0.756551-0.256508-0.588789-0.605699-0.669323-0.173930-0.158599-0.330780-0.046062
50%-0.2018900.0185080.0374490.112718-0.015604-0.037550-0.2093710.0316510.016664-0.047884-0.087869-0.0426530.140433-0.0137470.0487310.0563030.075434-0.078295-0.0065110.004373-0.080084-0.044081-0.000454-0.0149470.0661190.034672-0.0992460.0035940.034397-0.265671-0.046062
75%0.9354150.6737780.4851680.6706640.5217210.4459010.2948350.4605710.2720350.5458000.4160900.7137280.6173490.6711850.5085470.7088720.5943980.4740340.5990560.5637000.1702390.2516040.7227270.2401840.7226270.6693070.5086520.2248010.234739-0.043378-0.046062
max1.6419071.24904811.4469542.62848010.80904321.02241855.02005397.47806815.3071749.43961013.99277411.7750174.8503267.1607237.7425189.69910019.7604059.1052854.8837466.86940225.61397330.7884969.35708633.3141187.56967114.4252937.29396278.31925968.528383102.36206321.709793
\n", + "
" + ], + "text/plain": [ + " Time V1 V2 V3 V4 \\\n", + "count 56962.000000 56962.000000 56962.000000 56962.000000 56962.000000 \n", + "mean 0.005139 0.006783 0.004003 -0.002811 0.001057 \n", + "std 0.998959 0.991084 0.975726 1.000395 1.002287 \n", + "min -1.996537 -18.640252 -28.722479 -31.871677 -3.927001 \n", + "25% -0.853426 -0.463875 -0.363474 -0.589585 -0.598655 \n", + "50% -0.201890 0.018508 0.037449 0.112718 -0.015604 \n", + "75% 0.935415 0.673778 0.485168 0.670664 0.521721 \n", + "max 1.641907 1.249048 11.446954 2.628480 10.809043 \n", + "\n", + " V5 V6 V7 V8 V9 \\\n", + "count 56962.000000 56962.000000 56962.000000 56962.000000 56962.000000 \n", + "mean -0.002541 -0.002311 0.000114 -0.005443 0.001423 \n", + "std 1.037301 1.020548 1.052306 1.005681 1.004602 \n", + "min -82.407952 -15.052954 -22.807581 -34.734141 -8.630238 \n", + "25% -0.502851 -0.578069 -0.445477 -0.176824 -0.584429 \n", + "50% -0.037550 -0.209371 0.031651 0.016664 -0.047884 \n", + "75% 0.445901 0.294835 0.460571 0.272035 0.545800 \n", + "max 21.022418 55.020053 97.478068 15.307174 9.439610 \n", + "\n", + " V10 V11 V12 V13 V14 \\\n", + "count 56962.000000 56962.000000 56962.000000 56962.000000 56962.000000 \n", + "mean 0.002917 -0.008161 -0.000041 -0.000321 -0.003872 \n", + "std 1.005792 0.995285 0.998488 0.999305 0.995902 \n", + "min -19.239745 -3.927948 -18.568526 -3.867219 -20.044245 \n", + "25% -0.491456 -0.752641 -0.406027 -0.651183 -0.442192 \n", + "50% -0.087869 -0.042653 0.140433 -0.013747 0.048731 \n", + "75% 0.416090 0.713728 0.617349 0.671185 0.508547 \n", + "max 13.992774 11.775017 4.850326 7.160723 7.742518 \n", + "\n", + " V15 V16 V17 V18 V19 \\\n", + "count 56962.000000 56962.000000 56962.000000 56962.000000 56962.000000 \n", + "mean 0.003222 -0.001978 0.000035 0.003967 0.000940 \n", + "std 0.996960 1.002095 0.991084 0.997565 1.006987 \n", + "min -4.470963 -14.449819 -25.561333 -10.569916 -5.674207 \n", + "25% -0.629025 -0.538465 -0.570989 -0.590404 -0.559835 \n", + "50% 0.056303 0.075434 -0.078295 -0.006511 0.004373 \n", + "75% 0.708872 0.594398 0.474034 0.599056 0.563700 \n", + "max 9.699100 19.760405 9.105285 4.883746 6.869402 \n", + "\n", + " V20 V21 V22 V23 V24 \\\n", + "count 56962.000000 56962.000000 56962.000000 56962.000000 56962.000000 \n", + "mean -0.003482 -0.003067 -0.006804 0.006418 -0.001680 \n", + "std 0.991601 1.001834 1.006337 0.995456 0.997595 \n", + "min -70.691337 -29.434190 -11.841840 -52.571789 -4.660608 \n", + "25% -0.274473 -0.313414 -0.756551 -0.256508 -0.588789 \n", + "50% -0.080084 -0.044081 -0.000454 -0.014947 0.066119 \n", + "75% 0.170239 0.251604 0.722727 0.240184 0.722627 \n", + "max 25.613973 30.788496 9.357086 33.314118 7.569671 \n", + "\n", + " V25 V26 V27 V28 Amount \\\n", + "count 56962.000000 56962.000000 56962.000000 56962.000000 56962.000000 \n", + "mean -0.001673 0.009358 0.003430 -0.006029 -0.002762 \n", + "std 0.999471 0.999232 1.032498 0.986538 1.031676 \n", + "min -16.683278 -3.687188 -21.996904 -46.746035 -0.353229 \n", + "25% -0.605699 -0.669323 -0.173930 -0.158599 -0.330780 \n", + "50% 0.034672 -0.099246 0.003594 0.034397 -0.265671 \n", + "75% 0.669307 0.508652 0.224801 0.234739 -0.043378 \n", + "max 14.425293 7.293962 78.319259 68.528383 102.362063 \n", + "\n", + " Amount_max_fraud \n", + "count 56962.000000 \n", + "mean -0.005195 \n", + "std 0.942043 \n", + "min -0.046062 \n", + "25% -0.046062 \n", + "50% -0.046062 \n", + "75% -0.046062 \n", + "max 21.709793 " + ] + }, + "execution_count": 60, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "X_test.describe()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "그리고 Kearas 모델을 구축합니다." + ] + }, + { + "cell_type": "code", + "execution_count": 61, + "metadata": { + "_cell_guid": "6c0f7416-412a-4415-94e8-362fa13948ea", + "_uuid": "9c648e3b03efea588dea1d20893bf148151447f7" + }, + "outputs": [], + "source": [ + "# fix random seed for reproducibility\n", + "np.random.seed(2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "5 층 네트워크로 마지막은 결과 레이어로 구성하였습니다. 첫 레이어는 Input Dimension을 X_train 칼럼 수인 31로 하였습니다. 마지막 레이어는 softmax 활성화를 사용하였고 나머지는 relu로 활성화하였습니다. 모든 레이어는 0.9인 dropout을 적용합니다. (각 층의 90%의 정보만 사용한다는 뜻입니다.)" + ] + }, + { + "cell_type": "code", + "execution_count": 66, + "metadata": { + "_cell_guid": "bbf4cf25-3052-4b8f-9ac7-700865de4905", + "_uuid": "cf449dc135ffd673be7ef9b800df733c6c48831d" + }, + "outputs": [], + "source": [ + "model = Sequential()\n", + "model.add(Dense(64, input_dim=31, activation='relu'))\n", + "model.add(Dropout(0.9))\n", + "model.add(Dense(64, activation='relu'))\n", + "model.add(Dropout(0.9))\n", + "model.add(Dense(64, activation='relu'))\n", + "model.add(Dropout(0.9))\n", + "model.add(Dense(64, activation='relu'))\n", + "model.add(Dropout(0.9))\n", + "model.add(Dense(2, activation='softmax')) # With 2 outputs" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "loss는 binary cross-entropy로, optimizer는 adam으로 모델을 학습할 수 있도록 설정(compile)합니다. 평가기준(metrics)은 정확도(accuracy)로 받습니다." + ] + }, + { + "cell_type": "code", + "execution_count": 67, + "metadata": { + "_cell_guid": "2dec00ca-e47c-4142-89bc-e7a445314ebc", + "_uuid": "086c950d76895f638b313701200a144fdf3851b6" }, "outputs": [], + "source": [ + "model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "컴파일된 모델을 Training 데이터로 학습(Fit)합니다. 일단 batch_size 2048로 두고 10 epoch(세대)만 학습합니다." + ] + }, + { + "cell_type": "code", + "execution_count": 68, + "metadata": { + "_cell_guid": "bbbd50fb-41e8-4f71-b497-f8e19038dad0", + "_uuid": "239658b1175b942a7aa179f8ae8b71dccbcb8f6d" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 1/10\n", + "227845/227845 [==============================] - 5s 20us/step - loss: 0.9254 - acc: 0.8761\n", + "Epoch 2/10\n", + "227845/227845 [==============================] - 3s 12us/step - loss: 0.1404 - acc: 0.9815\n", + "Epoch 3/10\n", + "227845/227845 [==============================] - 3s 13us/step - loss: 0.0815 - acc: 0.9913\n", + "Epoch 4/10\n", + "227845/227845 [==============================] - 3s 14us/step - loss: 0.0603 - acc: 0.9949\n", + "Epoch 5/10\n", + "227845/227845 [==============================] - 3s 13us/step - loss: 0.0497 - acc: 0.9961: 1s\n", + "Epoch 6/10\n", + "227845/227845 [==============================] - 3s 13us/step - loss: 0.0447 - acc: 0.9970\n", + "Epoch 7/10\n", + "227845/227845 [==============================] - 3s 13us/step - loss: 0.0401 - acc: 0.9972\n", + "Epoch 8/10\n", + "227845/227845 [==============================] - 3s 13us/step - loss: 0.0373 - acc: 0.9977\n", + "Epoch 9/10\n", + "227845/227845 [==============================] - 3s 13us/step - loss: 0.0356 - acc: 0.9978\n", + "Epoch 10/10\n", + "227845/227845 [==============================] - 3s 13us/step - loss: 0.0345 - acc: 0.9979\n" + ] + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 68, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "epoch = 10\n", + "batch_size = 2048\n", + "model.fit(X_train, Y_train, epochs=epoch, batch_size=batch_size)" + ] + }, + { + "cell_type": "code", + "execution_count": 69, + "metadata": { + "_cell_guid": "e45c27c0-1e29-47cf-befe-bba155dd21cf", + "_uuid": "a6790157aaf0370faa31223ebd4c1faeeaf84f9a" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "56962/56962 [==============================] - 4s 67us/step\n", + "Test score: 0.027575257398611885\n", + "Test accuracy: 0.9982795547909132\n" + ] + } + ], "source": [ "score, acc = model.evaluate(X_test, Y_test)\n", "print('Test score:', score)\n", "print('Test accuracy:', acc)" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**99.82%의 정확도를 Test에서 얻을 수 있습니다!** 이걸로 충분할까요? 10 epoch 이상으로 적용하면 아마 더 도움이 될 것입니다." + ] + }, { "cell_type": "markdown", "metadata": { @@ -3189,8 +4430,6 @@ "_uuid": "343bbc820dd1043196daef8b36ec7b8da445eaec" }, "source": [ - "** We get 99.82% Accuracy!** Is it good enough for the problem? May be not. More than 10 epochs will still help.\n", - "\n", "### Training and testing accuracy and loss vs epoch:\n", "\n", "Let us plot train and test accuracy and loss vs. epoch collcting the history by running the model again:"