매직코드
article thumbnail

로지스틱 회귀는 이름에는 회귀라고 붙어있지만 사실상 분류할 때 사용하는 모델이다.

분류와 회귀 알고리즘에 대해 알고싶다면 이전 포스팅을 참고하면 좋다.

2021.07.30 - [머신러닝] - 파이썬 머신러닝 04-3. 분류 알고리즘 (결정트리, 앙상블 보팅, 배깅)

2021.08.03 - [머신러닝] - 파이썬 머신러닝 04-4. 분류 알고리즘 (앙상블 부스팅)

2021.08.04 - [머신러닝] - 파이썬 머신러닝 05. 회귀

 

 

 

# 필요한 라이브러리 가져오기 및 버전확인

import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
import tensorflow as tf

tf.random.set_seed(777)  # for reproducibility
print(tf.__version__)

tf.random.set_seed(777)

tf.random.set_seed(숫자)

이 코드는 랜덤함수를 사용하게 될 때 동일한 값이 나오도록 하는 코드다.

예를들어 1~100까지 적힌 공 중에 랜덤으로 하나만 뽑는다고 하면 실행할 때마다 서로 다른 숫자가 나와서 이전코드와 지금코드를 잘 비교할 수 없는데, tf.random.set_seed(35)를 통해 랜덤으로 숫자 35가 적힌 공을 뽑고 다음에 실행했을 때도 동일하게 35가 적힌 공을 뽑겠다는 의미다.

 

 

 

# 데이터 세트 만들기
# 학습용 데이터
x_train = [[1., 2.],
          [2., 3.],
          [3., 1.],
          [4., 3.],
          [5., 3.],
          [6., 2.]]
y_train = [[0.],
          [0.],
          [0.],
          [1.],
          [1.],
          [1.]]

# 예측용 데이터
x_test = [[5.,2.]]
y_test = [[1.]]

실습이기 때문에 데이터를 직접 만들어줬다. 여기서 주의할 점은 대괄호[]의 개수를 보고 이 데이터가 몇차원 데이터인지 확인하라는 것이다. 여기서 나는 좀 더 잘 보이라고 줄바꿈을 해줬는데, [[]]형태로 작성되고 있기 때문에 이 데이터들은 2차원임을 알 수 있다.

 

데이터 세트를 좀 더 해석해보자면

x값으로 [1, 2]를 가지고 있는 데이터는 y값이 0

x값으로 [2, 3]를 가지고 있는 데이터는 y값이 0

x값으로 [3, 1]를 가지고 있는 데이터는 y값이 0

x값으로 [4, 3]를 가지고 있는 데이터는 y값이 1

x값으로 [5, 3]를 가지고 있는 데이터는 y값이 1

x값으로 [6, 2]를 가지고 있는 데이터는 y값이 1

이라는 의미이고, 이렇게 학습용 데이터로 어느정도 패턴을 찾게되면

예측용 데이터인 x_test를 통해 진짜로 y_test값을 잘 예측하는지를 확인해본다.

 

# x데이터 시각화
x1 = [x[0] for x in x_train]
x2 = [x[1] for x in x_train]

x1, x2

 

x[0] for x in x_train

x[0] : x값 중에 0번째에 위치한 값

for : 반목해라

x : x값을

in : ~ 안에서

x_train : x_train

--> x_train 안에 있는 모든 x값의 0번째에 위치한 값

 

x1에는 x_train 안에 있는 모든 x값의 0번째에 위치한 값을 넣고, x2에는 x_train 안에 있는 모든 x값의 1번째에 위치한 값을 넣어줬다.

 

# 데이터 시각화
colors = [int(y[0] % 3) for y in y_train]
plt.scatter(x1,x2, c=colors , marker='^')
plt.scatter(x_test[0][0],x_test[0][1], c="red")

plt.xlabel("x1")
plt.ylabel("x2")
plt.show()

 

colors = [int(y[0] % 3) for y in y_train]

colors를 따로 표기한 이유는 시각화 할 때 x1, x2에 따라 y값이 0인것과 1인것을 구별하기 위해서다.

코드를 보면 y_train에 있는 모든 y값을 순서대로 계산하는데 y의 [0]번째 값을 3으로 나누는 계산을 하라고 되어있다.

여기서 주의할 점은 %와 %%연산이 다르다는 것인데, %는 나누기의 나머지값을 구하는 의미고 %%는 나우기의 몫을 구하라는 의미다.

이 데이터에서 y값은 0과 1밖에 없으므로 아무리 나눠봐야 나머지는 0과 1만 나온다.

따라서 색상은 0과 1로 나눠서 주어질 예정이다.

 

plt.scatter(x1, x2, c=colors, marker='^')

plt.scatter(x축, y축, c=색상, marker='표시할모양')

scatter라는 그림을 그릴껀데, x축에는 x1, y축에는 x2의 값을 넣을꺼고, c=colors를 통해서 y값이 0이었던 데이터끼리 같은색, 1이었던 데이터끼리 같은 색을 가지도록 설정했다. marker로 ^를 작성해서 삼각형 모양으로 표시된다.

 

plt.scatter(x_test[0][0],x_test[0][1], c="red")

plt.scatter(x축, y축, c=색상)

이렇게 코드를 작성하면 새로운 그래프가 생기는 것이 아니라 위에서 생성한 plt.scatter에 이어서 표기를 해준다.

x_test[0][0]의 경우, x_test가 2차원이기 때문에 행렬의 모양으로 원하는 값의 위치를 표현해줬다.

실제로 x_test는 [[5, 2]]로 넣어줬기 때문에 2차원인 행렬로 표현하자면 아래와 같다.

x_test [0]번째 열 [1]번째 열
[0]번째 행 5 2
[1]번째 행 빈 값 빈 값

따라서 x_test[0][0] 값은 5, x_test[0][1]값은 2가 된다. 이 값을 c="red" 빨간색으로 표시하겠다고 작성한 코드이다.

결과를 보면 y값이 0인 경우 보라색 삼각형으로,  y값이 1인 경우 노란색 삼각형으로 표시되었고, 우리가 확인하고싶은 x_test는 빨간색 동그라미로 표시되었다. 이 그래프상에서 볼 때 빨간색 동그라미는 y값이 1인 노란색 삼각형 무리와 더 가까이 있기때문에 x_test의 값도 1이라는 것을 눈으로 확인할 수 있다.

 

이정도는 눈으로 확인할 수 있지만 더 복잡하고 많은 데이터들이 있는 경우에는 컴퓨터의 좀 더 정확한 분류값을 기준으로 y값을 예측해야한다. 이 때 사용하는 분류 모델이 로지스틱 회귀 모델이다.

 

로지스틱 회귀 모델 사용

사실 지금 내가 보고있는 강의에서는 로지스틱 회귀모델을 하나씩 만들어서 사용하던데 나는 그냥 만들어져 있는 회귀모델을 가져오려고한다. 사이킷런에 있는 로지스틱회귀 메소드를 사용하면 회귀모델을 하나씩 만들 필요 없이 바로 모델을 사용할 수 있다.

대신 사이킷런을 사용해본 적이 없는 사람들은 사이킷런을 설치해야한다. 설치방법은 구글링!

# 로지스틱 회귀 모델 사용
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score

lr = LogisticRegression()
lr.fit(x_train, y_train)

lr_pred = lr.predict(x_test)
print('정확도 : ', accuracy_score(y_test, lr_pred))

로지스틱 회귀 모델을 사용하기 위해서 LogisticRegression을 가지고왔고, 정확도도 확인하기 위해서 accuracy_score도 가지고 왔다.

먼저 변수에 LogisticRegression()를 함수 형태로 담아준다.

 

lr.fit(x_train, y_train)

모델변수.fit(학습용x값, 학습용y값)

로지스틱 회귀 모델을 lr이라는 변수에 담아주었고, 그 회귀모델에 사용할 데이터값을 fit()을 이용해서 적용시켜준다.

여기서 x_train은 학습용 변수값이고 y_train은 학습용 결과값이다. 이 학습용 변수과 결과를 가지고 로지스틱 회귀모델이 학습을 하도록 돕는 명령어가 fit()이다.

 

lr.predict(x_test)

모델변수.predict(예측하고자 하는 변수데이터)

lr에는 위에서 fit()을 통해 학습을 시켜주었기 때문에 어떤 값이 들어오면 어떤 값을 결과값으로 출력해줘야하는지 모델이 만들어져있다.

이제 우리는 예측하고자 하는 변수값을 predict()에 넣어서 모델로 하여금 예측값을 출력할 수 있도록 해준다.

좀 더 쉽게 말하자면 fit()을 통해 모델에 x가 1이면 예측값이 1, x가 2면 예측값이 2, x가 3이면 예측값이 3이라는 학습을 시켜주고 predict()을 통해 모델한테 x가 4면 예측값이 얼마일까? 하고 물어보는 과정이다.

 

accuracy_score(y_test, lr_pred)

accuracy_score(정답, 예측값)

얼마나 잘 예측하고 있는지 확인을 위해서 accuracy_score()를 이용하면 된다.

accuracy_score()는 얼마나 정확하게 예측했는지를 알아보는 값으로, 우리가 원래 x가 4면 예측값이 4라는 정답을 가지고 있고 모델한테는 정답이 4라는 것을 알려주지 않고 예측하라고 한 부분이기 때문에 정확도는 y_test에 담긴 정답과 lr_pred에 담긴 예측값을 비교하여 얼마나 맞췄는지 퍼센트로 계산해준다.

따라서 정확도가 1.0이면 100%로 숫자가 1에 가까울수록 정확도가 높은 모델임을 알 수 있다.

 


내가 처음 이 모델학습을 배웠을 때는 예측값을 직접 눈으로 보길 원했는데 대부분의 머신러닝에서는 만개 이상의 데이터를 다루기 때문에 일일히 예측값을 확인하는 과정보다 정확도가 얼마인지 혹은 오류값이 얼마인지 확인하는 것을 지표로 모델을 사용할지 더 고도화시킬지 결정한다.

 

예측값이 실제로 얼마인지 확인하는 것은 어렵지 않고, 부동산 가격 예측의 경우처럼 예측값을 확인해야하는 경우라면 데이터 프레임에 예측값에 대한 칼럼을 추가해서 넣어주면 된다.


코드실습 다른 글

[코드] 단순회귀분석(Simple Linear Regression)을 TensorFlow로 구현하기 실습.쥬피터

 

 

 

 

profile

매직코드

@개발법사

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!