일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 머신러닝기초
- 스마트컨트렉트테스트
- ethers v6
- 오블완
- ethers
- 스마트컨트렉트프록시
- 컨트렉트 배포 자동화
- 러스트 기초 학습
- 컨트렉트 동일한 함수이름 호출
- 러스트기초
- 티스토리챌린지
- 스마트컨트렉트 함수이름 중복 호출
- 체인의정석
- nest.js설명
- ethers websocket
- git rebase
- chainlink 설명
- 스마트 컨트렉트 함수이름 중복
- SBT표준
- ethers typescript
- ethers type
- ambiguous function description
- vue기초
- 러스트 기초
- multicall
- 스마트컨트렉트 예약어 함수이름 중복
- Vue.js
- 프록시배포구조
- Vue
- rust 기초
- Today
- Total
체인의정석
머신러닝 스터디 02-선형모델(분류 편)- 다중 클래스 분류용 선형 모델 본문
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
깃허브에서 소스코드/모든 시리즈 보러가기
github.com/hynki95/machine_learning
'빅데이터&인공지능 > 인공지능' 카테고리의 다른 글
A* 에이스타 (Best First Search)와 발견적 탐색(휴리스틱 서치, Heuristic) (0) | 2023.09.16 |
---|---|
대표적인 그래프 탐색(BFS - UCS, DFS - IDS)과 각 탐색에 대한 평가 (0) | 2023.09.16 |
머신러닝 스터디 02-선형모델(회귀 편)선형회귀,릿지회귀,라쏘회귀 (0) | 2020.07.12 |
머신러닝 스터디 02-선형회귀(회귀편)KNeighborsClassifier 분석, k-최근접 이웃 회귀 (0) | 2020.07.11 |
머신러닝 스터디 02- 지도학습(분류 & 회귀) (0) | 2020.07.07 |