programming/파이썬으로 배우는 통계학

사이킷런을 활용한 신경망 머신러닝_파이썬/머신러닝

Jofresh 2023. 6. 13. 00:23
728x90
반응형

 

이번에는 실제로 파이썬을 이용해서 신경망을 만들어보겠습니다.

sklearn을 사용할 것이며, sklearn함수들은 GPU를 사용하지 않기 때문에 복잡한 모델을 추정하려면 시간이 걸립니다. 하지만 이번에 해볼 간단한 구조의 다층퍼셉트론을 돌려보기엔 충분합니다!

복잡한 모델을 추정할 때는 텐서플로케라스 같은 도구를 사용하는 게 좋습니다.

**텐서 플로나 케라스도 다음에 함께 알아보겠습니다.

 

 

 

 

필요한 라이브러리 임포트

# 수치 계산에 사용하는 라이브러리
import numpy as np
import pandas as pd
import scipy as sp

# 통계 모델을 추정하는 라이브러리(워크닝이 나올 수도 있습니다)
import statsmodels.formula.api as smf
import statsmodels.api as sm

# 다층 퍼셉트론 적용
from sklearn.neural_network import MLPClassifier

# 샘플 데이터 가져오기
from sklearn.datasets import load_iris

# 테스트 데이터와 훈련 데이터로 나누다
from sklearn.model_selection import train_test_split

# 데이터의 표준화를 실시하다
from sklearn.preprocessing import StandardScaler

# 표시 자릿수 지정
%precision 3

 

 

 

데이터 읽기와 다듬기

사이킷런에 들어 있는 붓꽃의 종류별 특징 데이터를 사용하겠습니다.

 

iris = load_iris()

 

어떤 데이터가 들어 있는지 살펴볼께요! 우선 독립변수(입력 벡터)의 이름을 확인해볼게요.

 

각각 꽃받침과 꽃잎의 길이와 폭입니다.

 

 

다음은 종속변수를 살펴볼께요. 3종류의 붓꽃이 있다는걸 확인했습니다.

 

setosa , versicolor, virginica

 

 

독립변수 = iris.data

 

종속변수 = iris.target에 저장되었습니다.

 

이번에는 모든 데이터를 사용하지 않고, 독립변수 2종류붓꽃의 2종류만 사용하겠습니다. 

 

총 150개 데이터중 50번째 데이터부터 붓꽃의 종류가 바뀌니 [50:150]이라고 명시해서 앞에서 50개는 건너뛰겠습니다.

 

그리고 독립변수는 첫 2줄(꽃받침)만 대상으로 합니다.

 

**참고로 붓꽃의 종류는 위에서 나온 타겟 이름이 아니라 0,1,2로 맵핑되어서 저장되어 있습니다.

예측 정확도를 평가하기 위해 훈련 데이터와 테스트 데이터를 분리하겠습니다. 

 

sklearn.model_selection의 train_test_slp 함수를 사용해서 랜덤으로 데이터를 추출할 수 있습니다.

 

훈련데이터는 전체 데이터 중 75%, 테스트 데이터는 전체 데이터 중 25%가 되게 합니다. 

 

재현성을 유지하기 위해 random_state를 지정합니다.

 

 

 

신경망을 구현해보기 전에 로지스틱 회귀를 이용해서 분석을 해볼께요.

 

 

 

우선 종속변수에 어떤 데이터가 있는지 확인해보겠습니다.

 

 

1과 2를 이용해서 서로 다른 종을 나타내고 있습니다. 로지스틱 회귀를 이용해서 1과 2중 어떤 종에 속하는지 자동으로 분류해보겠습니다.

 

statmodels를 사용해서 로지스틱 회귀를 구현하겠습니다. 그전에 먼저 데이터를 정리하겠습니다.

 

statmodels를 사용해서 로지스틱 회귀를 구현해보겠습니다. 그전에 먼저 데이터를 정리하겠습니다.

그리고 종속변수가 0 또는 1이 되게끔 앞서 확인한 종속변수 데이터에서 1을 빼겠습니다.

 

 

다음엔 모델링을 합니다. 사용하는 변수를 바꾼 후 AIC를 이용해서 변수 선택을 합니다.

 

보시다시피 길이(len)만 이용한 모델이 폭과 길이 두 개 모두 이용한 모델보다 AIC가 낮게 나왔습니다.

그러므로 독립변수로는 꽃받침 길이 1개만 사용한 logi_mod_len을 사용하겠습니다.

 

 

추정된 계수를 보면 꽃받침의 길이는 양의 계수를 가지고 있다는 걸 확인할 수 있습니다. 길이가 길수록 2번 종일 가능성이 크다는 걸 알 수 있습니다

 

 

마지막으로 훈련 데이터에 대한 피팅 정확도테스트 데이터를 얼마나 정확하게 맞추는지 보겠습니다. 여기서 로지스틱 회귀의 예측값은 확률로 얻어지므로 소수점 이하 반올림하여 0 또는 1로 떨어지게끔 하였습니다.

훈련 데이터와 테스트 데이터에 대해 둘 다 70% 전후로 맞출 수 있습니다.

 

자 ! 이제 신경망을 다루겠습니다.

 신경망을 이용하려면 릿지 회귀와 마찬가지로 독립변수를 표준화 해야 합니다. sklearn.preprocessing의 StandardScaler 함수를 사용해서 간단하게 해보겠습니다.

 

여기서 표준화를 할 때 scaler.ift(X_train)의 결과와 훈련 데이터를 대상으로 fit함수를 적용했습니다. 

이렇게 함으로써 훈련 데이터에 적용한 것과 똑같은 변환을 테스트 데이터에도 적용할 수 있습니다.

 

훈련 데이터의 독립변수의 표준편차가 1인지 확인합니다.

 

 

훈련 데이터의 표준 편차가 1로 변환되어 있다고 해서 테스트 데이터의 표준 편차도 1이 된다고 할 수는 없습니다. 

 

훈련 데이터와 테스트 데이터에서 똑같은 변환을 적용했다는 것이 중요합니다. 우리는 아직 테스트 데이터를 모른다는 것을 전제로 분석을 해야 하기 때문입니다.

 

 

신경망을 이용하여 피팅의 정확도와 테스트 데이터에 대한 예측 정확도를 출력하는 코드는 아래와 같습니다.

 

MLPClassifier라는 함수를 사용해서 간단하게 모델을 만들 수 있습니다.

 

hidden_layer_size = (100,100)이라고 지정해서 은닉층을 2층으로 하여 각각의 은닉층에 100개의 유닛을 배치했습니다.

입출력층까지 합해서 모두 4층의 신경망입니다.

 

alpha = 0.07로 하여 정규화의 강도를 지정합니다.

 

max_iter = 10000으로 파라미터 추정을 하기 위해 최대 몇번이나 반복 계산할지 지정합니다. 

 

random_state = 0으로 난수를 고정합니다.

 

활성화함수는 ReLU가 쓰였고, 파라미터 추정 알고리즘으로는 Adam이 디폴트로 지정되어 있습니다.

 

 

nnet.score 함수를 사용하면 적중률을 간단히 계산할 수 있습니다. 예측과 평가라는 관점에서는 statsmodel보다 사이킷런 쪽이 효율 좋은 코드를 작성할 수 있습니다. 하지만 모델의 해석을 하게 될 경우에는 statsmodels가 편리합니다.

 

훈련 데이터의 피팅 정확도는 극적으로 증가했지만, 테스트 데이터의 예측 정확도는 로지스틱 회귀모델과 똑같습니다. 물론 MLPClassifire의 인수를 바꾸어 모델의 구조를 변경하는 것으로 예측 정확도를 높이는 방법도 있지만 여기서 분석을 마치는 걸로 하겠습니다.

 

선형모델의 장점과 신경망의 장점

신경망 모델의 구조를 배울 때 '신경망 모델은 선형모델 보다 복잡하게 확장한 것'이라고 설명했습니다. 

 

선형모델로는 표현할 수 없는 복잡한 데이터도 신경망이라면 잘 모델링 할 수 있을 가능성이 큽니다. 이번에는 신경망의 예측 정확도가 그다지 높지 않았지만 하이퍼파라미터 튜닝으로 정확도를 높일 여지가 있습니다.

 

하지만 신경망은 복잡한 모델의 훈련 데이터에 과적합될 위험성이 있습니다. 그리고 결과의 해석이라는 점에서 보면 로지스틱 회귀 쪽이 다루기 쉽다는 점도 있습니다.

 

신경망이나 로지스틱 회귀 어느 한쪽이 우수하다는 것보다 중요한 것은 미리 분석 방법을 결정해두는 것이 아니라 데이터나 목적에 따라서 적합한 분석 방법을 정하는 것입니다.

 

만능 모델이라는 것은 없으므로 신경망은 물론 일반선형모델도 장단점이 많이 있습니다. 이때 하나하나 장단점을 외워서 적용하는 방법은 좋지 않고, 각 모델의 기본이 되는 이론을 배우는게 멀리 돌아가는 것 같지만 지름길이 될 수 있습니다. 

 

 

 

로지스틱 모델에 대해서 알아보고 싶다면 아래 이전 포스팅을 참고해주세요.

 

[파이썬/통계] Python 통계 : 일반선형모델 기본/ 로지스틱회귀 모델/null 모델

일반선형모델의 기본 예를 들어'있다, 없다'라는 두 개의 값만 취하는 데이터나 '1개,2개,3개'등 0 이상의 정수만 취하는 데이터가 있다면 모집단분포가 정규분포라고 가정하기에는 무리가 있습

jofresh.tistory.com

 

728x90
반응형