Data/딥러닝 & 머신러닝

Logistic Regression

희디 2024. 3. 28. 17:05

4장은 확률에 따라 다른것이 나오는 럭키박스를 활용해서 Logistic Regression에 대해 설명해주고 있다. 

 

아래 생선의 특성을 활용해서 럭키백에 들어갈 수 있는 생선 7개가 나올 수 있는 각각의 확률을 출력이 목표 

 

그래서 그 동안 배웠던 알고리즘으로 접근해보면 

 

1) k-최근접 이웃 

타깃인 X에 10개의 샘플이 있고 

 

https://raw.githubusercontent.com/rickiepark/hg-mldl/master/fish.csv

위에 있는 것은 책에서 활용할 csv 데이터이다. 

 

pandas는 csv 파일의 첫 줄을 자동으로 인식해 열 제목으로 만들어준다. 

그리고 특정 열을 골라서 입력 데이터로 사용할 수 있다. 

fish_input = fish[['Weight', 'Length', 'Diagonal', 'Height', 'Width']].to_numpy()

fish 배열의 fish [] 특정 열을 가져올것임을 또 배열 안에 넣기 []  => 그래서 []가 이중으로 둘러싸임 

 

 

 

다중 분류(Multi-class classification) 

: 타깃 데이터에 2개 이상의 클래스가 포함된 문제 

ex) 현재 하고 있는 7개의 생선 종류가 있는 문제 

: 2개를 분류해야하는 것은 이진분류 

 

다중분류에서도 타깃값을 숫자로 바꿔 입력할 수 있지만 사이킷런에서는 문자열로 된 타깃값을 그래도 사용가능 

알파벳 순서대로 자동으로 매겨진다. 

정렬된 값은 KneighborsClassifier.classes_ (속성)에 있음 

 

<로지스틱 회귀>

회귀이지만 분류 모델 , 선형 방정식을 학습 함 

 

a,b,c,d,e는 가중치 또는 계수. 특성은 늘어났지만 선형방정식과 같다.

 

시그모이드 함수(=로지스틱 함수) 를 사용하면 z의 값 조절 가능 

 

위의 식에서 z는 어느 값도 가능하다. 하지만 확률이 되고자한다면 0~1 사이 값이 되어야 한다. 

z가 아주 큰 음수 : 0

z가 아주 큰 양수 : 1

로 바꿔주는 시그모이드 함수 

 

시그모이드 함수는 0에서 1까지 변한다. 

 

이진분류일 경우, 시그모이드 함수 출력값이 0.5보다 크면 양성 클래스 / 0.5보다 작으면 음성 클래스로 판단 + 사이킷런은 0.5일때 음성 클래스로 판단함 

 

<로지스틱 회귀로 이진분류 - 불리언 인덱싱> 

아래 예시에서 특정 원소인 A C만 골라내려면 A C의 인덱스만 True 이고 다른건 False인 배열을 전달하면 됨 

LogisticRegression은 선행모델이어서 sklearn.linear_model 패키지 아래에 있다. 

 

 

예측확률을 predict_proba() 메서드로 측정한다. 

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

알파벳 순으로 적용된 classes_ 속성으로 확인해보면 두번째 열인 Smelt가 양성 클래스이다. 

lr.predict() 결과값을 보면 두번째 결과가 smlet값이 가장 높다. 그래서 두번째 경우엔 빙어로 예측할 것 

 

아래 식은 선형방정식이었으므로 계수를 확인해보면 

다섯개의 계수가 나왔고 절편 f값으론 1개가 나왔다. 

 

decision_function()으로 z값을 출력할 수 있다. 

 

train_bream_smelt에 있는 앞에 있는 5개의 데이터로 해당 z식에 값을 넣고 값을 계산하면 위의 값과 같다. 

이 값을 시그모이드 함수에 통과시키면 !! 확률 !!을 구할 수 있다. 

 

파이썬의 scipy 라이브러리에 시그모이드 함수가 있다. expit()함수!! 

np.exp()로 훨씬 편리하고 안전하다. 

 

 

 

expit()의 두번째 값이 predict_proba()의 두번째 행의 두번째 열과 같은 값임을 확인할 수 있다. 

!! decision_function()은 양성 클래스에 대한 z값을 반환한다 !! 

 

여기까진 이진분류를 위한 로지스틱 회귀모델 훈련 

 

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

 

LogisticRegression 클래스로 7개의 생선을 분류해보자 

 

LogisticRegression 클래스의 특징 

1. 기본적으로 반복적인 알고리즘 사용 

   - max_iter 매개변수에서 반복횟수 지정 (defalut 100)

      - 준비한 데이터셋을 사용해 모델을 훈련하면 반복횟수 부족하다는 경고 발생 => 1000으로 증가 

 

2. 기본적으로 릿지회귀와 같이 계수의 제곱을 규제 (L2 규제)

   - (릿지) alpha로, alpha에 비례해 커지면 규제도 커짐 

   - LogisticRegression은 C로, C와 반비례적으로 규제적용, C가 커지면 규제가 작아짐 (default 1) =>여기서 20으로 설정

 

아래 코드는 다중분류 모델을 훈련하는 것 

7개의 생선 데이터가 모두 들어있는 train_scaled, train_target 사용한 점 유의깊게 보기 

첫번째 test_scaled 데이터에서 perch가 나오는게 가장 확률이 크다. (classes_ 속성 순으로 확률이 출력됨) 

 

 

5개의 특성을 사용해 coef_ 배열의 열은 5개이고 행이 7개이다. intercept_도 7개가 있다. 

z를 7개나 계산한다는 점. 

!! 다중분류는 클래스마다 z값을 하나씩 계산한다!!

!! 가장 높은 z값을 출력하는 클래스가 예측 클래스가 된다!! 

 

이진 분류와 다른 다중분류의 확률 계산 방법 

: 소프트맥스(softmax) 함수로 7개의 z값을 확률로 변환한다. 

(* 소프트맥스 함수 : 여러개의 선 방정식의 출력값을 0~1 사이로 압축하고 전체합이 1이 되게 만듦, 지수함수 사용해서 정규화된 지수함수 라고도 부름) 

 

계산과정

 

s1~s7 까지 모두 더하면 분자와 분모가 같아지므로 1이 된다.  

 

z1~z7까지 값을 구하고 소프트맥스 함수를 사용해 확률로 바꿔보자 

확률 계산

 

로지스틱 회귀는 분류모델로 선형회귀와 다르게 0~1값으로 변환해주고 0~100%의 확률로 이해하면 된다. 

이진분류에서는 하나의 선형방적식을 훈련하고 출력값을 시그모이드 함수에 통과시켜 0~1 사이값으로 만듦(=양성클래스 확률) 음성 클래스는 1-양성클래스 확률 

다중분류에서는 클래스의개수만큼 방정식을 훈련 

다음으로, 방정식의 출력값을 소프트맥스 함수를 통과시켜 전체 클래스에 대한 합이 항상 1이 되게 만듦(= 클래스에 대한 확률) 

 

++ 추가 정보 ++

[4장 코드 작성 공부] 

https://colab.research.google.com/drive/1_kjkbMgkS5gZ-VCBhQwN5-zw1fT_-vdx#scrollTo=HteiRq763-FO

 

Google Colaboratory Notebook

Run, share, and edit Python notebooks

colab.research.google.com


함수 여러가지 정리 

predict_proba()로 음성 클래스와 양성클래스에 대한 확률 출력 

decision_function() 메서드로 양성클래스에 대한 z값 계산 

coef_와 intercept_ 속성으로 로지스틱 모델이 학습한 선형 방정식의 계수 확인