Logistic Regression
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_ 속성으로 로지스틱 모델이 학습한 선형 방정식의 계수 확인