본문 바로가기

머신러닝/혼자 공부하는 머신러닝

9강 로지스틱 회귀 알아보기

이 글은 https://www.youtube.com/watch?v=pO27UnTsYQU&list=PLJN246lAkhQjoU0C4v8FgtbjOIXxSs_4Q&index=9 보고 공부한 글 입니다

 

4장 분류모델을 공부해보자.

 

지난 시간에 

선형회귀에서 특성을 많이 넣으면 과대적합이 된다.

 

그것을 억제하기 위해서 규제라는 것을 사용한다.

 

 

 

럭키 백 (스토리)

럭키 백에 있는 생선을 사려고한다. 럭키백에 확률이 있다.

 

도미일 확률이 몇%이다 라는것은 안다뤘다.

 

숫자를 예측하는 것이니 회귀아닐까? 아니다 분류이다.

 

도미인지 빙어인지 분류하면서 이 샘플이 도미인지 확신하는 것이다. 이것을 확률로 보여준다.

 

 

 

확률 계산하기 

특성: 길이, 높이, 대각선, 두께 

 

x 샘플을 보면 세모가 5개 있으니 10개중에 5개가 있으니 0.5 확률로 세모일 것이다.

 

 

데이터 준비 

판다스의 read_csv를 사용한다.

 

head() 매서드는 데이터 프래임의 몇개의 행을 보여준다.

 

csv의 1라인은 헤더를 보여준다.

 

species 에는 7개의 생선의 종류가 들어있다.

 

열 이름리스트로 만들고 뽑아낸다.

 

타겟 데이터는 species에 들어있으니 이것은 뽑아서 numpy에 넣는다.

 

 

 

k-최근접 이웃의 다중 분류

species는 문자열로 돼있다. 사이킷런은 문자열도 타겟값을 받을 수 있다.

 

kn객체의 속성을 확인하려면 끝에 _ 붙어있다.

 

train_target으로 부터 학습한 값들, 학습한 속성을 보여준다. 

 

predict5개 샘플을 예측을 해본다. 

결과로 문자열이 나왔다.

 

 

확률을 출력하려면 predict_proba()를 사용한다.

 

확률을 구하려고 자원이 너무 필요하면 지원안한다.

 

5개의 샘플이 행으로 나와있고 7개의 생선 확률을 보여준다.

 

결과

['Bream' 'Parkki' 'Perch' 'Pike' 'Roach' 'Smelt' 'Whitefish']

 

첫번째 행 = 첫번 째 샘플은 Perch가 1로 되어있다 확신하니 Perch로 출력

두번째 행은 Smelt가 1로 되어있다. Smelt로 확신

 

 

 

로지스틱 회귀 

대표적인 분류 알고리즘 이다.

 

선형회귀와 굉장히 비슷하다.

선형함수를 학습하는것과 비슷

 

5개의 특성을 사용하기 때문에 a,b,c,d,e,f를 사용한다.

 

z값을 그대로 사용하면 회귀가 된다.

 

확률로 보여주기 위해서 0~1로 조정한다. 이러한 트릭을 쓰는것이 시그모이드함수, 로지스틱 함수 를 사용한다.

 

x축이 z값이고 시그모이드 함수의 출력값이 0~1로 제한이 된다.

 

0.5보다 크면 양성 클래스, 작으면 음성 클래스

 

이름이 회귀이지만 분류알고리즘이다.

 

z값이 0보다 크면 양성, 0보다 작으면 음성

z값으로도 양성,음성이 판별이 가능하다. 하지만 확률을 뽑으려면 함수값을 알아야 한다.

 

 

로지스틱회귀(이진분류) 

넘파이의 불리언 인덱싱을 사용한다.

Bream = 도미

Smelt = 빙어

 

도미, 빙어는 1로만들고 나머지는 다 false가 될 것이다.

 

bream_smelt 만 1이 되어있는 훈련데이터, 타겟데이터를 만든다.

 

 

LogisticRegression()객체로 로지스틱 회귀를 진행한다.

 

predict로 앞의 5개의 예측을 본다.

 

 

predict_proba()로 확률을 본다면 첫번째 열이 음성클래스, 두 번째 열이 양성 클래스로 나타난다.

도미가 0 이고 빙어가 1이다.

 

 

 

로지스틱 회귀 계수 확인 

lr객체의 coef_, intercept_ 계수들을 확인해본다.

특성이 많아지니 가중치라고 부르자.

 

 

decision_function = z값 이다.

시그모이드 함수에 넣어서 확률을 볼 수 있다.

 

scipy의 expit()에서 시그모이드 함수를 제공한다.

이 때 양성 클래스의 z값만 계산한다.

 

 

 

로지스틱 회귀(다중 분류)

다중분류 = 여러개의 클래스가 있는 경우

도미와 빙어만 뽑아내지 않는다.

 

max_iter는 반복횟수이다. 

기본값은 100인데 반복횟수가 모자르다는 경고가 뜨기 때문에 1000으로 했다.

 

로지스틱 회귀는 L2노름 구제 기본적용한다. 선형회귀는 alpha강도로 조절했는데 로지스틱 회귀는 C값으로 한다.

 

C값이 커질 수록 규제가 약화되고

C값이 작아질 수록 규제가 강화된다.

 

기본값은 1이다. 규제를 완화화기 위해서 20으로 설정한다.

 

 

 

predict_proba로 5개 샘플의 확률을 구해본다.

5개의 행이 있다. = 5개의 샘플이 있다.

 

7개의 확률이 나오는데 7개의 생선(클래스)이 있기 때문이다.

ex) 1번 샘플은 3번째 열이 가장 확률이 높다(=예측 클래스가 된다)

 

coef_ 의 크기는 7행과 5개열

5개 열은 특성과 곱해지는 계수이다.

7개 행은 클래스인데 클래스마다 선형함수가 1개가 만들어진다(=z값). 즉 7개의 선형함수가 만들어진다.

ex) 1번 샘플에 대해서 7개의 선형함수를 모두 통화시킨 다음에 값들 중에 가장 큰 값이 예측 클래스가 된다.

 

intercept_ 의 크기는 7개의 행 

 

 

하나의 클래스를 학습할 때 이진분류처럼한다. 즉, 이진분류를 7번실행한 것과 같다.

 

-------------------------------------------------------------------------------------------------------

ex)A,B,C클래스가 있다고 하면 

A를 양성 B,C를 음성으로 두고 이진분류

B를 양성 A,C를 음성으로 두고 이진분류

C를 양성 A,B를 음성으로 두고 이진분류

 

결과로 3개의 선형함수가 나올 것이다.

3개의 z값이 나올것이다.

 

그값을 소프트맥스 함수를 통과해서 확률값으로 바꾼다.

가장 높은 확률 값이 예측 클래스가 된다.

-------------------------------------------------------------------------------------------------------

 

7개의 z를 확률로 바꿔야 한다.

시그모이드로 바꾸면 다 더했을때 1이되야 한다.

 

하지만 다중 분류일때 시그모이드에 넣으면 안된다. 소프트맥스함수에 넣어야 한다.

 

 

소프트맥스 함수 

다중 분류일 때는 소프트맥스 함수에넣는다.

5개 샘플에 대해서 7개의 z값이 나온다.

 

z0, z1....z6을 e의 지수로 넣고 각각 더한것을 분모에 넣는다.

 

결과값이 시그모이드 값이 나오고 모두다 더하면 1이나올 것이다.

 

scipy에서 제공한다.

 

소수점을 제한하기위해서 round 함수를 사용한다.

 

 

그 외 

절편을 쓰는 이유 

x를 특성, t를 타겟으로 했을 때 

절편이 없다면 데이터를 원점을 지나는 것만 학습할 수 있다.

 

절편이 있어야 원하는 타겟을 학습 할 수 있다.

 

 

 

 

 

 

 

 

 

 

728x90