3. Single-Layer Neural Network For Multi-class classification문제 - 원핫인코딩 / argmax / MNIST의 등장
Binary Classification문제란 y값이 0or1(False or True를 (기준조건문).astype('int')로 squarshing)로 나오는 문제였다.
이번에는 Mulit-class Classification문제로서, 가장 기초적인 예가 categorical한 상품 분류(의류 / 가전제품/ 의약품)에 대한 것이다.
먼저 그림으로 살펴보자.
위 그림과 같이,
Binary classification문제( 0 or 1) 해결을 위해 만든 Single-Layer Neural Network를 똑같이 유지한 상태(input이 x1,x2,,xn,1로 1개)에서
카테고리 수만큼 h(x), L(y,h(x)), J(w,b) = Output를 만든 뒤, 각각의 Output( 0or1 ) 가운데 가장 높은 값을 선택하면 되는데,
실제 그라디언트 디센트 알고리즘을 태울 때는,
(1) y값(정답 0 or 1 or 2)을 One-hot-encoding( np.eye(3)[y] )을 통해 [1,0,0] [0,1,0] [0,0,1]형태로 y_hot 만들어놓고
(2) y_predict_hot까지를 [ 0.4, 0.9, 0.8]형태의 확률로 예측하게 만든다.
(3) w 업데이트에 있어서는 classification용 Log씌운 Loss function인 L(y,h(x))의 편미분결과(전과 같음)의 평균을 이용하는데
이 때, y_predict -y가 아닌, 아직 롤백전인 one-hot-coding 형태[ , , ]인 ( y_predict_hot - y_hot )을 이용한다.
만약 X.T.dot()을 썼다면, .mean()대신 / X.shape[0]을 나눠준다.
(4) accuracy를 구하기 위해서, argmax(axis=1)을 이용하여 y(정답)형태로 롤백 한 y_predict 와 y를 비교한다.
(3) 거기에 정답의형태로 롤백하기 위해,
Multi-class Classification에 있어서, 불러온 데이터로 그라디언트(SL.N.N)를 태우기 전에,
전처리해줘야할 것이 있는데 y(label)을 --> identity matrix를 이용한 One-hot encoding 과정이 필요하다.
또한, one-hot-encoding된 y값을 예측한 y_predict_hot은 .argmax(axis=1)을 통해 정답형태로 롤백해줘야 accuracy를 구할 수 있다.
실습
임시요약
Multi-class classification
1) 데이터를 퍼올 땐 feature들의 데이터를 대문자 X, label 데이터를 소문자 y를 이용해 받아온다.
2) y값은 np.eye()를 통한 one-hot-encoding으로 변형시켜주어야한다. ---> y_hot
- y는 0,1,2 순으로 정답이 나와있어야 한다.
- y의 unique한 len을 알고 있어야하며, 그것을 np.eye( )[y]인자로 넣어주어야한다.
3) y_predict_hot은 [ one-hot-encoding 된 y]의 형태로 학습된 y_hot에 대해서, w와 b를 예측하므로,
y_hot 의 1개 데이터가 = [ 0, 1, 0] 이었다면 -----> y_predict_hot = [ 0.3, 0.9, 0.5 ]형태로 나온다.
4) y_predict_hot은 argmax(axis=1)을 이용하여, y형태로 롤백된다. ---> y_predict
- argmax(aixs=1)은 3개 중 가장 높은 확률의 index를 산출해주는데, 그게 자동으로 가장 근접한 y(label)형태로 반환된다.
5) 반환된 y_predict와 y를 이용해서 조건문을 이용하여 비교하면, 150개 에 대해서 0 or 1로 나올 것이다. 그것의 평균을 정확도로 한다.
6) cost function의 편미분값으로 w를 업데이트 시켜주는 Graident 를 태울 때는, 아직 one-hot-encoding형태를 사용하여 차이를 구하는데
y_predict_hot - y_hot 으로 차이를 구한다.
- w의 경우, dot product를 이용했다면 --> .mean()대신 X.shape[0]을 통해 데이터의 개수로 나누어서 평균을 적용시킨다
- b의 경우, mean(axis=0)을 통해 150개 데이터에 대한 세로줄의 평균을 구해서 업데이트 한다.
7) y_predict 식의 검증이 끝났다면, 기존 데이터에 새로운 칼럼으로 추가해준다.
my) y는 np.eye( 라벨의 갯수) 로 원핫인코딩 ---> y_predict는 y_predict_hot에다가 argmax(axis=1)로 롤백
실습 - MNIST
어떤 문제를 Single-Layer Neural Network로 풀기로 마음 먹었다면,
X(feature)와 y(label) 데이터를 가져온 뒤,
그림을 그려봐야한다.!!!
-> MNIST( multi-classification)을 Single-Layer N.N. 버전으로 풀기 복습 완료(로컬 노트북)