논문/눈문 관련 인공지능 공부

ch.5 분류(Classification)

forgetissimo 2021. 7. 23. 23:26
728x90

5.1 이항 분류

5.2 다항 분류

5.3 Fashion MNIST

 

분류(Classification)는 회귀와 함께 머신러닝에서 가장 기초적인 데이터 분석 방법 중 하나다.

-분류는 데이터가 어느 범주에 해당하는지 판단하는 문제로서 유사한 것들을 같은 범주로 묶으면 주변에서 일어나는 일을 빠르게 판단하는 데 도움이 된다.

5.1 이항 분류

(Binary Classification): 정답의 범주가 두 개인 분류 문제다. 개와 고양이처럼

  • 와인 종류 구분하기

5.1 캘리포니아 어바인 대학에서 제공하는 와인 데이터 세트 불러오기

-> 데이터 정제 및 분석을 위해 판다스 라이브러리를 사용

 pd.read_csv()는 CSV파일을 pandas에서 사용하는 데이터 프레임으로 읽어오는 함수다

데이터 프레임: 행(인덱스)과 열(속성)로 구성된 데이터를 다루는 테이블 구조

head() 함수 : 이 가운데 일부를 출력해서 보여준다.  head(10) -> 위에서부터 10행 출력 반대는 tail()

위 표의 열을 보면 차례대로 주석산 / 초산 / 구연산 / 황산칼륨 / 알코올 / 품질.. 나머지 당도, 총 이산화황, 산도, 총 이산화황 밀도로 총 12개 속성으로 분류한다. red냐 white냐

 

5.2 와인 데이터세트 합치기

-> 먼저 데이터프레임에 새로운 속성을 추가하는 방법은 속성명과 값을 직접 지정하면 된다.

 레드와인을 구별하는 속성의 이름을 'type'으로 정의했고, 값으로 레드와인은 0, 화이트와인은 1로 지정.

두 개의 데이터를 합치기 위해 pd.concat()이라는 함수를 사용했다. 이 함수는 두 데이터 프레임을 단순히 위아래로 연결해서 새로운 데이터 프레임을 만들어 낸다.

데이터가 잘 입력됐는지 확인하기 위해서 describe() 함수로 통계 정보를 확인 = 가장 오른쪽의 type 속성에서 최소 0, 최대 1의 값이 나온다. 그런데 평균(mean)이 0.75인걸 보면 1에 가까운 값이 많은 것을 추측할 수 있다.

 

5.3 레드 와인R과 화이트 와인 W에 대한 type 히스토그램

 

-> 시각화 하면 1:3 비율로 화이트 와인이 더 많다 

딥러닝 학습을 위해 데이터를 훈련 데이터와 테스트 데이터로 나누기 전에 R과 W이 비슷한 비율로 들어가도록 데이터를 한번 랜덤 하게 섞어야 한다.

데이터를 섞기전 정규화를 해줘야 한다. 외부에서 불러오는 데이터의 경우 어떤 값으로 구성돼 있는지 어렵기 때문에 이것을 도와주는 판다스 info() 함수를 사용

info() 데이터 프레임을 구성하는 속성들의 정보를 알려준다

 

5.4 데이터 요약 정보 확인

-> 정규화 과정에서 데이터에 숫자가 아닌 값이 들어가면 에러의 원인이 된다

 

5.5 정규화

-> 1행에서 max() 최댓값과 min() 최솟값을 얻음

2행, 3행은 계산 결과가 맞는지 확인하는 명령문.

 

5.6 데이터를 섞은 후 넘파이 array로 변환

-> sample() 함수는 전체 데이터 프레임에서 frac 인수로 지정된 비율만큼의 행을 랜덤 하게 뽑아서 새로운 데이터 프레임을 만든다. ex) frac=1이면 100%로 즉 모든 데이터를 뽑아서 섞는 것과 동일한 효과다.

to_numpy함수는 데이터 프레임을 넘파이 array로 변환

이제 데이터를 훈련 데이터와 테스트 데이터로 나누자.

검증 데이터는 훈련 데이터에서 일부를 떼어내 케라스에서 자동으로 만들 것이기 때문에 여기서는 훈련 데이터와 테스트 데이터만 분리하면 된다. 그리고 학습을 위해 각 데이터를 입력(X)과 출력(Y)으로 분리해야 한다.

 

5.7 훈련 데이터와 테스트 데이터로 분리

-> 먼저 2행에서 80%에 해당하는 데이터를 훈련 데이터와 검증 데이터로 만들기 위해 wine_np의 수의 80%에 해당하는 인덱스를 int값으로 저장한다.

그다음 이 인덱스를 이용해 wine_np를 분리한다. 넘파이 array에서는 2차원 이상의 인덱스에 접근할 때 쉼표를 사용하기 때문에 쉼표를 이용해 x와 y도 구분한다. 12개의 기존 속성은 x가 되고 새롭게 추가한 type은 y가 된다.

tf.keras.utils에서 불러오는 to_categorical은 분류 문제에서 정답 행렬을 원-핫 인코딩 방식(One-Hot Encoding) 방식으로 바꾼다.

원-핫 인코딩 : 정답에 해당하는 인덱스의 값에는 1을 넣고 나머지 인덱스에는 모두 0을 넣는 방식.

 

5.8 와인 데이터 세트 분류 모델 생성

딥러닝 시작. 시퀀셜 모델 사용

-> 마지막 레이어의 활성화 함수로 소프트맥스(softmax)를 사용. 분류에서 가장 많이 쓰이며 출력 값들을 자연로그의 밑인 e의 지수로 사용해 계산한 뒤 모두 더한 값으로 나눈다. 이 결괏값들은 총합이 1.0인 확률 값이 된다. 

소프트맥스(softmax) max함수와 비슷한 의미로 좀 더 약화된 버전. https://wikidocs.net/35476 참조

 -지수 e를 밑으로 하는 지수 함수를 취하기 때문에 0이나 음수도 적용 가능하다(지수 함수는 큰 값을 강조하고 작은 값은 약화하는 효과가 있다)

 -강화 학습에선 에이전트의 행동 확률을 구하는 결괏값으로 확률이 필요할 때 쓰임

 

 +마지막 손실 함수인 loss에는 자주 쓰던 mse 대신 categorical_crossentropy라는 낯선 값을 사용했다

categorical은 범주에 쓰이는 분류이고 크로스 엔트로피(crossentropy)는 엔트로피의 기댓값과 비슷하다.

  -확률 부분에 p(x)를 곱하는 것과 달리 로그 뒤에는 q(x)를 곱한다. 여기서 q(x)=분류 네트워크가 예측한 라벨의 확률 값

p(x)는 정답 라벨, q(x)는 분류 네트워크의 계산 결과인 예측 레벨

   -범주가 2개 이상이기 때문에 모든 범주에 대한 평균을 내야 한다.

CCE(Categorical Cross Entropy) 공식

http://melonicedlatte.com/machinelearning/2019/12/20/204900.html 참고

 

*엔트로피와 정보이론

 -정보이론에서 정보량을 나타내기 위해 엔트로피라는 단위를 사용하고 불확실한 정보를 숫자로 정량화하려고 사용.

 -확률에 역수를 취해주는데 확률이 높을수록 정보량이 적다고 판단하기 때문이다.

 

https://blog.naver.com/PostView.nhn?isHttpsRedirect=true&blogId=gyrbsdl18&logNo=221013188633  참조

 

Cross Entropy 란 무엇인가 (information theory)

딥러닝을 공부할 때,cost function 으로 SSE (sum squared error)대신 cross entropy를 사용하는 것이 ...

blog.naver.com

 

5.9 와인 데이터 세트에 대한 분류 모델 학습

-> 학습 과정에서 데이터의 정확도와 검증 데이터의 정확도가 각각 accuracy와 val_accuracy로 표시됨.

 

5.10 분류 모델의 학습 결과 시각화

-> model.evaluate() 함수로 모델의 성능을 평가할 수 있다.

 

5.11 분류 모델 평가

-> 정확도가 99.46%로 거의 오차 없이 분류한다.

 

과정

데이트 세트 불러오기 -> [속성을 추가해주고 ] ->

데이터 세트 합치기 -> [데이터 수가 많이 차이 나면 랜덤 하게 섞기]

->[섞기 전에 정규화하기(데이터가 숫자가 아니면 오류 때문)] -> 정규화 ->  데이터 섞기 넘 파이 array로 변환

-> 훈련 데이터와 테스트 데이터로 분리 -> 데이터 세트 분류 모델 생성 -> 딥러닝 과정으로 분류 모델 학습

-> 학습 결과 시각화 -> 분류 모델 평가

 

5.2 다항 분류

: 범주의 수가 2개를 초과한 경우다.

 

 

 

 

 

 

 

 

 

5.3 Fashion MNIST

+MNIST는 손으로 쓴 숫자 글씨를 모아놓은 데이터 세트다. Fashion MNIST는 손글씨 대신 옷, 신발 등을 모아 놓은 데이터 세트다. 케라스에 기본으로 탑재되어있음

 

5.19 fashion MNIST 데이터 세트 불러오기

-> 훈련 데이터 6만 장, 테스트 데이터 만장의 이미지가 있다

 

5.20 데이터 확인

-> imshow() 함수로 이미지를 그래프의 형태로 표시할 수 있다.

    colorbar() 함수는 그래프 옆에 색상의 값 정보를 바 형태로 표시(오른쪽 0~255의 값)

    9는 범주로 실제 표를 보면 이미지와 같은 것을 확인

 

5.21 데이터 정규화

-> 이렇게 대부분 값이 0인 행렬을 희소 행렬(sparse matrix)이라고 한다.

원-핫 인코딩이 아닌데 행렬이 클 때 0을 위한 메모리 확보는 낭비이기 때문에 정보를 압축하는 표현을 사용하는데 0이 아닌 숫자가 있는 위치와 그 숫자의 값만 저장하는 것이다. 즉 [0,0,0,0,0,0,0,0,1] 대신 9로 표현하고 [0,0,0,0,1,0,0,0,0] 대신 4로 표현.

 

5.22 Fashion MNIST 분류 모델

-> 원-핫 인코딩이 아닌 정답 행렬을 처리하기 위해 바로 compile() 함수의 loss에 들어가는 인수 사용과 sparse인 희소 행렬 사용

원본이 2차원 배열이기 때문에 정렬하기 위해 Flatten이라는 레이어를 사용. flatten은 다차원 데이터를 1차원으로 정렬하는 역할을 한다.

adam.optimizer로 학습률  값 사용(https://www.tensorflow.org/versions/r2.0/api_docs/python/tf/keras/optimizers/Adam)

 

5.23 Fashion MNIST 분류 모델 학습

 

5.24 시각화

 

-> 시간이 지날수록 과적합 현상을 확인할 수 있다 이를 위해 earlyStopping을 사용할 수 있다

 

5.25 평가

-> 정확도로 88%가 나왔다.