Pudding

말랑말랑말랑 곰도리 푸딩 한 입에 먹기 챌린지

Machine Learning

[혼공머신] 3주차_로지스틱 회귀, 시그모이드, 소프트맥스 / 확률적 경사 하강법

sse 2025. 1. 26. 23:54
3주차

Ch. 04 다양한 분류 알고리즘
     ㄴ 04-1 로지스틱 회귀
     ㄴ 04-2 확률적 경사 하강법

04-1 로지스틱 회귀

데이터 준비 과정은 간단히 보자!

타깃 데이터로 species 열, 이외의 5개 열은 입력 데이터로 사용하고,

StandardScaler 클래스를 사용해서 표준화 전처리를 마쳤다. 

모델 학습과 점수는 [8]셀에서 확인할 수 있다.

[9]셀에서는 클래스를 출력해보면 정렬된 타깃값이 알파벳 순이라는 점을 알 수 있다.

테스트 셋의 처음 5개의 샘플으로 예측한 값과 그 확률을 확인해보았다.

✅predict_proba() : 클래스별 확률값 반환
✅round()의 decimals : 소수점 자릿수 지정

 

확률의 각 열은 이전의 알파벳 순으로 정렬된 클래스 순서이다.

아래에는 세 번째 샘플의 이웃을 실제로 출력해본 결과이다.

이웃 세 개 중 2개가 'Perch', 1개가 'Roach' 이므로 위의 확률과 동일하다는 점을 알 수 있다.

 

로지스틱 회귀는 회귀라는 이름을 가지고 있지만 분류 모델이라고 한다. 

또한 선형 방정식을 학습한다는 점! 식으로 나타내면 z = (~가중치 x 특성~) 이런 식이라고 한다.

여기서 z를 0~1 사이의 확률로 만들기 위해 사용하는 것이 시그모이드 함수이다.

시그모이드 함수는 이렇게 생겼다..

그래프를 보면 z값이 커질수록 1에 영원히 가까워지고, z값이 작아질수록 0에 영원히 가까워지는 것을 볼 수 있다.

즉 절대적으로 0과 1사이의 값이라는 것이다.

시그모이드 함수는 딥러닝으로 넘어갔을 때 LSTM이나 GRU의 활성화 함수로도 사용이 된다.

그 때 가서 이게머지.. 하지 않도록 기억해서 나쁠 건 없다.

 

이제 로지스틱 회귀를 사용해서 이진 분류를 해보자.

먼저 불리언 인덱싱에 대해 간단히 알아보면

위의 print 식을 보면 True 인 값만 출력된 것을 볼 수 있다.

이걸 활용해서 이전의 생선 7종 데이터를 Bream, Smelt 행만 남겼다. 

인덱싱한 데이터로 훈련시키고 예측값과 확률까지 확인할 수 있다.

클래스 두 개만 인덱싱 했기 때문에 확률도 2개의 열만 나오는 것을 확인할 수 있다.

그리고 클래스를 출력해서 각 열이 어떤 클래스의 확률인지도 확인이 가능하다.

어차피 이진 분류이고 알파벳 순이라는 것을 아니까 출력하지 않아도 생각해보면 되겠지만...

로지스틱 회귀가 학습한 계수도 출력해볼 수 있다. 선형 회귀랑 비슷하다는걸 다시 한 번 느낄 수 있다..

[21]셀은 z값을 출력한 것이고, [22]셀은 z값에 시그모이드 함수를 적용시켜서 확률로 변환한 결과이다.

✅decision_function() : z값 출력
✅scipy 라이브러리의 expit() : 시그모이드 함수

 

 

이제 다중 분류를 해보자.

이전과 내용은 동일하다.

다른 점으로는 매개변수가 생겼다는 점..?

✅C : 규제 조절 > 값이 클수록 정규화 효과 약해짐
✅max_iter : 에포크 설정

 

학습한 모델의 계수를 확인해보면

각 클래스마다 z값을 계산한다는 점을 알아낼 수 있다.

다중분류에서의 z값과 확률도 확인할 수 있다.

여기서 이진분류와 다른 점은 시그모이드 함수가 아닌 소프트맥스 함수를 사용한다는 점이다.

소프트맥스도 활성화 함수로 많이 사용된다.

04-2 확률적 경사 하강법

점진적 학습 : 새로운 데이터가 추가되었을 때 새로운 데이터에 대해서만 추가로 훈련
> 대표적인 알고리즘으로 확률적 경사 하강법이 있다!
확률적 경사 하강법
훈련 세트를 이용하여 가장 가파른 길을 찾음
but. 딱 하나의 샘플을 랜덤하게 골라 가장 가파른 길을 찾음
이걸 모든 샘플 사용해서 손실이 원하는 만큼 떨어질 때 까지 계속 시도…

 

이제 확률적 경사 하강법 활용 Go Go

데이터 준비와 전처리는 이전과 동일하다.

이어서 SGDClassifier 클래스를 사용하면 확률적 경사 하강법을 활용할 수 있다. 

✅SGDClassifier : 확률적 경사 하강법을 활용한 분류용 클래스
> loss, max_iter 지정

 

손실 함수로는 log_loss(로지스틱 손실 함수), 에포크는 10으로 설정하여 학습시켰다.

그리고 정확도를 출력하면 웬 경고 하나가 같이 뜬다............

이 경고는 에포크 수를 늘리면 된다고 한다.

하지만 진짜 그냥 경고이기 때문에 무시해도 상관은 없다. 단지 내가 탄생시키는 모델이 바보가 되는 것 뿐...

추가 훈련을 시킬때는 partial_fit()을 사용하면 된다.

내가 돌린 결과는 책보다 훨씬 더 높은 정확도가 나오게 되었다.. (뭔진 모르겠지만 일단 대박)

✅partial_fit() : 점진적 학습에서 추가 훈련을 할 때 사용할 수 있다.

 

확률적 경사 하강법을 사용한 모델은 에포크 수에 따라 과대·과소적합이 될 수 있다.

너무 작아도 안되고 너무 커도 안되니 그 사이의 적절한 에포크 수를 찾는 것이 관건이다..

에포크 300으로 추가 학습을 하고 각 에포크마다의 정확도를 나타낸 그래프이다.

초기에는 정확도가 너무 낮고 100 이후로는 커질수록 정확도의 차이가 점점 커지는 것을 볼 수 있다.

따라서 가장 적절한 에포크 수는 100!!!

이를 통해 에포크를 100으로 맞추면 훨씬 높은 정확도가 나오게 된다. 야호!

추가로 tol 파라미터를 설정하면 성능이 향상되지 않을 때 자동으로 학습을 멈춘다.

보통 1e-3으로 설정하는듯??!!

✅tol : 자동으로 학습을 멈출 지 설정

기본 과제 : 4-1 확인문제 2

2. 로지스틱 회귀가 이진 분류에서 확률을 출력하기 위해 사용하는 함수는 무엇인가요?

 정답은 ① 시그모이드 함수 !!

시그모이드 함수를 이용해서 z값을 0~1사이의 확률로 변환해서 출력했었죠. 후후

다중 분류에서는 소프트맥스 함수 사용했던 것까지 잊지 않으면 완벽할 것 같습니다!

추가 과제 : 4-2 과대적합 / 과소적합 손코딩 코랩 화면 캡처


이번 주는 좀 열심히 한 것 같아서 뿌듯하당.

이번 범위 왠지 모르게 수학식이 쏟아져 나온 것 같아서 머리 북북 긁으면서 봄..

점진적 학습이라는 거 미리 알았으면 저번 주 뺑이칠 때 모델 학습 40분씩 안기다려도 됏을텐데...................

어쨋든

다음 주 하루종일 드러누워서 애니도 보고 푹~~~ 쉴 생각에 조커됨 부힛부힛..

다음 주 만큼은 다 잊고 즐기자..

연휴 끝나면 또 BTS급 스케줄 준비되어있음 

아 가라고요..