Skip to content

Commit fc79721

Browse files
committed
up
1 parent 573f1da commit fc79721

2 files changed

Lines changed: 119 additions & 130 deletions

File tree

classification.ipynb

Lines changed: 71 additions & 86 deletions
Original file line numberDiff line numberDiff line change
@@ -330,7 +330,7 @@
330330
},
331331
"source": [
332332
"**혼동 행렬**<font size=\"2\">confusion matrix</font>은 클래스별 예측 결과를 정리한 행렬이다.\n",
333-
"훈련이 완료된 이진 분류기인 숫자-5 감별기에 대한 혼동 행렬은 아래와 같은 (2, 2) 모양의 2차원 (넘파이) 어레이로 생성된다.\n",
333+
"훈련이 완료된 이진 분류기인 숫자-5 감별기(`sgd_clf`)에 대한 혼동 행렬은 아래와 같은 (2, 2) 모양의 2차원 (넘파이) 어레이로 생성된다.\n",
334334
"\n",
335335
"```python\n",
336336
"array([[53892, 687],\n",
@@ -343,24 +343,28 @@
343343
"id": "c13a99d4",
344344
"metadata": {},
345345
"source": [
346+
":::{prf:example} 혼동 행렬 예제\n",
347+
":label: exp_confusion_matrix\n",
348+
"\n",
346349
"아래 그림은 혼동 행렬에 포함된 각 정수의 의미를 설명하기 위해\n",
347350
"숫자-5 감별기의 판정 결과를 단순화해서 보여준다. \n",
348351
"\n",
349352
"<p><div align=\"center\"><img src=\"https://github.com/codingalzi/code-workout-ml/blob/master/images/ch03/homl03-02.png?raw=true\" width=\"500\"/></div></p>\n",
350353
"\n",
351-
"아래 표는 위 그림에 포함된 용어와 각 칸에 포함된 손글씨 이미지들에 대한 설명을 담고 있다.\n",
354+
"아래 표는 위 그림에 포함된 각 칸을 가리키는 용어와 칸에 포함된 손글씨 이미지들에 대해 설명한다.\n",
352355
"\n",
353356
"| 분류 | 예측: 음성 (5 아니라고 판정) | 예측: 양성 (5라고 판정) |\n",
354357
"| :--- | :--- | :--- |\n",
355358
"| 실제: 음성<br>(5가 아님) | TN (참 음성, True Negative)<br>5가 아닌 숫자를 5가 아니라고 정확히 예측<br>(예: 8, 3, 9, 7, 2) | FP (거짓 양성, False Positive)<br>5가 아닌 숫자를 5라고 잘못 예측<br>(예: 6) |\n",
356359
"| 실제: 양성<br>(5임) | FN (거짓 음성, False Negative)<br>실제 5인 숫자를 5가 아니라고 잘못 예측 | TP (참 양성, True Positive)<br>실제 5인 숫자를 5라고 정확히 예측 |\n",
357360
"\n",
358-
"위 그림을 토대로한 혼동 행렬은 다음과 같이 작성된다.\n",
361+
"단순화된 그림을 토대로한 혼동 행렬은 다음과 같이 작성된다.\n",
359362
"\n",
360363
"```python\n",
361364
"array([[5, 1],\n",
362365
" [2, 3]])\n",
363-
"```"
366+
"```\n",
367+
":::"
364368
]
365369
},
366370
{
@@ -377,12 +381,12 @@
377381
"metadata": {},
378382
"source": [
379383
"**정확도**<font size='2'>accuracy</font>는 라벨을 정확하기 맞힌 비율이다.\n",
380-
"훈련된 SGD 분류기의 정확도는 다음과 같이 96% 정도로 매우 높게 계산된다.\n",
384+
"훈련된 SGD 분류기(`sgd_clf`)의 정확도는 96% 정도로 매우 높게 계산된다.\n",
381385
"\n",
382386
"```\n",
383-
"accuracy = (TP + TN)/(TP+FP+TN+FN)\n",
384-
" = (3530 + 53892)/(3530 + 687 + 53892 + 1891)\n",
385-
" = 0.957\n",
387+
"sgd_clf_accuracy = (TP + TN)/(TP+FP+TN+FN)\n",
388+
" = (3530 + 53892)/(3530 + 687 + 53892 + 1891)\n",
389+
" = 0.957\n",
386390
"```"
387391
]
388392
},
@@ -426,7 +430,7 @@
426430
"여기서는 숫자 5라고 예측된 값들 중에서 진짜로 5인 숫자들의 비율이다. \n",
427431
"\n",
428432
"```\n",
429-
"precision = TP / (TP + FP) = 3530 / (3530 + 687) = 0.837\n",
433+
"sgd_clf_precision = TP / (TP + FP) = 3530 / (3530 + 687) = 0.837\n",
430434
"```"
431435
]
432436
},
@@ -444,7 +448,7 @@
444448
"**참 양성 비율**<font size=\"2\">true positive rate</font>로도 불린다.\n",
445449
"\n",
446450
"```\n",
447-
"recall = TP / (TP + FN) = 3530 / (3530 + 1891) = 0.651\n",
451+
"sgd_clf_recall = TP / (TP + FN) = 3530 / (3530 + 1891) = 0.651\n",
448452
"```"
449453
]
450454
},
@@ -457,45 +461,76 @@
457461
}
458462
},
459463
"source": [
460-
"**정밀도와 재현율의 상대적 중요도**"
464+
"**정밀도와 재현율의 상대적 중요도**\n",
465+
"\n",
466+
"모델 사용의 목적에 따라 정밀도와 재현율의 중요도가 다를 수 있다.\n",
467+
"\n",
468+
"* 재현율이 보다 중요한 경우: 암진단. 예측이 틀리면 큰 책임이 따름.\n",
469+
" * 정밀도: 암이 있다고 진단된 경우 중에 실제로도 암이 있는 경우의 비율\n",
470+
" * 재현율: 암을 암으로 정확히 판정하는 비율\n",
471+
" * 다른 예제: 금융 사기 여부(금융 사기를 금융 사기라고 판정하는 비율이 높아야 함)\n",
472+
"\n",
473+
"* 정밀도가 보다 중요한 경우: 아이에게 보여줄 안전한 동영상 선택. \n",
474+
" * 정밀도: 안전하다고 판단된 동영상 중에서 실제로도 안전한 동영상의 비율.\n",
475+
" 안전하지 않은 동영상이 잘못 안전하다고 판정되는 경우가 낮아야 함.\n",
476+
" * 재현율: 실제로 안전한 동영상 중에서 안전한 동영상이라고 판정되는 동영상의 비율\n",
477+
" * 다른 예제: 스팸 필터링 (스팸이 아닌 것을 스팸으로 판정하는 비율이 낮아야 함)"
461478
]
462479
},
463480
{
464481
"cell_type": "markdown",
465-
"id": "5252ed31-ce2e-48d1-a9b4-f4c9cfe7198b",
482+
"id": "7a0488fb",
466483
"metadata": {},
467484
"source": [
468-
"모델 사용의 목적에 따라 정밀도와 재현율의 중요도가 다를 수 있다.\n",
469-
"\n",
470-
"* 재현율이 보다 중요한 경우: 암진단처럼 예측이 틀렸을 경우 큰 책임이 따르는 경우. \n",
471-
" * 정밀도: 암이 있다고 진단된 경우 중에 실제로도 암이 있는 경우의 비율\n",
472-
" * 재현율: 암으로 판정해야 하는 경우 중에서 양성 암진단으로 결론내린 경우의 비율\n",
473-
" * 다른 예제: 금융 사기 여부, 태풍 예보\n",
474-
"\n",
475-
"* 정밀도가 보다 중요한 경우: 아이에게 보여줄 안전한 동영상 선택처럼 일부 양성 모델을 놓치더라도 음성이 양성으로 판정되는 경우가 적어야 하는 경우.\n",
476-
" * 정밀도: 안전하다고 판단된 동영상 중에서 실제로도 안전한 동영상의 비율\n",
477-
" * 재현율: 실제로 좋은 동영상 중에서 좋은 동영상이라고 판정되는 동영상 비율\n",
478-
" * 다른 예제: 스팸 필터링"
485+
"### 정밀도와 재현율의 상호 반비례 관계"
479486
]
480487
},
481488
{
482489
"cell_type": "markdown",
483-
"id": "7a0488fb",
490+
"id": "2033457c",
484491
"metadata": {},
485492
"source": [
486-
"### 정밀도와 재현율의 상충관계"
493+
"**결정 함수와 결정 임계값**"
487494
]
488495
},
489496
{
490497
"cell_type": "markdown",
491498
"id": "f8d66bc2-144a-4887-bca2-f59852453003",
492499
"metadata": {},
493500
"source": [
494-
"분류기의 **결정 함수**<font size=\"2\">decision function</font>는 각 샘플에 대해 점수를 계산하며\n",
495-
"이 점수가 **결정 임계값**<font size=\"2\">decision threshold</font>보다\n",
501+
"훈련된 이진 분류기는 각 샘플에 대해\n",
502+
"범주를 구분하기 위한 용도의 점수를 계산하는\n",
503+
"**결정 함수**<font size=\"2\">decision function</font>라는\n",
504+
"메서드를 포함한다.\n",
505+
"이진 분류기는 이 점수가 **결정 임계값**<font size=\"2\">decision threshold</font>보다\n",
496506
"같거나 크면 양성, 아니면 음성으로 판단한다.\n",
507+
"\n",
497508
"예를 들어 `SGDClassifier`는 `decision_function()` 메서드를 결정 함수로 이용하며,\n",
498-
"결정 함숫값이 0보다 작으면 음성, 0보다 같거나 크면 양성으로 판정한다."
509+
"결정 함숫값이 0보다 작으면 음성, 0보다 같거나 크면 양성으로 판정한다.\n",
510+
"처음 10개 샘플에 대한 `sgd_clf`의 결정 함숫값은 다음과 같이\n",
511+
"첫째 샘플의 결정 함숫값만 양수이고 나머지 9개는 음수다.\n",
512+
"따라서 첫째 샘플만 5로 판정되고 나머자 9개는 5가 아니다라고 판정된다.\n",
513+
"\n",
514+
"```python\n",
515+
"array([1200.93051237,\n",
516+
" -26883.79202424,\n",
517+
" -33072.03475406,\n",
518+
" -15919.5480689,\n",
519+
" -20003.53970191,\n",
520+
" -16652.87731528,\n",
521+
" -14276.86944263,\n",
522+
" -23328.13728948,\n",
523+
" -5172.79611432,\n",
524+
" -13873.5025381 ])\n",
525+
"```"
526+
]
527+
},
528+
{
529+
"cell_type": "markdown",
530+
"id": "64f327cf",
531+
"metadata": {},
532+
"source": [
533+
"**트레이드오프 관계**"
499534
]
500535
},
501536
{
@@ -509,7 +544,7 @@
509544
},
510545
"source": [
511546
"정밀도와 재현율은 상호 반비례 관계이다.\n",
512-
"즉, 한쪽이 증가하면 다른쪽이 감소하는 상충 관계이다.\n",
547+
"즉, 한쪽이 증가하면 다른쪽이 감소하는 tradeoff(트레이드오프) 관계이다.\n",
513548
"따라서 정밀도와 재현율 사이의 적절한 비율을 유지하는 분류기를 찾아야 한다. \n",
514549
"정밀도와 재현율의 비율은 모델이 사용하는 **결정 임곗값**에 따라 달라진다."
515550
]
@@ -536,7 +571,7 @@
536571
}
537572
},
538573
"source": [
539-
":::{prf:example} 정밀도와 재현율의 트레이드오프\n",
574+
":::{prf:example} 정밀도와 재현율의 상충관계\n",
540575
":label: exp_decision_threshold\n",
541576
"\n",
542577
"아래 그림에서 세 개의 화살표 (a), (b), (c)는 서로 다른 결정 임곗값을 가리키며, \n",
@@ -557,57 +592,6 @@
557592
":::"
558593
]
559594
},
560-
{
561-
"cell_type": "markdown",
562-
"id": "0ea2d0ce",
563-
"metadata": {},
564-
"source": [
565-
"**결정 함수와 결정 임곗값**"
566-
]
567-
},
568-
{
569-
"cell_type": "markdown",
570-
"id": "e37d737d",
571-
"metadata": {},
572-
"source": [
573-
"결정 함수<font size='2'>decision function</font>는 \n",
574-
"분류 모델이 주어진 데이터 샘플의 클래스를 판별하기 위해 내부적으로 \n",
575-
"각 샘플에 대해 점수를 계산할 때 사용하는 메서드(함수)다. \n",
576-
"양성 예측의 기준이 되는 **결정 임곗값**<font size='2'>decision threshold</font>과\n",
577-
"이 점수를 비교하여, 결정 함숫값이 임곗값보다 같거나 크면 양성, 작으면 음성으로 판정한다.\n",
578-
"\n",
579-
"결정 임곗값을 높이면 양성으로 판정받기 어려워져 정밀도는 올라가고 재현율은 떨어집니다. 반대로 임곗값을 낮추면 양성 판정이 쉬워져 정밀도는 떨어지고 재현율은 올라가게 됩니다."
580-
]
581-
},
582-
{
583-
"cell_type": "markdown",
584-
"id": "a2a7b224-c8cc-4bcb-8ae4-21f57a901ab8",
585-
"metadata": {},
586-
"source": [
587-
"예를 들어 처음 10개 샘플에 대한 결정 함숫값은 다음과 같다.\n",
588-
"첫째 샘플의 결정 함숫값만 양수이고 나머지 9개는 음수다.\n",
589-
"따라서 첫째 샘플만 5로 판정되고 나머자 9개는 5가 아니다라고 판정된다."
590-
]
591-
},
592-
{
593-
"cell_type": "markdown",
594-
"id": "fa57bc47-24cc-4906-a1de-5472d2af870f",
595-
"metadata": {},
596-
"source": [
597-
"```\n",
598-
"array([1200.93051237,\n",
599-
" -26883.79202424,\n",
600-
" -33072.03475406,\n",
601-
" -15919.5480689,\n",
602-
" -20003.53970191,\n",
603-
" -16652.87731528,\n",
604-
" -14276.86944263,\n",
605-
" -23328.13728948,\n",
606-
" -5172.79611432,\n",
607-
" -13873.5025381 ])\n",
608-
"```"
609-
]
610-
},
611595
{
612596
"cell_type": "markdown",
613597
"id": "daa6163e-4add-47e4-a24e-bddbc91614c0",
@@ -625,9 +609,11 @@
625609
"id": "f49d4346-6e7d-46b0-ad1f-432cb93a7459",
626610
"metadata": {},
627611
"source": [
628-
"아래 그래프는 `SGDClassifier` 모델을 숫자-5 감별기로 훈련시킨 결과를 이용한다.\n",
629-
"그래프는 x-축의 결정 임곗값에 따른 정밀도와 재현율의 변화를 보여준다.\n",
630-
"결정 임곗값이 커질 때 정밀도가 순간적으로 떨어질 수 있지만 결국엔 계속해서 상승한다."
612+
"아래 그래프는 훈련된 숫자-5 감별기 `sgd_clf`가 계산한\n",
613+
"샘플들의 결정 함숫값을 활용하여\n",
614+
"결정 임곗값에 따른 정밀도와 재현율의 변화를 보여준다.\n",
615+
"결정 임곗값이 커질 때 정밀도가 순간 떨어질 수 있지만 결국엔 계속\n",
616+
"상승해서 1.0에 다달한다."
631617
]
632618
},
633619
{
@@ -643,8 +629,7 @@
643629
"id": "db03ad67-9773-4106-86d0-2257325f76ac",
644630
"metadata": {},
645631
"source": [
646-
"`SGDClassifier` 는 0을 결정 임곗값으로 사용하기에 정밀도는 84% 정도, 재현율은 65% 정도다.\n",
647-
"반면에 검정 수직 점선은 정밀도는 90%, 재현율은 50% 정도가 되게 하는 결정 임곗값을 보여준다.\n",
632+
"위 그래프에서 검정 수직 점선은 정밀도는 90%, 재현율은 50% 정도가 되게 하는 결정 임곗값을 보여준다.\n",
648633
"결정 임곗값을 변경하여 원하는 정밀도와 재현율을 갖는 숫자-5 감별기를 구현하려면 \n",
649634
"수동으로 분류기를 구현해야 한다 ([90% 정밀도 분류기 구현](https://colab.research.google.com/github/codingalzi/handson-ml3/blob/master/notebooks/code_classification.ipynb#scrollTo=cKfpQLyuCHkf) 참고)."
650635
]

0 commit comments

Comments
 (0)