체인의정석

머신러닝 스터디 02-선형모델(분류 편)- 분류용 선형 모델 본문

빅데이터&인공지능

머신러닝 스터디 02-선형모델(분류 편)- 분류용 선형 모델

체인의정석 2020. 7. 18. 17:20
728x90
반응형

로지스틱 회귀 & 서포트 벡터 머신이 가장 널리 알려진 두 개의 선형 분류 알고리즘

 

일단 아래의 코드는 모든 예제에서 넣어주기로 합니다.

from IPython.display import display
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import mglearn
import sklearn
from sklearn.datasets import make_blobs
plt.rc('font', family='NanumGothic')
plt.rcParams['axes.unicode_minus'] = False

서포트 백터 머신과, 로지스틱 회귀를 비교하기 위해 아래와 같이 설정하였습니다.

여기서 만들어진 경계를 결정 경계라고 부릅니다.

이회귀는 릿지와 마찬가지로 L2 규제를 사용합니다. 여기서 과대적합을 막기 위하여 규제의 강도를 정하는 매개변수는 C값입니다. C값을 낮게하면 기울기가 0에 가깝게 만들어져서 규제가 높아지고 C값을 높게 하면 규제가 감소하여 훈련세트에 최대한 맞추려고 합니다. 이는 C값이 낮아지면 다수의 포인트에 맞추고 C값이 높아지면 데이터 개개의 포인트를 정확히 분류하려 노력하려는 것으로도 해석할 수 있습니다.

from sklearn.linear_model import LogisticRegression
from sklearn.svm import LinearSVC


X, y = mglearn.datasets.make_forge()
fig, axes = plt.subplots(1,2,figsize=(10,3))

for model, ax in zip([LinearSVC(), LogisticRegression()],axes):
    clf = model.fit(X,y)
    mglearn.plots.plot_2d_separator(clf, X, fill=False, eps=0.5,ax=ax,alpha=.7)
    mglearn.discrete_scatter(X[:,0],X[:,1],y,ax=ax)
    ax.set_title("{}".format(clf.__class__.__name__))
    ax.set_xlabel("특성 0")
    ax.set_ylabel("특성 1")
axes[0].legend()

다음은 LinearSVC를 사용한 예 입니다.

이 예시를 통해서 C값에 따른 분류의 변화를 볼 수 있는데 왼쪽 C값이 작은 경우에는 전체적인 분류에 초점이 맞추어져있지만 잘못된 분류가 2개가 있고 오른쪽의 경우에는 분류의 정확도는 높지만 전체적인 분류를 두고 보았을때 경계선은 과대적합이 되어 있는것을 확인 할 수 있습니다.

 

mglearn.plots.plot_linear_svc_regularization()

위의 예시는 1차원이라 단순하고 과대적합의 문제가 없지만 만약 여기서 차원이 더 높아지게 된다면 과대적합이 되지 않도록 하는것이 더 중요해 집니다.

 

Logistric Regression의 경우에는 유방암 데이터셋을 통한 예시를 통해 알아보겠습니다.

 

 

--------------------------------------------------------------------------- NameError Traceback (most recent call last) <ipython-input-9-7f94546fcfd9> in <module> 1 from sklearn.datasets import load_breast_cancer 2 cancer = load_breast_cancer() ----> 3 X_train, X_test, y_train, y_test = train_test_split( 4 cancer.data, cancer.target, stratify=cancer.target, random_state=42) 5 logreg = LogisticRegression().fit(X_train,y_train) NameError: name 'train_test_split' is not defined

 

책에 있는 내용을 그대로 쓰면 에러가 나니 아래와 같이 쓰도록 합니다.

from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
cancer = load_breast_cancer()
X_train, X_test, y_train, y_test = train_test_split(
cancer.data, cancer.target, stratify=cancer.target, random_state=42)
logreg = LogisticRegression(max_iter=1000000).fit(X_train,y_train)
print("훈련 세트 점수: {:.3f}".format(logreg.score(X_train,y_train)))
print("테스트 세트 점수: {:.3f}".format(logreg.score(X_test,y_test)))

train_test_split을 쓰기 위해서는 위와 같이 model_selection에서 불러와 주어야 한다고 합니다.

또한 기본적으로 max_iter 는 100으로 설정되어 있기 때문에 이를 늘려주어야 오류가 나지 않습니다.

 

훈련 세트 점수: 0.958 테스트 세트 점수: 0.958

 

아무튼 불러와 주게 되면 위와 같이 점수가 나오게 됩니다. 

기본값 C=1일때 훈련 세트와 테스트 세트 정확도가 높지만 같은값이 나오게 되는걸 보니 과소적합이 의심됩니다. 따라서 C를 증가시켜 보겠습니다.

 

C가 100 이 되면 규제가 낮아져서 복잡도가 증가하여 정확도가 늘어납니다. 

logreg100 = LogisticRegression(C=100, max_iter=1000000).fit(X_train,y_train)
print("훈련 세트 점수: {:.3f}".format(logreg100.score(X_train,y_train)))
print("테스트 세트 점수: {:.3f}".format(logreg100.score(X_test,y_test)))

훈련 세트 점수: 0.984 테스트 세트 점수: 0.965

 

 

C가 0.01이면 규제가 더 강해지게 되며, 이미 과소적합된 모델에서 더 단순화가 되기 때문에 복잡도가 감소하여 정확도는 낮아지게 됩니다.

logreg001 = LogisticRegression(C=0.01, max_iter=1000000).fit(X_train,y_train)
print("훈련 세트 점수: {:.3f}".format(logreg001.score(X_train,y_train)))
print("테스트 세트 점수: {:.3f}".format(logreg001.score(X_test,y_test)))

훈련 세트 점수: 0.953 테스트 세트 점수: 0.951

 

이처럼 이진 분류에서의 선형 모델과 회귀에서의 선형 모델 사이에서는 유사점이 많으며, 주요 차이는 규제에서 모든 특성을 이용할지 일부 특성만을 사용할지 결정하는 penalty 매개변수 입니다. L2규제를 사용하면 규제가 강해지면 0에 가까워지지만 0이 되지 않고 L1 규제를 사용하면 규제가 강해지면 결국 0 이 되어서 이해하기가 더 쉬워집니다.

 

IT 유튜브 타임해커 보러가기

www.youtube.com/channel/UCHsRy47P2KlE749oAAjb0Yg?view_as=subscriber

 

타임해커

-블록체인/인공지능 -웹개발(프론트/백) -광고(페이스북/구글/네이버) -사업계획서 작성 -비전공생을 위한 IT 공부법 채널이름은 기획,마케팅,개발을 다 같이해서 업무성과를 내는데 드는 시간을

www.youtube.com

 

깃허브에서 소스코드/모든 시리즈 보러가기

github.com/hynki95/machine_learning

 

hynki95/machine_learning

Contribute to hynki95/machine_learning development by creating an account on GitHub.

github.com

 

728x90
반응형
Comments