|
330 | 330 | }, |
331 | 331 | "source": [ |
332 | 332 | "**혼동 행렬**<font size=\"2\">confusion matrix</font>은 클래스별 예측 결과를 정리한 행렬이다.\n", |
333 | | - "훈련이 완료된 이진 분류기인 숫자-5 감별기에 대한 혼동 행렬은 아래와 같은 (2, 2) 모양의 2차원 (넘파이) 어레이로 생성된다.\n", |
| 333 | + "훈련이 완료된 이진 분류기인 숫자-5 감별기(`sgd_clf`)에 대한 혼동 행렬은 아래와 같은 (2, 2) 모양의 2차원 (넘파이) 어레이로 생성된다.\n", |
334 | 334 | "\n", |
335 | 335 | "```python\n", |
336 | 336 | "array([[53892, 687],\n", |
|
343 | 343 | "id": "c13a99d4", |
344 | 344 | "metadata": {}, |
345 | 345 | "source": [ |
| 346 | + ":::{prf:example} 혼동 행렬 예제\n", |
| 347 | + ":label: exp_confusion_matrix\n", |
| 348 | + "\n", |
346 | 349 | "아래 그림은 혼동 행렬에 포함된 각 정수의 의미를 설명하기 위해\n", |
347 | 350 | "숫자-5 감별기의 판정 결과를 단순화해서 보여준다. \n", |
348 | 351 | "\n", |
349 | 352 | "<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", |
350 | 353 | "\n", |
351 | | - "아래 표는 위 그림에 포함된 용어와 각 칸에 포함된 손글씨 이미지들에 대한 설명을 담고 있다.\n", |
| 354 | + "아래 표는 위 그림에 포함된 각 칸을 가리키는 용어와 칸에 포함된 손글씨 이미지들에 대해 설명한다.\n", |
352 | 355 | "\n", |
353 | 356 | "| 분류 | 예측: 음성 (5 아니라고 판정) | 예측: 양성 (5라고 판정) |\n", |
354 | 357 | "| :--- | :--- | :--- |\n", |
355 | 358 | "| 실제: 음성<br>(5가 아님) | TN (참 음성, True Negative)<br>5가 아닌 숫자를 5가 아니라고 정확히 예측<br>(예: 8, 3, 9, 7, 2) | FP (거짓 양성, False Positive)<br>5가 아닌 숫자를 5라고 잘못 예측<br>(예: 6) |\n", |
356 | 359 | "| 실제: 양성<br>(5임) | FN (거짓 음성, False Negative)<br>실제 5인 숫자를 5가 아니라고 잘못 예측 | TP (참 양성, True Positive)<br>실제 5인 숫자를 5라고 정확히 예측 |\n", |
357 | 360 | "\n", |
358 | | - "위 그림을 토대로한 혼동 행렬은 다음과 같이 작성된다.\n", |
| 361 | + "위 단순화된 그림을 토대로한 혼동 행렬은 다음과 같이 작성된다.\n", |
359 | 362 | "\n", |
360 | 363 | "```python\n", |
361 | 364 | "array([[5, 1],\n", |
362 | 365 | " [2, 3]])\n", |
363 | | - "```" |
| 366 | + "```\n", |
| 367 | + ":::" |
364 | 368 | ] |
365 | 369 | }, |
366 | 370 | { |
|
377 | 381 | "metadata": {}, |
378 | 382 | "source": [ |
379 | 383 | "**정확도**<font size='2'>accuracy</font>는 라벨을 정확하기 맞힌 비율이다.\n", |
380 | | - "훈련된 SGD 분류기의 정확도는 다음과 같이 96% 정도로 매우 높게 계산된다.\n", |
| 384 | + "훈련된 SGD 분류기(`sgd_clf`)의 정확도는 96% 정도로 매우 높게 계산된다.\n", |
381 | 385 | "\n", |
382 | 386 | "```\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", |
386 | 390 | "```" |
387 | 391 | ] |
388 | 392 | }, |
|
426 | 430 | "여기서는 숫자 5라고 예측된 값들 중에서 진짜로 5인 숫자들의 비율이다. \n", |
427 | 431 | "\n", |
428 | 432 | "```\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", |
430 | 434 | "```" |
431 | 435 | ] |
432 | 436 | }, |
|
444 | 448 | "**참 양성 비율**<font size=\"2\">true positive rate</font>로도 불린다.\n", |
445 | 449 | "\n", |
446 | 450 | "```\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", |
448 | 452 | "```" |
449 | 453 | ] |
450 | 454 | }, |
|
457 | 461 | } |
458 | 462 | }, |
459 | 463 | "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 | + " * 다른 예제: 스팸 필터링 (스팸이 아닌 것을 스팸으로 판정하는 비율이 낮아야 함)" |
461 | 478 | ] |
462 | 479 | }, |
463 | 480 | { |
464 | 481 | "cell_type": "markdown", |
465 | | - "id": "5252ed31-ce2e-48d1-a9b4-f4c9cfe7198b", |
| 482 | + "id": "7a0488fb", |
466 | 483 | "metadata": {}, |
467 | 484 | "source": [ |
468 | | - "모델 사용의 목적에 따라 정밀도와 재현율의 중요도가 다를 수 있다.\n", |
469 | | - "\n", |
470 | | - "* 재현율이 보다 중요한 경우: 암진단처럼 예측이 틀렸을 경우 큰 책임이 따르는 경우. \n", |
471 | | - " * 정밀도: 암이 있다고 진단된 경우 중에 실제로도 암이 있는 경우의 비율\n", |
472 | | - " * 재현율: 암으로 판정해야 하는 경우 중에서 양성 암진단으로 결론내린 경우의 비율\n", |
473 | | - " * 다른 예제: 금융 사기 여부, 태풍 예보\n", |
474 | | - "\n", |
475 | | - "* 정밀도가 보다 중요한 경우: 아이에게 보여줄 안전한 동영상 선택처럼 일부 양성 모델을 놓치더라도 음성이 양성으로 판정되는 경우가 적어야 하는 경우.\n", |
476 | | - " * 정밀도: 안전하다고 판단된 동영상 중에서 실제로도 안전한 동영상의 비율\n", |
477 | | - " * 재현율: 실제로 좋은 동영상 중에서 좋은 동영상이라고 판정되는 동영상 비율\n", |
478 | | - " * 다른 예제: 스팸 필터링" |
| 485 | + "### 정밀도와 재현율의 상호 반비례 관계" |
479 | 486 | ] |
480 | 487 | }, |
481 | 488 | { |
482 | 489 | "cell_type": "markdown", |
483 | | - "id": "7a0488fb", |
| 490 | + "id": "2033457c", |
484 | 491 | "metadata": {}, |
485 | 492 | "source": [ |
486 | | - "### 정밀도와 재현율의 상충관계" |
| 493 | + "**결정 함수와 결정 임계값**" |
487 | 494 | ] |
488 | 495 | }, |
489 | 496 | { |
490 | 497 | "cell_type": "markdown", |
491 | 498 | "id": "f8d66bc2-144a-4887-bca2-f59852453003", |
492 | 499 | "metadata": {}, |
493 | 500 | "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", |
496 | 506 | "같거나 크면 양성, 아니면 음성으로 판단한다.\n", |
| 507 | + "\n", |
497 | 508 | "예를 들어 `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 | + "**트레이드오프 관계**" |
499 | 534 | ] |
500 | 535 | }, |
501 | 536 | { |
|
509 | 544 | }, |
510 | 545 | "source": [ |
511 | 546 | "정밀도와 재현율은 상호 반비례 관계이다.\n", |
512 | | - "즉, 한쪽이 증가하면 다른쪽이 감소하는 상충 관계이다.\n", |
| 547 | + "즉, 한쪽이 증가하면 다른쪽이 감소하는 tradeoff(트레이드오프) 관계이다.\n", |
513 | 548 | "따라서 정밀도와 재현율 사이의 적절한 비율을 유지하는 분류기를 찾아야 한다. \n", |
514 | 549 | "정밀도와 재현율의 비율은 모델이 사용하는 **결정 임곗값**에 따라 달라진다." |
515 | 550 | ] |
|
536 | 571 | } |
537 | 572 | }, |
538 | 573 | "source": [ |
539 | | - ":::{prf:example} 정밀도와 재현율의 트레이드오프\n", |
| 574 | + ":::{prf:example} 정밀도와 재현율의 상충관계\n", |
540 | 575 | ":label: exp_decision_threshold\n", |
541 | 576 | "\n", |
542 | 577 | "아래 그림에서 세 개의 화살표 (a), (b), (c)는 서로 다른 결정 임곗값을 가리키며, \n", |
|
557 | 592 | ":::" |
558 | 593 | ] |
559 | 594 | }, |
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 | | - }, |
611 | 595 | { |
612 | 596 | "cell_type": "markdown", |
613 | 597 | "id": "daa6163e-4add-47e4-a24e-bddbc91614c0", |
|
625 | 609 | "id": "f49d4346-6e7d-46b0-ad1f-432cb93a7459", |
626 | 610 | "metadata": {}, |
627 | 611 | "source": [ |
628 | | - "아래 그래프는 `SGDClassifier` 모델을 숫자-5 감별기로 훈련시킨 결과를 이용한다.\n", |
629 | | - "그래프는 x-축의 결정 임곗값에 따른 정밀도와 재현율의 변화를 보여준다.\n", |
630 | | - "결정 임곗값이 커질 때 정밀도가 순간적으로 떨어질 수 있지만 결국엔 계속해서 상승한다." |
| 612 | + "아래 그래프는 훈련된 숫자-5 감별기 `sgd_clf`가 계산한\n", |
| 613 | + "샘플들의 결정 함숫값을 활용하여\n", |
| 614 | + "결정 임곗값에 따른 정밀도와 재현율의 변화를 보여준다.\n", |
| 615 | + "결정 임곗값이 커질 때 정밀도가 순간 떨어질 수 있지만 결국엔 계속\n", |
| 616 | + "상승해서 1.0에 다달한다." |
631 | 617 | ] |
632 | 618 | }, |
633 | 619 | { |
|
643 | 629 | "id": "db03ad67-9773-4106-86d0-2257325f76ac", |
644 | 630 | "metadata": {}, |
645 | 631 | "source": [ |
646 | | - "`SGDClassifier` 는 0을 결정 임곗값으로 사용하기에 정밀도는 84% 정도, 재현율은 65% 정도다.\n", |
647 | | - "반면에 검정 수직 점선은 정밀도는 90%, 재현율은 50% 정도가 되게 하는 결정 임곗값을 보여준다.\n", |
| 632 | + "위 그래프에서 검정 수직 점선은 정밀도는 90%, 재현율은 50% 정도가 되게 하는 결정 임곗값을 보여준다.\n", |
648 | 633 | "결정 임곗값을 변경하여 원하는 정밀도와 재현율을 갖는 숫자-5 감별기를 구현하려면 \n", |
649 | 634 | "수동으로 분류기를 구현해야 한다 ([90% 정밀도 분류기 구현](https://colab.research.google.com/github/codingalzi/handson-ml3/blob/master/notebooks/code_classification.ipynb#scrollTo=cKfpQLyuCHkf) 참고)." |
650 | 635 | ] |
|
0 commit comments