체인의정석

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

빅데이터&인공지능/인공지능

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

체인의정석 2020. 8. 10. 21:42
728x90
반응형
plt.plot(line)

로지스틱 회귀를 제외한 많은 선형 분류 모델은 태생적으로 이진 분류만을 지원합니다.

다중클래스는 지원하지 않습니다. 이진 분류 알고리즘을 다중 클래스 분류 알고리즘으로 확장하는 보편적인 기법은 일대다 방법입니다. 일대다 방식은 클래스의 수만큼 이진 분류가 발생하게 됩니다.

 

3개의 클래스를 가진 데이터셋에 일대다 방식을 적용해 보겠습니다.

from sklearn.datasets import make_blobs
X,y = make_blobs(random_state=42)
mglearn.discrete_scatter(X[:,0],X[:,1],y)
plt.xlabel("특성 0")
plt.ylabel("특성 1")
plt.legend(["클래스 0", "클래스 1", "클래스 2"])

linear_svm = sklearn.svm.LinearSVC().fit(X,y)
print("계수 배열의 크기 : " , linear_svm.coef_.shape)
print("절편 배열의 크기 : ", linear_svm.intercept_.shape)

계수 배열의 크기 : (3, 2) 절편 배열의 크기 : (3,)

coef의 행은 클래스에 대응하는 계수 백터 3개(파,초,주)를 가지고 있으며 열은 각 특성에 따른 계수 값을 2개 (0과1)을 가지고 있습니다.

intercept는 각 클래스의 절편을 담은 1차원 백터입니다. 이를 시각화 해보면 다음과 같습니다.

 

mglearn.discrete_scatter(X[:,0],X[:,1],y)
line = np.linspace(-15,15)
for coef,intercept,color in zip(linear_svm.coef_, linear_svm.intercept_,mglearn.cm3.colors):
    plt.plot(line, -(line*coef[0] + intercept)/coef[1],c=color)
plt.ylim(-10,15)
plt.xlim(-10,8)
plt.xlabel("특성 0")
plt.ylabel("특성 1")
plt.legend(['클래스0','클래스1','클래스2','클래스0경계','클래스1경계','클래스2경계'],loc=(1.01,0.3))

 

여기서 line에 들어가는 linspace 값을 확인해보면 다음과 같다.

np.linspace(-15,15)

array([-15. , -14.3877551 , -13.7755102 , -13.16326531, -12.55102041, -11.93877551, -11.32653061, -10.71428571, -10.10204082, -9.48979592, -8.87755102, -8.26530612, -7.65306122, -7.04081633, -6.42857143, -5.81632653, -5.20408163, -4.59183673, -3.97959184, -3.36734694, -2.75510204, -2.14285714, -1.53061224, -0.91836735, -0.30612245, 0.30612245, 0.91836735, 1.53061224, 2.14285714, 2.75510204, 3.36734694, 3.97959184, 4.59183673, 5.20408163, 5.81632653, 6.42857143, 7.04081633, 7.65306122, 8.26530612, 8.87755102, 9.48979592, 10.10204082, 10.71428571, 11.32653061, 11.93877551, 12.55102041, 13.16326531, 13.7755102 , 14.3877551 , 15. ])

 

-15~15까지의 값을 배열로 나타낸 것이다.

plt.plot(line)

plt.plot의 매게변수는 순서대로 x값, y값,변수에 대응된다.

 

따라서 2번째 인자값은 다음과 같이 볼 수 있다.

y=  -(line*coef[0] + intercept)/coef[1]

coef가 0일때는 나누는 값이 0으로 0이 나오고, 1일때는 1로 나누어서 y 값이 그대로 나오게 된다.

총 6개의 경우의 수 중에서 0인 값을  3개 제외한 1인 값만 3개가 남아서 3개의 직선이 나오게 된다.

 

그결과 아래와 같은 그래프가 나오게 된다.

 

3개의 선에 따라서 어떤 클래스인지가 나오며 경계 중앙에 있는 삼각형에서는 더 가까운 선에 있는 클래스로 취급되게 됩니다. 여기에 따라서 2차원 평면으로 구분을 하게 되면 다음과 같은 값이 나오게 됩니다.

 

mglearn.plots.plot_2d_classification(linear_svm, X, fill=True, alpha=.7)
mglearn.discrete_scatter(X[:,0],X[:,1],y)
line = np.linspace(-15,15)
for coef,intercept,color in zip(linear_svm.coef_, linear_svm.intercept_,mglearn.cm3.colors):
    plt.plot(line, -(line*coef[0] + intercept)/coef[1],c=color)
plt.ylim(-10,15)
plt.xlim(-10,8)
plt.xlabel("특성 0")
plt.ylabel("특성 1")
plt.legend(['클래스0','클래스1','클래스2','클래스0경계','클래스1경계','클래스2경계'],loc=(1.01,0.3))

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