Machine Learning/Advanced (hands on machine learning)

11. 모델 훈련 - 로지스틱 회귀

jwjwvison 2021. 5. 19. 21:42

 <로지스틱 회귀>

 어떤 회귀 알고리즘은 분류에서도 사용할수 있다. 로지스틱 회귀는 샘플이 특정 클래스에 속할 확률을 추정하는 데 널리 사용된다. 추정 확률이 50%가 넘으면 모델은 그 샘플이 해당 클래스에 속한다고 예측한다. (즉, 레이블이 '1'인 양성 클래스). 아니면 클래스에 속하지 않는다고 예측한다(즉, 레이블이 '0'인 음성 클래스). 이를 이진 분류기라고 한다.

 

 선형 회귀 모델과 같이 로지스틱 회귀 모델은 입력 특성의 가중치 합을 계산한다.(그리고 편향을 더한다). 대신 선형 회귀처럼 바로 결과를 출력하지 않고 결과값의 로지스틱을 출력한다.

 

 로지스틱 회귀를 설명하기 위해 붓꽃 데이터셋을 사용하겠다. 이 데이터셋은 세 개의 품종 Iris-setosa, Iris-Versicolor, Iris-Virginica에 속하는 붓꽃 150개의 꽃잎과 꽃받침의 너비와 길이를 담고 있다.

 

 꽃잎의 너비를 기반으로 Iris-Versicolor 종을 감지하는 분류기를 만들어보겠다.

from sklearn import datasets
iris=datasets.load_iris()
list(iris.keys())

X=iris['data'][:,3:]   #꽃잎의 너비
y=(iris['target']==2).astype(np.int)    # Iris-Virginica면 1, 그렇지 않으면 0

 

 로지스틱 회귀 모델을 훈련시킨다.

from sklearn.linear_model import LogisticRegression

log_reg=LogisticRegression()
log_reg.fit(X,y)

 

 꽃잎의 너비가 0~3cm인 꽃에 대해 모델의 추정 확률을 계산해보겠다.

X_new=np.linspace(0,3,1000).reshape(-1,1)
y_proba=log_reg.predict_proba(X_new)
plt.plot(X_new,y_proba[:,1],'g-',label='Iris virginica')
plt.plot(X_new,y_proba[:,0],'b-',label='Not Iris virginica')

log_reg.predict([[1.7],[1.5]])

 다른 선형 모델처럼 로지스틱 회귀 모델도 l1,l2 패널티를 사용하여 규제할 수 있다. 사이킷런은 l2 패널티를 기본으로 한다.

 

<소프트 맥스 회귀>

로지스틱 회귀 모델은 여러 개의 이진 분류기를 훈련시켜 연결하지 않고 직접 다중 클래스를 지원하도록 일반화될 수 있다. 이를 소프트맥스 회귀 또는 다항 로지스틱 회귀 라고 한다.

 

 소프트 맥스 분류기는 다음 식처럼 추정 확률이 가장 높은 클래스를 선택한다.

 

 소프트맥스 회귀를 사용해 붓꽃을 세 개의 클래스로 분류해보자. 사이킷런의 Logistic Regression은 클래스가 둘 이상일 때 기본적으로 일대다(OvA)전략을 사용한다. 하지만 multi_class 매개변수를 'multinomial'로 바꾸면 소프트맥스 회귀를 사용할 수 있다. 소프트맥스 회귀를 사용하려면 solver 매개변수에 'lbfgs'와 같이 소프트맥스 회귀를 지원하는 알고리즘을 지정해야 한다. 또한 기본적으로 하이퍼파라미터 C를 사용하여 조절할 수 있는 l2규제가 적용된다.

X=iris['data'][:,2:]
y=iris['target']

softmax_reg=LogisticRegression(multi_class='multinomial',solver='lbfgs',C=10)
softmax_reg.fit(X,y)

 

 꽃의 길이가 5cm, 너비가 2cm인 붓꽃을 발견했다고 가정하고 이 붓꽃의 품종이 무엇인지 모델에 질의하면 94.2%의 확률로 Iris-Virginica(클래스 2)라고 출력할 것이다.

softmax_reg.predict([[5,2]])

softmax_reg.predict_proba([[5,2]])