[혼자 공부하는 ML+DL] #3 - 다양한 분류 알고리즘

hu22·2023년 8월 15일
0
post-thumbnail
본 내용은 한빛미디어의 [혼자 공부하는 머신러닝+딥러닝]을 참고하였습니다.

Chapter 04. 다양한 분류 알고리즘

04-1. 로지스틱 회귀

  • KNN에서의 분류

    --> 위의 그림에서 타깃 데이터에는 3개의 종류가있다. 이렇게 타깃 데이터에 2개 이상의 클래스가 포함된 문제를 다중 분류라고 한다. 만약 k가 3이라면 가능한 확률은 0/3, 1/3, 2/3, 3/3이 전부 이므로 확률이라고 말하기 조금 어려울 수 있다.

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

    *** a,b,c,d,e는 가중치 혹은 계수
    -> 확률이 되려면 0~1사이의 값이 되어야함. z가 아주 큰 음수일 때 0이되고, z가 아주 큰 양수일 대 1이 되도록 해야 함.
    -> 시그모이드함수(로지스틱 함수)를 사용함!

  • 로지스틱 회귀로 이진분류 수행하기
    -> 넘파이 배열은 True, False 값을 전달하여 행을 선택할 수 있음. 이를 불리언 인덱싱이라고 함.

char_arr = np.array(['A','B','C','D','E'])
print(char_arr[[True, False, True, False, False]])
# -> ['A','C']

-> 위의 방식으로 훈련 세트에서 도미와 빙어의 행만 골라내기(or 연산자로 불리언 인덱싱하기)

from sklearn.linear_model import LogisticRegression #로지스틱 회귀 라이브러리

bream_smelt_indexes = (train_target == 'Bream') | (train_target == 'Smelt') 
train_bream_smelt = train_scaled[bream_smelt_indexes]
target_bream_smelt = train_target[bream_smelt_indexes]

lr = LogisticRegression()
lr.fit(train_bream_smelt, target_bream_smelt)

print(lr.predict(train_bream_smelt[:5]))

# ->['Bream' 'Smelt' 'Bream' 'Bream' 'Bream']

print(lr.predict_proba(train_bream_smelt[:5]))#'Bream', 'Smelt'에 해당될 확률
# -> [[0.99759855 0.00240145]
     [0.02735183 0.97264817]
     [0.99486072 0.00513928]
     [0.98584202 0.01415798]
     [0.99767269 0.00232731]]
     
print(lr.classes_)
# -> ['Bream', 'Smelt']

-> 로지스틱 회귀가 학습한 방정식 확인해보기

print(lr.coef_, lr.intercept_)
#-> [[-0.4037798 -0.57620209 -0.66280298 -1.01290277 -0.73168947]] [-2.16155132]

따라서 방정식은 다음과 같다.

-> train_bream_smelt 처음 5개 샘플의 z값 출력

decisions = lr.decision_function(train_bream_smelt[:5])
print(decisions)
#-> [-6.02927744 3.57123907 -5.26568906 -4.24321775 -6.0607117 ]

-> 이 z값을 시그모이드 함수에 통과시키면 확률을 얻을 수 있음. expit()함수를 사용하여 계산.

from scipy.special import expit
print(expit(decisions)
# ->[0.00240145 0.97264817 0.00513928 0.01415798 0.00232731]
  • 로지스틱 회귀로 다중 분류 수행하기
    -> 위의 이진 분류 방법을 바탕으로 다중 분류를 수행해보자.
lr = LogisticRegression(C=20, max_iter=000) #C -> 규제를 제어하는 매개변수 릿지 회귀의 alpha와 반대로 작을수록 규제가 커짐. max_iter -> 반복 횟수 지정
lr.fit(train_scaled, train_target)      
print(lr.score(train_scaled, train_target))
print(lr.score(test_scaled, test_target))
#-> 
0.9327731092436975 
0.925

print(lr.predict(test_scaled[:5]))
#-> ['Perch' 'Smelt' 'Pike' 'Roach' 'Perch']

proba = lr.predict_proba(test_scaled[:5])
print(np.round(proba, decimals=3))# demicals=3 -> 소수점 네 번째 자리에서 반올림.
#->
[[0. 0.014 0.841 0. 0.136 0.007 0.003]
 [0. 0.003 0.044 0. 0.007 0.946 0. ]
 [0. 0. 0.034 0.935 0.015 0.016 0. ]
 [0.011 0.034 0.306 0.007 0.567 0. 0.076]
 [0. 0. 0.904 0.002 0.089 0.002 0.001]]

-> 각 클래스에 대한 확률을 계산할 수 있음. 가장 높은 확률이 예측 클래스가 됨. 다중 뷴류에서는 이진분류의 시그모이드 함수와 달리 소프트맥스함수를 사용하여 7개의 z값을 확률로 변환함.

  • 소프트맥스 함수
    -> 여러개의 선형 방정식의 출력값을 0~1사이로 압축하고 전체 합이 1이 되도록 만듦. 이를 위해 지수 함수를 사용하기 때문에 정규화된 지수 함수라고도 부름.


    -> 테스트 세트 처음 5개 샘플에 대한 z1~z7의 값을 구해보자.
decision = lr.decision_function(test_scaled[:5])
print(np.round(decision, decimals=2))
#->
[[ -6.5 1.03 5.16 -2.73 3.34 0.33 -0.63] 
[-10.86 1.93 4.77 -2.4 2.98 7.84 -4.26]
[ -4.34 -6.23 3.17 6.49 2.36 2.42 -3.87]
[ -0.68 0.45 2.65 -1.19 3.26 -5.75 1.26] \
[ -6.4 -1.99 5.82 -0.11 3.5 -0.11 -0.71]]

from scipy.special import softmax
proba = softmax(decision, axis=1) #axis=1을 통해 각 샘플에 대한 소프트맥스 계산
print(np.round(proba, decimals=3))
#-> 
[[0. 0.014 0.841 0. 0.136 0.007 0.003]
[0. 0.003 0.044 0. 0.007 0.946 0. ]
[0. 0. 0.034 0.935 0.015 0.016 0. ]
[0.011 0.034 0.306 0.007 0.567 0. 0.076]
[0. 0. 0.904 0.002 0.089 0.002]]

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

  • 점진적 학습 : 앞서 훈련한 모델을 버리지 않고 새로운 데이터에 대해서만 조금씩 더 훈련하는 방식. 대표적인 점진적 학습 알고리즘은 확률적 경사 하강법임.

  • 확률적 경사 하강법 : 경사 하강법을 진행하되, 전체 샘플을 사용하는 것이 아니라 딱 하나의 샘플을 훈련 세트에서 랜덤하게 골라서 진행함. 모든 샘플을 다 사용해도 극소점을 찾지 못하면 처음 부터시작. 이렇게 훈련 세트를 한 번 모두 사용하는 과정을 "에포크(epoch)" 라고함.

  • 미니배치 경사 하강법 : 1개씩 말고 무작위로 몇 개의 샘플을 선택해서 경사 하강법을 진행.

  • 배치 경사 하강법 : 극단적으로 한 번 경사로를 이동하기 위해 전체 샘플을 사용. 가장 안정적인 방법이지만 컴퓨터 자원을 그만큼 많이 사용하고 어떤 경우에는 데이터가 너무 많아서 한 번에 전체 데이터릃 모두 읽을 수 없을수도 있음.

  • 손실 함수 : 확률적 경사 하강법이 최적화할 대상.

  • 로지스틱 손실 함수 : -log(1-예측 확률), 이진 크로스엔트로피 손실 함수라고도 부름.

  • 평균 제곱 오차(MSE) : 회귀에서 사용하는 손실 함수. 타깃에서 예측을 뺀 절댓값을 모든 샘플에 평균한 값.

  • 에포크의 과대/과소적합
    -> 에포크 횟수가 적으면 과소적합이 일어나고, 에포크 횟수가 너무 많으면 과대적합이 일어남.

    -> 과대적합이 시작하기 전에 훈련을 멈추는 것을 조기 종료라고 함.

  • SGDClassifier의 loss 매개변수
    -> hinge : 힌지 손실, 서포트 벡터 머신이라고 불리는 또 다른 머신러닝 알고리즘을 위한 손실함수.

profile
ai 개발자를 꿈꾸는 대학생

1개의 댓글

comment-user-thumbnail
2023년 8월 15일

훌륭한 글 감사드립니다.

답글 달기

관련 채용 정보