[혼공단 7기] 혼공머신 3주차 미션

코덩이·2022년 1월 31일
1

혼공머신

목록 보기
4/7
post-thumbnail

04-1. 로지스틱 회귀

🔈 다중 분류

타깃 클래스가 2개 이상인 분류 문제. 로지스틱 회귀는 다중 분류를 위해 소프트맥스 함수를 사용하여 클래스를 예측한다.

  • ex) fish 데이터 프레임에서 7개의 생선 종류가 있었기 때문에 타깃 데이터에도 7개의 생선 종류가 들어 있다.

🔧 데이터 준비

  • csv 파일을 데이터 프레임으로 변환한 후
  • head() 메서드로 처음 5개 행 출력
  • 어떤 종류의 생선이 있는지 unique() 함수를 통해 Species 열에서 고유한 값 추출
  • Species 열을 타깃으로 만들고 나머지 5개 열을 입력 데이터로 사용
  • 훈련 세트와 테스트 세트 준비하기

🔧 k-최근접 이웃 분류기로 다중 분류 모델 훈련

  • k-최근접 이웃 분류기의 확률 예측
  • KNeighborsClassifier 클래스 객체로 훈련
  • 최근접 이웃 개수 k = 3

🔧 다중 분류 시 유의할 점

위와 같이 모델을 만들고 훈련하는 방식은 이진 분류와 동일하다

이진 분류 - 양성 클래스와 음성 클래스를 1과 0으로 지정하여 타깃 데이터 생성
다중 분류 - 다중 분류도 타깃값을 숫자로 바꾸어 입력할 수 있지만, 사이킷런에서는 문자열로 된 타깃값을 그대로 사용 가능

❌ 주의할 점 ❌

  • 타깃값을 그대로 사이킷런 모델에 전달하면 순서가 자동으로 알파벳 순으로 정렬된다.
  • print(kn.classes_) 를 통해 순서를 확인할 수 있다.
  • 만약 원하는 순서가 있다면 수동으로 labeling을 해줘야 한다.

🔧 k-최근접 이웃 분류기의 확률 예측

  • predict() 메서드로 테스트 세트의 첫 5개 샘플의 타깃값 예측

  • 테스트 세트에 있는 처음 5개 샘플에 대한 확률 출력

    넘파이 round() 함수 : 기본적으로 소수점 첫째 자리에서 반올림. decimals 매개변수로 유지할 수수점 아래 자릿수 지정 가능

  • 결과 해석

    행은 샘플, 열은 확률.

    • 첫 번째 샘플인 Perch 는 세번째 열인 Perch일 확률이 1이다.
    • 다섯번째 샘플인 Perch 는 세번째 열인 Perch일 확률이 0.6667이며 다섯번째 열인 Roach일 확률이 0.3333 이다.
  • 확률이 0, 1/3, 2/3, 1 밖에 나오지 않는 한계

  • 더 나은 확률 값을 얻기 위해 로지스틱 회귀를 알아보자.

🔈 로지스틱 회귀

선형 방정식을 사용한 분류 알고리즘. 선형 회귀와 달리 시그모이드 함수나 소프트맥스 함수를 사용하여 클래스 확률을 출력할 수 있다.

  • 이름은 회귀이지만 분류 모델이다.
  • 선형 회귀와 동일하게 선형 방정식을 학습한다.

시그모이드 함수 (=로지스틱 함수)

선형 방정식의 출력을 0과 1사이의 값으로 압축하며 이진 분류를 위해 사용한다.

  • z 값을 그대로 사용하면 그냥 회귀 알고리즘이 된다.
  • 분류를 하기위해 확률로 바꾸려면 0~1 범위로 바꿔야한다.
  • 어떤 값이 나올 지 모르는 z를 0~1 범위로 바꾸기 위해 사용되는 것이 시그모이드 함수

  • 왼쪽이 시그모이드 함수, 오른쪽이 시그모이드 그래프

    사진출처: https://youtu.be/pO27UnTsYQU

  • x값이 -∞ ~ +∞ 일 때, y값은 1.0 ~ 0으로 제한 된다.

  • 시그모이드 함수에 넣어서 확률로 바꾼다음
    0.5를 기준으로 0.5보다 크면 양성클래스,
    0.5보다 작으면 음성 클래스로 분류한다.

  • 그러나 z값만 봐도 알 수 있다
    z값이 양성이면 양성클래스
    z값이 음성이면 음성클래스

🔧 넘파이를 사용해 그래프 그리기

  • 5와 5 사이에 0.1 간격으로 배열 z를 만들고
    np.exp() 함수를 이용하여 z의 위치마다 시그모이드 함수를 계산한다.

🎉 기본 미션

로지스틱 회귀가 이진 분류에서 확률을 출력하기 위해 사용하는 함수는 무엇인가요?
답: ① 시그모이드 함수

🔧 로지스틱 회귀로 이진 분류 수행

  • 불리언 인덱싱을 사용하여 7개 생선 종류(타깃 클래스)를 2가지만 남도록 만든다.

    불리언 인덱싱
    : 넘파이 배열에 True, False 값을 전달하여 행을 선택하는 것

  • 불리언 인덱싱을 사용하여 훈련 세트에서 도미와 빙어의 행만 골라낸다

    • 현재 bream_smelt_indexes 배열은 도미와 빙어일 경우 True 그 외는 모두 False
    • 이 배열을 사용해 train_scaled와 train_target 배열에 불리언 인덱싱을 적용하면 도미와 빙어 데이터만 골라낼 수 있다.
  • 이를 통해 준비된 데이터로 로지스틱 회귀 모델을 학습해 보자

  • predict_proba() 메서드로 train_bream_smelt 에서 처음 5개의 샘플의 예측 확률 출력

  • 샘플마다 2개의 확률이 출력된다

    첫 번째 열 : 음성 클래스(0) 에 대한 확률
    두 번째 열 : 양성 클래스(1) 에 대한 확률

  • 어떤 것이 양성 클래스고 음성 클래스인지 classes_속성으로 확인

    음성 클래스 : 도미 (Bream)
    양성 클래스 : 빙어 (Smelt)

  • 따라서 predict_proba() 메서드가 반환한 배열 값 중 두 번째 샘플만 양성 클래스인 빙어의 확률이 높다

  • 로지스틱 회귀가 학습한 계수 확인

  • 따라서 이 로지스틱 회귀 모델이 학습한 방정식은 아래와 같다

    z = -0.404 x (무게) - 0.576 x (길이) - 0.663 x (대각선) - 0.013 x (높이) - 0.732 x (두께) - 2.161

  • z값을 출력해보자

  • z 값을 시그모이드 함수에 통과시키면 함수를 얻을 수 있다. 파이썬의 사이파이 라이브러리의 시그모이드 함수인 expit() 를 사용해보자

🔧 로지스틱 회귀로 다중 분류 수행

04-2.확률적 경사 하강법

🎉 선택 미션

과대적합/과소적함 손코딩 코랩 화면 캡쳐하기

후기

  • 실습시간을 늘려봤는데 그만큼 난이도가 올라가서 여전히 부족했다! (살려줘...)

  • 그래도 저번처럼 개념과 실습을 급하게 넘기다가 다시 공부하게 되는 걸 막기위해 기본과제와 4-1장이라도 꼼꼼하게 공부했다.

  • 로지스틱 회귀 다중분류와 4-2정리, 선택미션은 내일 올려겠다...

profile
개발공부중

0개의 댓글