[TENSORFLOW] Linear regression Classification

2017. 4. 10. 21:30machine learning

2017/04/06 - [machine learning] - [TENSORFLOW] Linear regression


이전에 언급한 regression이 주어진 입력 값에 대해 연속적인 값을 결과로 출력하는 것이라면 classification은 입력 값에 대해 이산 결과를 리턴하는 것을 의미한다.

예를 들어, 주어진 날짜에 대해 강수량을 나타내는 것이 regression이라면 (ex. 2000-09-15 50mm, 2001-10-13 100mm,.....), 주어진 날짜에 대해 비가 온다 안온다의 결과를 나타내는 것은 classification이라고 할 수 있다. (ex. 2000-09-15 비가 옴, 2001-10-13 비가 안옴...)

아래는 classifier의 특징 들을 기술하였다.

- Linear regression classifier : 구현이 간단하지만, 분류 결과를 보장하지 못하며 오직 이진 분류만 지원이 된다.

- Logistic regression classifier : 높은 정확도를 가지고, 모델이 유연하다. 그리고 새로운 데이터에 대한 모델 업데이트가 쉽지만, 해당 분류기 역시 이진 분류만 지원이 된다.

- softmax regression classifier : 멀티 클래스 분류를 지원하지만, 구현이 복잡하다.


classification을 위해서는 분류가 제대로 되었는지 성능을 측정할 필요가 있는데, 이 때 필요한 게 바로 precision과 recall이다.

precision은 모델이 정답이라고 예측한 값 중 실제 정답인 값의 비율을 의미하고, recall은 실제 정답 중에서 모델이 정답이라고 예측한 비율을 의미한다.  

즉, precision은 모델이 맞다고 예측한 부분이며, recall은 최종 결과에서 모델에서 확인된 실제 정답의 비율을 의미한다.


그럼 이번에는 linear regression을 이용한 classification을 살펴보자. 우리가 분류할 데이터는 아래와 같은 분포를 가진 데이터이며 아래의 분포를 classification 할 수 있는 모델을 찾아내는 것이 이번 포스팅의 목표이다.



np.random.normal을 통해 평균이 5이고 표준편차가 1인 10개의 숫자와 평균이 2이고 표준편차가 1인 10개의 숫자를 각각 만들어 낸다. 만들어진 각각의 10개의 숫자는 np.append 통해 합친다.(총 20개의 리스트가 됨)

이제 입력에 대한 결과 label을 만들 것인데, 평균 5, 표준편차 1인 숫자 리스트에는 0의 결과 값을 만들고 평균2, 표준편차 1인 숫자 리스트에는 1의 결과 값을 만들어서 labels 변수에 저장한다.( 0,1로 구성된 총 20개의 리스트)

model을 정의하자. model은 단순하게 w1x + w0 이 된다. 우리의 목표는 해당 w1, w0을 찾아내는 것이다.

cost는 정답과 예측 값의 차이의 제곱의 합이 되고 이 값이 최소가 되도록 gradient descent가 실행된다.

train epoch는 1000번을 돌리면서 100번마다 해당 cost의 값을 출력해보자.

모든 train이 끝나면 가장 마지막에 찾은 w의 값도 확인해 보자.

해당 model의 성능을 측정하기 위해 accuracy를 확인해볼 것이다. 

tf.to_float(tf.greater(y_model, 0.5)) 를 통해 y_model의 값이 0.5보다 크면 1을 리턴하고 작으면 0을 리턴한 후 해당 결과를 실제의 Y 값과 비교한다.

이렇게 비교한 값은 correct_prediction에 boolean list 형태로 저장이 되고, 다시 한번 to_float를 통해 정수로 변환을 해준 후, reduce_mean을 해주면 정확도가 나타나게 된다. 

(예를 들어 correct_prediction이 [True, False, False, True, True]가 저장이 되었다면, to_float를 통해 [1, 0, 0, 1, 1]로 변환을 하고, reduce_mean을 하게 되면 3/5 = 0.6의 정확도가 나타나게 된다.)


마지막으로 0 ~ 10 까지 균일하게 분포된 숫자 리스트를 all_xs에 저장하고 all_xs와 train으로 찾은 w1, w0을 w1x + w0 모델로 계산해서 직선으로 표시해 보자.