근데z값이 있다는 건? → 또 이걸'시그모이드 함수'에 넣어서 확률을 구할 수 있다는 얘기가 됨 (= 위에서 구했던 예측확률과 같은 값이 나와야겠죠!)
`expit()`: Scipy 라이브러리에서 제공하는 시그모이드 함수
구해보니까 진짜 같게 나오네!
대신,이진분류에서decision_function의 반환값은양성클래스에 대한 z값이란 걸 알 수 있음. 🆚음성 = (1-양성)으로 사후 계산해야 함
4. 다중분류 by 로지스틱 회귀
⭐자, 이제 그럼 우리의 진짜 문제를 위해,다중분류로 넘어와보자.
모델 훈련
이제 전체 7마리 다 써서 훈련! 방식은 이진분류 때와 동일함.
`max_iter`: 충분한 훈련을 위해 반복횟수를 지정하는 매개변수 (기본값=100)
`C`:(릿지의alpha처럼)규제의 양을 조절하는 매개변수. (기본값=1)
샘플 예측하기
`.predict`: 5개의 특성을 바탕으로 판단했을 때 7개의 생선 중 무엇일지 분류
예측확률 구하기
`predict_proba` : 위의 분류 결과가 어떤 확률값을 근거로 나왔는지 출력
❗다중분류에서는, 클래스 개수만큼 확률을 출력함.
• 위의 예측결과와 비교해보면 각각 가장 높은 확률이랑 맞아떨어짐 ㅇㅇ • ex) 첫 번째 샘플은 Bream일 확률 0 / Parkki일 확률 0.014 / Perch일 확률 0.841 / Pike일 확률 0 / Roach일 확률 0.136 / Smelt일 확률 0.007 / Whitefish일 확률 0.003 이었던 것이다. ⇒ 그래서 Perch로 분류된 것! (코드 [21] 참고)
(마찬가지로) 모델이 학습한 계수도 구할 수 있음.
근데 한 샘플 당 확률이 7조각이니까,방정식도 7세트가 나옴! (ex. Bream 확률 구하는 식, Parkki 확률 구하는 식, ··· Whitefish 확률 구하는 식)
이번에도 역시 절편과 계수로회귀방정식쓰고 → 그 방정식에 따라 샘플마다z값도 구할 수 있음 (방정식이 7세트니까 샘플마다z값도 7개씩)
(마찬가지로)z값이 있다는 건? →'시그모이드 함수' '소프트맥스 함수'에 넣어서 확률 계산 가능⭐
❗다중분류는, 이진분류(샘플당z값 1개) 와 달리,z값이 여러 개라서 다 합치면 1을 넘어갈 수 있음 = 한 샘플 내의7개z값을 다 합치면 1이 되도록적당히압축필요 = 그걸 해주는 게 바로,소프트맥스 함수!!!(그래서 여기선 시그모이드 X)
`softmax()`: 여러 개의 선형방정식의 출력값(z)을 0~1 사이로 압축하고, 총합이 1이 되게 만드는 함수. →여기 넣어서 확률 구해보니 [22]에서 구했던 것과 동일하게 나옴^^
`LogisticRegression`은 기본적으로 릿지회귀처럼 '계수의 제곱을 기준으로 규제'하는데, 이런 규제를L2 규제라고 부름.
릿지회귀에서는 `alpha`가 커질수록 규제가 커졌지만, `C`는 반대로 작을수록 규제가 커짐 (헷갈리지 않게 주의!)
최적의 `C`값 역시 직접 바꿔가면서 찾아야 함
➌ 소프트맥스 함수의 axis
참고로 `axis`는 소프트맥스 계산의 단위를 각 행마다 하기 위해서 설정해주는 거임. (⚠️설정 안 해주면 전체를 압축해버려서 이상하게 나옴;;)
➍ 확인문제 2번 풀이 (혼공미션)
[설명] 로지스틱 회귀는 선형방정식에서 출력된z값을 특정 함수에 집어넣어 '확률'처럼 보이게 할 수 있다.이진분류는 0~1 사이의 값으로 압축시켜주는시그모이드 함수를 쓴다.다중분류는z값이 여러 개라서 시그모이드로 할 수 없고, 그걸 다 압축시켜주는소프트맥스 함수를 써야한다
🤔 Hmmmm...
182p. 4번째 샘플 불러올 때, 왜 [3:4]로 불러오는 거죠..?
`kn.neighbors()`는 2차원 배열을 넣어줘야해서 그런 거네! (310p 참고) ⏯️
190 ~ 191p 과정 이해 잘 안 되면 아래 그림을 기억하자. 이런 식으로 각 샘플마다 7개의 방정식 적용돼서 z값이 7개가 나오는 것이다..! 🆗
🤓 To wrap up...
갑자기 처음 보는 지수함수가 등장하고.. 설상가상으로 더 복잡한 소프트맥스 함수까지 나와서 당황스러웠다ㅠ 다행히 강의랑 같이 보면서 천천히 이해할 수 있었다,,, 결국 지수함수 자체가 중요한 건 아니고, "다중회귀식의 결과값(z)을 적당히 계산해주니까 0~1사이의 값이 나와서, 그걸 확률로 보겠다"는 식의 논리인 것 같다..!
'럭키백' 이벤트 출시 = 분류모델에서 '분류'뿐만 아니라 분류의 근거가 되는'확률'까지 필요한 상황 → ①k-최근접 이웃 분류모델에서.predict_proba로 확률 출력 가능! → but 확률 치고 너무 불연속적인 수치.. → ② 새로운 알고리즘,로지스틱 회귀모델을 사용 = 결과값(z)을 0~1 사이의 값으로 재구성해서 확률처럼 보이게 출력 가능!! →이진분류는 시그모이드 함수 활용, z가 0보다 크면 양성 클래스! →다중분류는 소프트맥스 함수 활용, z가 가장 큰 클래스 채택!