본문 바로가기

Theory/Statistics

Classification - Logistic Regression (2)

반응형

Classification - Logistic Regression (1)


지난 포스트에 이어 이번 포스트에서는 파이썬을 이용해 logistic regression 을 수행해보려 합니다. 파이썬에서는 sklearn.linear_model 모듈의 LogisticRegression 함수를 사용하며 간단한 iris (붓꽃 데이터)에 대해 실험해 보겠습니다.

붓꽃 데이터는 sklearn.datasets 안에 들어있는 toy dataset으로 150개의 데이터와 5개의 컬럼으로 (Sepal Length/Width, Petal Length/Width, Species) 이루어진 데이터로 타겟은 Species 열이며 3 종류로 구분합니다. 여기서는 2/3 번째 열인 꽃잎의 길이와 너비 정보만을 이용하여 붓꽃의 종류를 예측해보도록 하겠습니다. 먼저 데이터를 불러오고

from sklearn import datasets
import numpy as np

# 붓꽃 데이터 가져오기
iris = datasets.load_iris()

# iris의 data에서 2번과 3번 컬럼만 추출
X = iris.data[:, [2, 3]]
# iris의 target을 대입
y = iris.target

sklearn.model_selection 모듈의 train_test_split 함수를 이용하여 30%의 비율로 train/test 데이터셋을 나누어줍니다. 이때, stratify 파라미터에 레이블 데이터를 대입하여 train/test 데이터셋의 클래스 비율이 같도록 맡추어 줍니다. np.bincount 함수로 각 범주별 개수를 알 수 있습니다.

# 훈련 데이터와 테스트 데이터 분할
from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.3, random_state=1, stratify=y)

# 종속 변수의 데이터 개수 파악
print('y의 레이블 카운트:', np.bincount(y))
print('y_train의 레이블 카운트:', np.bincount(y_train))
print('y_test의 레이블 카운트:', np.bincount(y_test))

이후 sklearn.preprocessing 모듈의 StandardScaler 함수를 이용하여 각 독립 변수의 분포가 평균이 0, 표준편차가 1이 되도록 정규화해준 이후에 LogisticRegression 함수를 이용해 분류 모델을 학습합니다.

from sklearn.preprocessing import StandardScaler

# 평균이 0과 표준편차가 1이 되도록 변환.
sc = StandardScaler()
sc.fit(X_train)
X_train_std = sc.transform(X_train)
X_test_std = sc.transform(X_test)

from sklearn.linear_model import LogisticRegression

# 로지스틱 회귀 분석 객체를 생성
lr = LogisticRegression(C=1000.0, random_state=1)
# 데이터 훈련
lr.fit(X_train_std, y_train)

# 3개의 테스트 결과 확률 확인
print("테스트 모델의 분류 결과:", lr.predict_proba(X_test_std[:3, :]).argmax(axis=1))
print("실제 모델의 분류 결과:", y_test[:3])

LogisticReression 의 fit 함수를 통해 모델을 훈련하면 predict_proba 함수로 각 클래스 별 확률, predict 함수로 예측한 분류를 알 수 있습니다. predict 함수에서 도출되는 클래스는 predict_proba 의 각 클래스 별 확률의 최대 인덱스와 같습니다.

LogisticRegression 함수에는 다양한 파라미터가 존재합니다. $C$ 파라미터는 정규화 계수로 $C$가 작을수록 정규화가 크게 작용합니다.

또한, 지난 포스트에서 살펴봤듯이 OVR/multinomial 의 두 가지 방법으로 multi-class 분류를 할 수 있습니다. 위의 코드는 multi_class 파라미터가 디폴트로 'auto' 로 선언되어 있는 경우로 지금처럼 라벨이 [0,1,2] 세가지인 경우는 자동으로 multi_class='multinomial' 을 선택하게 됩니다. multi_class 파라미터에 'ovr'을 대입하면 One-Vs-Rest (One-Vs-All) 방법으로 multi-class 분류를 수행합니다.

반응형