신경망 (Neural Networks)


우리 인간의 뇌는 무수히 많은 뉴런(neuron) 이라는 신경 세포로 구성되어 있고, 뉴런들은 시냅스를 통해 전기적, 화학적 신호를 서로 주고 받으면서 정보를 저장하는 기능을 수행 한다고 합니다. 뉴런들이 서로 복잡하고 얽혀 주고 받는 신호를 통해 우리 인간은 생각을 하고 감정을 느끼기도 하며 무엇인가를 배우기도 합니다.


머신러닝 기법 중 하나인 신경망, 혹은 인공 신경망은 이러한 뇌의 신경망을 본 떠 만든 알고리즘 중 하나 입니다. 신경망의 경우 요즘 많은 관심을 받고 있는 딥러닝의 기초가되는 알고리즘이기도 합니다.



Perceptron


인공 신경망을 구성하는 가장 기초적인 단위는 퍼셉트론(Perceptron) 입니다. 퍼셉트론은 위의 그림과 같이 1개 이상의 input 값과 bias 값 그리고 활성 함수(activation function) 와 1개의 output 값으로 구성되어 있습니다. 퍼셉트론의 input 들은 각각 weight 값들과 곱해져 활성 함수로 전달 되게 되며, 활성함수의 결과 값으로 output 값을 가지게 됩니다. 


활성화 함수의 종류는 매우 다양합니다. 구성하고자 하는 네트워크의 목적에 따라 Logistic 함수, trigonometric, Softmax ReLU, Sigmoid, Step 함수 등 다양한 함수들을 사용 할 수 있습니다. 활성화 함수를 거쳐 구해진 Output 은 이미 labeling 이 되어진 데이터와 비교하여, 비교된 결과에 따라 weight 값을 업데이트 시켜 주어야 합니다. 


이러한 과정을 무수히 반복하다 보면 Output 과 실제 값과의 차이는 점점 작아질 것이고 어느 정도 정해진 횟수 혹은 error 율에 이르게 되면 이 과정을 종료하면 됩니다. 인공 신경망에서의 학습 이라는 개념은 이러한 weight 값 업데이트 과정이라고 보시면 됩니다. 


인공 신경망을 만들기 위해서는 퍼셉트론으로 이뤄진 레이어를 한층, 한층 추가해 주면 됩니다. 인공 신경망은 기본적으로 입력을 받는 입력 계층 (Input layer) 와 출력 값을 보여주는 출력 계층 (Output layer) 를 가집니다. 그리고 입력 계층과 출력 계층 사이의 모든 계층들은 은닉 계층 (Hidden layer) 로 불립니다. 해당 계층으로 입력되는 값과 출력 되는 값이 직접적으로 보여지지 않기 때문에 은닉 계층이라 칭하고 있습니다.




SciKit-Learn


이번 글의 예제를 직접 돌려보기 위해서는 0.18 버전 이상의 SciKit-Learn 을 설치하여야 합니다. pip 이나 conda 통해서 쉽게 설치할 수 있으며, 관련 내용은 구글을 통해서 쉽게 검색하실 수 있을 것 같습니다. 개인적으로 머신러닝이나 딥러닝을 공부 할때는 conda 를 이용해서 virtual env 를 셋업하시는 것이 정신 건강에 이롭다고 생각 합니다.  Anaconda 다운로드 및 사용법에 대해서는 아래의 링크를 참조하시면 될 것 같습니다.


Anaconda 다운로드 https://www.continuum.io/downloads


How to install Machine Learning Package Using Anaconda



Data


실습을 위한 데이터는 UCI Repository 에서 제공하는 Wine 데이터 를 사용하도록 하겠습니다. 다운로드

이 데이터는 와인이 가지고 있는 13가지 화학 성분에 대한 정보를 가지고 있습니다. 데이터 상의 와인은 모두 이탈리아 한 지역에서 생산된 와인이며, 3종류의 각기 다른 품종으로 구분 됩니다. 


그럼, 인공 신경망을 이용해서 다운로드 받은 데이터를 학습해서, 데이터 상의 화학 성분만을 가지고 어떤 품종인지 예측하는 모델을 만들어보도록 하겠습니다. 



위와 같이 pandas 를 사용하여 데이터를 읽어 드립니다. 앞에서 부터 5개의 데이터의 결과가 아래와 같이 나오면 데이터를 잘 읽어 들인 것 입니다. 인공 신경망을 통해 우리가 알고 싶은 결과는 첫 번째 행인 Cultivator 입니다. Alchol ~ Proline 까지의 데이터가 입력으로 들어 왔을 때, Cultivator(품종) 이 1 인지, 2인지 아니면 3인지 예측하는 모델을 만드는 것 입니다.


  Cultivator  Alchol  Malic_Acid   Ash  Alcalinity_of_Ash  Magnesium  ... (이하 생략)

0           1   14.23        1.71  2.43               15.6        127   

1           1   13.20        1.78  2.14               11.2        100   

2           1   13.16        2.36  2.67               18.6        101   

3           1   14.37        1.95  2.50               16.8        113   

4           1   13.24        2.59  2.87               21.0        118 



데이터에 대한 정보를 좀 더 확인해 보겠습니다. 아래와 같이 wine 데이터의 shape 을 출력해 보면, 178 개의 데이터와 14개의 속성 값을 가지는 것을 확인할 수 있습니다.



(178, 14)



그럼 이제 입력 값과 출력 값을 정의 해 보도록 하겠습니다. 입력 값은 Cultivator 를 제외한 13개의 속성 값들의 집합 입니다. 즉, 위의 178 개의 데이터 중 Cultivator 행을 뺀 나머지 부분이라고 보시면 됩니다. 출력 값은 Cultivator 행만 있는 178 개의 데이터 입니다. 



입력 값 X 와 출력 값 Y 를 정하고 나면 178개의 데이터를 학습 데이터와 검증 데이터로 구분해 줍니다. 학습 데이터는 학습을 위해서만 사용되며, 검증 데이터는 학습된 결과가 제대로 학습 되었는지 확인하기 위해 사용 됩니다.



Data Processing


인공 신경망의 경우 데이터 값들을 정규화 해주지 않을 시, 아무리 학습을 해도 원하는 값을 얻기 어려울 수 있습니다. 신경망 특성 상 스케일링 (scaling) 에 매우 민감하게 반응 합니다. 따라서 학습 데이터와 검증 데이터 모두 데이터에 알맞게 정규화 해 주어야 합니다. 정규화 하는 방법은 여러가지가 있지만 이번 예제에는 sckit learn 에서 제공하는 API 를 이용해 보도록 하겠습니다.



 

위와 같이 학습 데이터를 기준으로 데이터의 전 처리까지 완료 하고 나면 학습을 진행할 수 있습니다.



Training the model


scikit-learn 은 학습을 위한 다양한 API 들을 제공하고 있습니다. 인공 신경망의 자세한 이론적 지식이 없더라도 API 호출 만으로도 학습 모델을 손쉽게 구성할 수 있습니다. 물론, 그렇다고 하더라도 이론적 지식이 없어도 된다는 이야기는 아닙니다. 아무리 많은 기능을 라이브러리가 제공한다고 하더라도 언제 어떻게 쓸 줄 모른다면 소용이 없겠죠.




학습을 위해 1개의 입력 계층과 3개의 은닉 계층, 그리고 1개의 출력 계층으로 이뤄진 인공 신경망을 구성해 보도록 하겠습니다. 각각의 은긱 계층은 30개의 퍼셉트론으로 이뤄지도록 정의 하였고, 정의된 신경망에 학습 데이터의 인풋 X (x_train) 과 출력 Y (y_train) 을 파라미터로 넘겨주면 학습 모델 구성이 완료 됩니다.


MLPClassifier(activation='relu', alpha=0.0001, batch_size='auto', beta_1=0.9,
       beta_2=0.999, early_stopping=False, epsilon=1e-08,
       hidden_layer_sizes=(30, 30, 30), learning_rate='constant',
       learning_rate_init=0.001, max_iter=200, momentum=0.9,
       nesterovs_momentum=True, power_t=0.5, random_state=None,
       shuffle=True, solver='adam', tol=0.0001, validation_fraction=0.1,
       verbose=False, warm_start=False)


지금은 단순히 모델의 계층만을 구성하였지만 실제로 모델을 객체를 생성할 때 정의 할 수 있는 파라미터들은 위와 같이 매우 많습니다. 파라미터들을 직접 정의해서 바꿔보시거나 계층 수를 늘리거나 줄이거나 혹은 퍼셉트론의 수를 변경해 보시면서 다양한 방식으로 학습을 구성해 보시면 좋을 것 같습니다.



Prediction and Evalutaion



드디어 대망의 마지막 단계 입니다. 학습이 완료된 모델이 얼마나 정확하게 예측하는지 평가해 보도록 하겠습니다.



테스트를 위해 분리해둔 x_train 데이터를 predict 함수의 파라미터로 단순히 넘겨주는 것 만으로 값을 예측해 볼 수 있습니다. 그리고 예측 결과 값인 preditctions 와 x_train 의 실제 값인 y_train 의 결과를 비교해서 얼마나 맞췄는지 평가함으로써 우리가 구축한 모델의 성능을 평가해 볼 수 있습니다.


평가와 관련된 confusion_matrix 와 classification_report 의 결과 값을 한번 보도록 합시다.


               precision    recall  f1-score   support

          0       1.00      0.94      0.97        53
          1       0.97      1.00      0.98        90

avg / total       0.98      0.98      0.98       143


리포트를 보면 위와 같이 약 98%의 정확도를 보이는 모델임을 알 수 있습니다. 이정도면 꽤 훌륭한 모델이라고 할 수 있습니다!
기본적으로 인공 신경망이 어떤 식으로 구성 되어 있는지 그리고 어떤 식으로 동작하는지에 대해서 알아 보았습니다. scikit learn 외에도 tensorflow, PyTorch, Keras 등 다양한 인공 신경망과 딥 러닝을 위한 라이브러리 / 프레임워크 들이 존재 합니다. 하나씩 사용해보고 상황에 자신의 스타일에 가장 잘 맞는 것을 선택하여 공부해 보면 좋을 것 같습니다. :-)



본 글은 아래의 원문을 일부 수정 및 번역 하였습니다.
원문 : www.kdnuggets.com/2016/10/beginners-guide-neural-networks-python-scikit-learn.html/


    서포트 벡터 머신 (Support Vector Machine, SVM)


서포트 벡터 머신은 Linear Classification, 즉 선형 분류 중 하나 입니다. 위의 그림과 같이 별모양과 동그라미가 있을 때 두 도형을 나누는 가장 좋은 boundary 를 찾아야 한다고 할 때 사용되는 머신 러닝 기법 중 하나 입니다. 그림 처럼 2차원일 경우 이 boundary 를 선으로 표현할 수 있지만 더 고차원으로 가게 될 경우 단순히 선형이라 표현하지 않고 hyperplane 이라 부르게 됩니다.


서포트 벡터 머신을 알기 위해서 중요한 기본 개념으로 3가지와 이에 따르는 몇가지 서브 개념들이 있습니다.

1. Margin ( VC Dimension, Shattering, Dichotomy )

2. Support Vector

3. Kernel

그럼 각각이 무엇인지 이론적으로 먼저 살펴보도록 하겠습니다. 


  • Margin - VC Dimension, Shattering, Dichotomy

안드로이드 개발자 분들이라면 margin 에 대해서 많이 보셨을 것 같습니다. 안드로이드를 하다보면 UI 를 그릴 때 각 View 간의 거리를 정할 때 margin 값을 주곤 합니다. 서포트 벡터 머신에서의 margin 도 사실상 동일한 개념 입니다. 위의 예제 그림에서 Class1 과 Class2 를 나누기 위한 선은 무수히 많이 그릴 수 있습니다. 그런데 어떤 선을 가장 잘 분류한 선이라고 표현할 수 있을 까요?

두 클래스 사이을 분류하는 무수히 많은 선, 고차원에서는 hyperplane, 중 margin 을 가장 크게 하는 hyperplane 을 찾는 것이 서포트 벡터 머신 분류를 잘 표현한 것이라고 할 수 있습니다.  

사실 직관적으로 생각해 보면 당연히 분류되는 아이템들 과의 margin 이 가장 큰 hyperplane 을 찾는 것이 가장 잘 분류하는 방법일 것 같긴 합니다. 그런데 왜 그럴까요?

이를 증명하는 개념 중 하나가 VC Dimension 입니다. VC Dimension 은 데이터를 분류하는 SVM 분류기가 얼마나 복잡한 데이터를 분류할 수 있는지를 나타내는 속성 입니다. 

그럼 이제 VC Dimension 을 좀 더 설명하기 위해 Dichotomy 란 개념을 추가적으로 설명해 보겠습니다. Dichotomy 란 어떤 집합이 있다면 이 집합을 둘로 나눈 다는 것 입니다. 예를 들어 A, B, C 라는 점이 있다면 { A }, { B, C} 혹은 { A, B, C}, { } 등으로 총 8 종류로 나누는 것이 가능 할 것 입니다. 이처럼 8 종류로 나누는 것을 Dichotomy 라고 부릅니다. 

그럼 Shattering 은 무엇일까요? 

Shattering 은 SVM 분류기가 Dichotomy 를 모두 표현할 수 있느냐 입니다. 위의 그림 중 마지막 그림을 보시면 + 와 - 를 나누는 선 하나를 표현할 수 있는 방법은 없습니다. 해당 경우의 Dichotomy 는 표현할 수 없는 것 입니다.


결론적으로 VC Dimension, 즉 SVM 분류기가 얼마나 복잡한 데이터를 표현할 수 있느냐의 여부는 Shattering 할 수 있는 가장 많은 데이터의 갯수라고 보실 수 있을 것 같습니다. 


일반적으로 N 차원의 hyperplane 의 VC Dimension 은 N+1 이라고 합니다. 또한 VC Dimension 이 높으면 안 좋다고 합니다. 그리고 Margin 을 최대화 한다는 말의 동치는 VC Dimension 을 줄인다는 말과 동일하다고 합니다.


이상 이론적인 부분에서의 SVM 의 Margin 에 관련된 부분들을 살펴 보았습니다. 다음 글에서 그럼 어떻게 Maximum Margin 을 찾을 수 있을지에 대해서 살펴보도록 하겠습니다.


2017/03/09 - [CS/ML] - ML101 : 나이브 베이즈 (Naive Bayes) : 베이즈 정리



이전 글에서 알아본 베이즈 정리에 이어, 나이브 베이즈 분류에 대해서 알아보도록 하겠습니다. 아래 그림은 필기체 숫자를 인식하는 나이브 베이즈 분류기의 예제 입니다. 8 x 8 의 행렬이 있고, 해당 행렬에는 총 64개의 feature 값들이 있습니다. 각 feature 의 색이 칠해져 있는 상태에 따라서 숫자를 판별합니다.



예를들어, 3 이라는 숫자의 경우 3행 1열에 색이 칠해져 있을 확률이 매우 낮을 것입니다. 반면에 5행 5열에 색이 칠해져 있다면 3일 숫자의 확률은 매우 높을 것 입니다. 이러한 조건에 대한 확률을 표현한 표를 Conditional Probability Table 이라 하며 위 그림의 오른쪽 표들 입니다. 그리고 각 클래스별 확률을 나타낸 테이블을 Priority Table 혹은 Class Table 이라 부르며 P(Y) 로 정의된 왼쪽 표 입니다. 


P(F3, 1 = on | Y) 는 1 ~ 0 까지 가질 수 있는 결과 값의 Class 들일 경우에 색이 칠해져 있을 확률 입니다. 다시 말해 숫자 3일 경우 F3, 1 에 색이 칠해져 있을 확률은 0.05, 숫자 6일 경우 0.9 라고 할 수 있습니다.


그렇다면 8 x 8 의 숫자가 그려져 있는 어떤 그림이 주어졌을 때 해당 그림의 숫자가 무엇인지 어떻게 판별할 수 있을까요? 지난 글에서 다루었던 베이즈 정리를 바탕으로 이 문제를 풀어보도록 하겠습니다. F0,0 ~ F15,15 총 64개의 CPT 가 주어졌을 때 Class 들의 확률을 구하는 식은 아래와 같습니다.



주어진 Class table 과 CPT 들의 곱을 이용하여 입력으로 들어오는 그림의 상태에 따라 어떠한 숫자인지 값을 구할 수 있고 가장 확률이 높은 Class 값에 맞게 해당 숫자를 예측할 수 있습니다. 


본래의 식은 분모로 P(F) 를 가지는 것이 맞으나 위 문제의 경우  모든 클래스에 대해서 동일한 분모를 가지기 때문에 어떤 클래스 값이 가장 높은지 비율만 구하는 문제에서는 분자의 크기만 아는 것으로 충분하기에 이를 생략할 수 있습니다.



※ 라플라스 스무딩 (Laplace Smoothing)

위의 방법의 경우 인풋 값이 우리가 생각하는 일반적인 모양의 숫자가 들어왔다고 했을 때는 잘 동작할 수 있지만 학습 데이터에 없던 값이 들어오거나 이상 값이 들어올 경우 확률이 0이 되는 값이 나와 정상적으로 분류가 안되는 경우가 있습니다.


이럴 경우 값의 보정을 위해 사용되는 기법이 라플라스 스무딩 기법 입니다. 라플라스 스무딩은 실제로 관찰한 것보다 한번씩 더 봤다고 가정 하는 것 입니다. 즉 확률이 0일 경우를 제외시키는 방법으로 일반적으로 아래의 식과 같이 표현 합니다.





  • Bayes rule

일반인이 암 환자를 진단하는 신규 검사법을 사용하여 검사해본 결과가 양성 반응일 때, 실제로 암에 걸렸을 확률을 구하는 문제가 있다고 해보겠습니다. 이 문제를 풀기 위해 주어진 조건과 조건부 확률을 다음과 같다고 가정하겠습니다.


Y -> 실제 병에 걸렸을 경우 { 1 : true, 0 : false }


X -> 검사 결과 경우 { 1 : 양성, 0 : 음성 }


P ( X = 1 | Y = 1 ) = 0.8 검사의 정확도로 실제 병에 걸렸을 경우, 검사 결과도  양성일 확률

즉, 본 검사는 80% 의 확률로 정확한 진단을 내리고 20% 확률로 실제 병이 걸린 환자에 대해 음성이라는 오진을 내리게 됩니다.


P ( X = 1 | Y = 0) = 0.1 일명 False positive 로 병이 없는데도 불구하고 검사 결과가 양성으로 나올 확률.


P ( Y = 1) = 0.004 일반적으로 암에 걸릴 확률.  



조건을 확인하고 문제를 다시 읽어보도록 하겠습니다. 위와 같은 조건이 주어 졌을 때 암 검진 결과가 양성 일 경우, ( X = 1) 실제로 암에 걸렸을 확률 ( Y = 1) 이므로 우리가 구해야할 문제는 아래와 같습니다.



이 문제는 베이즈 정리를 이용해 풀 수 있습니다. 베이즈 정리의 기본 공식은 다음과 같습니다.



공식으로 확인해 봐도 알겠지만 베이즈 정리는 본래 역확률 (inverse problem) 을 해결하기 위해 사용되는 방법 입니다. P(B|A) 라는 조건부 확률을 알고 있을 때 P(A|B) 를 구하는 방법인 것 입니다. 하지만 공식처럼 단순히 역확률 문제에만 사용되는 것이 아니라 이전 경험을 바탕으로 확률을 추론하는데 사용할 수 있는 방법 이기도 합니다. 주어진 자료를 이용해 새로운 사실의 확률을 구하는 방법, 다시 말해 머신러닝에 사용되기 매우 좋은 방법 입니다. 


앞의 문제는 암 검진 결과가 양성일 때 실제 암에 걸렸을 확률을 구하라는 것이었습니다. 주어진 조건을 공식에 맞추어 문제를 풀어도록 하겠습니다.



머신 러닝의 관점에서 베이즈 정리를 다룰 때 몇가지 알아야할 용어도 있습니다. 위 조건에서 P(Y) 는 암에 걸릴 확률 입니다. 어떠한 자료도 없을 때 특정 사건이 일어날 확률에 대한 가정으로 사전 확률(Prior Probability) 이란 용어가 있습니다. 그리고 가능도(likelihood) 라는 용어도 있습니다. 사건이 일어났다는 가정 하에서 새로이 가지게 된 자료가 관측될 확률을 의미 합니다. 베이즈 정리의 분모는 가능도를 구할때 조건으로 걸린 사건의 확률입니다. 마지막으로 위 문제에서 답에 해당 하는 부분, 사전확률과 가능도를 이용해 구한 답을 사후 확률(posterior probability) 라고 합니다.


사실 위의 문제의 경우 사건의 종류가 단 2개 뿐인 매우 간단한 문제 였습니다. 일반적인 문제나 실제 머신 러닝 적용을 위한 문제에서는 사건의 경우는 2개 이상을 것 입니다. n개의 사건을 가지는 일반적인 베이즈 정리는 다음과 같습니다.


표본 공간 는 서로소인 의 합집합이며

는 위에서 정의된 사건 일때



아래의 그림과 함께 공식을 보시면 더 이해하기 쉬우실 것 같습니다. P(A1|B) 를 구하고 싶다면 조건부 확률의 공식에 따라 분자는 P(A1∩B) 를, 분모는 P(B) 를 가지게 됩니다. 곱셈정리에 따라 분자와 분모는 각각 위의 공식과 같이 변환 되는 것 입니다.

 





2017/01/16 - [CS/ML] - ML 101 : 머신러닝의 종류

2017/01/19 - [CS/ML] - ML 101 : weka install & arff

2017/01/29 - [CS/ML] - ML 101 : try weka

2017/02/07 - [CS/ML] - ML 101 : 머신러닝 무료 강의 모음



이번 글에서는 음반 매장 내에 위치에 따라 아이돌 그룹 레드벨벳의 CD 판매량을 의사결정트리로 예측할 수 있는 모델을 만들어보도록 하겠습니다. 아래의 훈련용 데이터는 음반 위치, 매대가 눈높이에 있는지 여부, 그리고 실제 구매 여부로 이뤄져 있습니다. 


데이터 분석 작업은 다음의 단계로 이뤄집니다.


1. 훈련용 데이터를 불러와 의사결정 트리를 만들고 해당 내용을 그래프로 확인 한 후,

2. 의사 결정 트리 분류기로 자바 코드를 생성하고,

3. 테스트용 데이터로 자바 코드를 시험함.


우선 아래의 훈련용 데이터를 다운 받으시고, 내용을 확인해 보도록 하겠습니다.

훈련용 데이터

redvelvet.arff


훈련 데이터의 속성은 5가지 입니다. Placement - 음반이 진열된 위치, Prominence - 진열된 음반 중 레드벨벳 CD 비중, Pricing - 판매가격이 정가 대비 할인된 비율, Eye Level - 고객의 눈높이 진열 여부, Customer Purchase - 구매 여부. 이 속성들 중 판매량에 가장 영향을 미치는 속성이 무엇인지 알아 보고 속성 값을 바탕으로 판매량을 예측해 보도록 하겠습니다.

웨카에서 훈련용 데이터를 불러오고, 의사결정 트리를 사용하기 위해 J48 알고리즘을 선택하고 분석을 하게 되면 아래의 결과를 얻을 수 있습니다.


결과를 보면 판매에 가장 큰 영향을 미치는 속성은 placement 입니다. end_rack 에 두었을 때 판매 매출을 높이는데 가장 좋은 값이라고 할 수 있고, cd_rack 에 두었을 때는 가격 요인에 의해 판매 여부가 결정된다고 할 수 있습니다. 마지막으로 std_rack 에 두었을 때는 눈높이에 제품이 있느냐의 여부에 따라 판매 여부가 결정된다고 해석 할 수 있습니다. 


이 내용을 시각화하여 볼 수 있습니다. [Result list (right-click for options) 패널에 있는 알고리즘을 우 클릭하여 Visualize Tree 옵션을 선택하면 아래의 그림을 확인 하실 수 있습니다. 


시각화 뿐만 아니라 분석된 내용을 소스 코드로 확인할 수 있습니다. 웨카를 이용해 생성한 알고리즘 기반의 코드 재사용 및 수정이 가능 한 것 입니다. 아래의 그림과 같이 More Options 버튼을 선택하고 Output source code 를 체크한 후 [start] 버튼을 눌러 다시 한번 웨카 분석을 수행 합니다.



분석이 완료 되면 코드가 별도의 파일로 나오지는 않고 classifier output 화면에 기존 결과 분석 내용과 함께 출력 되게 됩니다. 생성된 코드를 빌드 하기 위해서는 [weka.jar] 가 필요 합니다. 해당 파일은 Weka 를 설치한 폴더에 가시면 있습니다. Eclipse 에 프로젝트를 하나 생성하고 WekaClassifier.java 를 만들어 출력된 내용을 복사 해줍니다. 그리고 Referenced Libraries 에 weka.jar 를 첨부하여 빌드를 수행하시면 됩니다.


소스 코드를 자세히 보시면 WekaClassifier 안에 WekaWrapper 클래스와 실행부인 main 이 같이 존재 하는 것을 보실 수 있습니다. 저는 코드 보기 편하기 위해 WekaClassifier 와 WekaWrapper 를 분리하였습니다. 꼭 그럴 필요는 없지만 Claasifier 에 생성된 함수명을 살펴보시면 랜덤한 이름으로 생성되어 있어 가독성이 많이 떨어집니다. 이에 추후 작업 및 코드 정리를 위해 분리해서 작업하시는 것을 추천 드립니다.


(계속..)

머신러닝을 공부하기 좋은 [무료] 강의들





1) https://www.youtube.com/user/hunkims 
홍콩 과학 기술 대학교 교수님으로 계신 김성훈 교수님의 Youtube 채널 입니다. 머신 러닝 강좌 중 세계에서 가장 유명한 강의를 뽑으라면 Andrew Ng 교수님의 코세라 강의를 들 수 있겠는데요, 해당 강의 같은 경우 실습시 상대적으로 생소한 Octa 나 매트랩을 사용해야 한다는 단점이 있습니다. 요즘 핫한 tensorflow 를 이용해 실습을 하실 수 있고 무엇보다 아름다운 우리 한글을 사용한 강의기에 입문 강의로 강추 드립니다.



2) https://www.coursera.org/learn/machine-learning 
역사와 전통을 자랑하는 머신러닝 입문 강의의 세계 최고봉!! Andrew Ng 교수의 머신러닝 강좌 입니다. 매달 수강 신청을 하실 수 있고 진도에 뒤쳐지지 않도록 관리 해주고 있기 때문에 저와 같은 의지박약 인들도 꾸역꾸역 진도를 따라갈 수 있습니다. 한글 자막도 있으니 영어에 대한 걱정은 접어 두셔도 괜찮을 것 같습니다.



3) https://www.youtube.com/playlist?list=PLWO_EXTnt3sPmlgCeHAiHwaAFwmmusGp6 
머신러닝에 대한 주제라고 하기에는 애매하지만 파이썬에 익숙하신 분 중 데이터 분석에 관심이 있으신 분은 한번쯤 보시면 좋을 강의 리스트 입니다. 파이썬을 이용해 데이터 분석 하는 법에 대해 차근차근 가르쳐 주고 있고, 역시 한글 강의라는 강점이 있습니다. 강좌 하나하나 모두 길지 않아 하루 하나씩 부담 없이 보실 수 있으실 것 같습니다.



4) https://www.youtube.com/playlist?list=PLNfg4W25Tapy5hIBmFZgT5coii1HUX6BD 
동국대학교 홍정모 교수님의 유투브 채널의 플레이 리스트, C++ 로 배우는 딥러닝 입니다. 파이썬과 R 로 꽉 채워져 있는 머신러닝 강의 세계에 한줄기 단비 같은 C++ 강좌 입니다. 사실 랭귀지가 중요한 것이 아니라 이론에 대한 이해가 더 중요하다고들 하나, 내가 가장 잘 아는 언어로 배우는 이론이 더 쉽게 이해 가는 것도 사실이라고 생각합니다. 



5) https://www.youtube.com/channel/UCRyIQSBvSybbaNY_JCyg_vA 
모두의 연구소 이찬우 연구원님의 딥러닝 입문 강의 입니다. 화려한 영상이나 멋진 강의 슬라이드 대신 노트에 필기하면서 강의가 진행되는 영상들로 이루어진 플레이 리스트 입니다. 영상을 보고 있자면 마치 고등학교 때 공부 잘하는 짝꿍이 옆에서 설명해 주는 듯한 느낌이 들기도 합니다. 아날로그적 감성을 좋아하시는 분께 추천 드립니다.



6) https://www.youtube.com/playlist?list=PLzWH6Ydh35ggD2XoOObYqiYByOt8r_wuv 
서울대학교 BI Lab. 겨울방학 Rookie 세미나로 진행된 강좌 목록 플레이 리스트 입니다. 실제 세미나 장면을 녹화한 영상들로 캠퍼스 느낌을 느끼고 싶으신 분들에게 추천 드립니다. 제가 강의를 다 본 것은 아니지만, 난 머신러닝에 대해 1도 모른다! 라는 분들 보다는 대애애충 뭔지 한번 들어봤는데? 라는 느낌을 가지고 계신 분들에게 좋은 강의로 보입니다.



7) https://www.youtube.com/channel/UCWN3xxRkmTPmbKwht9FuE5A 
Sirajology 라는 유투브 채널로 매우 유명한 유부터 중 한분인 Siraj 가 다양한 주제로 짧지만 알찬 비디오들을 공유하고 있는 곳 입니다. 이 채널의 가장 큰 장점은 짧지만 고퀄의 영상미가 느껴지는 영상들 입니다. “40줄의 코드로 애플 주가 예측하기!” 와 같이 toy 예제들을 만드는 법들에 대해서 매우 재미있게 가르쳐 줍니다. 영어 강의지만 영상도 재미나 흥미롭게 보실 수 있을 것 같습니다.

이분 같은 경우 최근 유다시티와 함께 딥러닝 컨텐츠를 제작하고 있습니다.



8) https://www.youtube.com/playlist?list=PLAwxTw4SYaPkQXg8TkVdIvYv4HfLG7SiH 
마지막으로 추천해 드릴 강의는 유다 시티의 머신러닝 입문 강좌 입니다. 강좌 수는 400개가 넘지만 영상 하나당 3분 이내이기에 내가 진도를 잘 나가고 있구나! 하는 착각에 빠지기 쉬운 강좌 입니다. 안타깝게도 한글 자막은 없습니다만 퀄리티로는 최고라고 생각합니다. 매우 매우 강추하는 강좌입니다.



이외에도 입문 강좌는 유투브나 유다시티, 코세라와 혹은 kmooc 과 같은 Mooc 사이트에서 많이 찾아보실 수 있습니다. :-D   

ML 101 : try weka CS/ML 2017.01.29 02:55

2017/01/16 - [CS/ML] - ML 101 : 머신러닝의 종류

2017/01/19 - [CS/ML] - ML 101 : weka install & arff



 이전 글에서는 머신러닝의 종류, weka 툴 그리고 weka 에 쓰이는 데이터 형식에 대해서 알아보았습니다. 이번 글에서는 weka 를 사용하여 머신러닝의 큰 줄기 중 하나인 [지도학습] 이 어떻게 이뤄지는지 학습해 보도록 하겠습니다. 

이론을 설명하기에 앞서 바로 툴을 돌려보면서 실습에 임해보도록 하겠습니다.

 


 먼저 weka 를 시작하여 [Explorer] 버튼을 눌러 학습시킬 데이터를 불러오도록 하겠습니다. weka 를 설치한 경로 내에 /data/nominal 아래에 tic-tac-toe.arff 파일을 불러들이면 아래와 같은 화면을 보실 수 있습니다. 아래의 화면은 해당 데이터를 분석한 화면으로 각 attribute 별 데이터의 분포와 값들을 확인할 수 있습니다. 각 화면에 대해 감이 아직 안오더라도 일단은 '데이터 전처리 과정을 거친 화면이구나' 라고 이해하고 넘어가셔도 무방합니다. 데이터를 잘 불러들이셨다면 [classify] 탭을 눌러 데이터 분석을 진행해보도록 하겠습니다.



 

  [Classify] 탭을 선택하고 나면 아래와 같은 화면을 보실 수 있습니다. [Choose] 버튼을 눌러 [trees] 폴더 내에 J48 을 선택해 봅시다. J48은 c4.5 분류 알고리즘으로 소위 말하는 [의사결정 트리] 알고리즘 중 한 종류 입니다. 정보획득량을 기반으로 분류 작업에도 적용할 수 있는 알고리즘으로 많이 쓰이는 알고리즘 중 한 종류 입니다.  

 

 다음 단계로 넘어가기 전에 간단히 [의사 결정 트리] 란 무엇인지 알고 넘어가 보도록 하겠습니다. [의사 결정 트리]는 아래의 그림과 같이 각 속성 값을 기반으로 트리 구조로 데이터를 분석하여 결과를 분류하는 기법이라고 할 수 있습니다. 쉽게 생각해서 스무고개를 떠올리시면 됩니다. 아래 그림은 타이타닉 호의 생존자를 의사결정트리를 이용해 분류한 결과 입니다.


[출처 : Wiki_결정트리]


 어떤 노드를 기준으로 두느냐, 즉 어떤 속성을 root 값으로 두고, child 노드는 어떤 속성으로 만드느냐에 따라 같은 데이터에서 다양한 모양의 트리가 나올 수 있습니다. 데이터 세트를 분류하는 방식에 따라 다양한 의사결정 트리 알고리즘이 나왔으며, 대개 속성이 나뉘기 전후의 엔트로피 차이를 측정하는 정보획득량에 기반한 알고리즘이 많습니다. 저희가 오늘 사용할 J48(C4.5) 알고리즘도 이에 기반한 알고리즘입니다.


 내용에 비해 설명이 너무 간소하나 일단 [의사결정트리]에 대한 설명은 여기까지 하고 다음 단계로 넘어가도록 하겠습니다. J48 알고리즘을 선택하고 난 후 [Test options] 의 [Percentage split] 을 90%로 맞춰주겠습니다. 이 말은 .arff 에 있는 데이터 중 90%는 컴퓨터의 학습을 위해 사용하고 나머지 10%는 테스트를 위해 사용하겠다는 의미 입니다. 


 데이터를 학습시키다보면 분명 한번쯤은 오버피팅 문제에 직면하게 됩니다. 오버피팅을 피하기 위해서는 트레인 데이터와 테스트 데이터를 잘 조합하여 검증해야 합니다. 오버피팅에 대해서는 다른 글에서 다뤄보도록 하겠습니다.


 자 그럼, [Start] 버튼을 눌러보도록 하겠습니다.


  버튼을 누르고 나면 위와 같은 화면을 보실 수 있습니다. J48 알고리즘을 이용하여 90%의 데이터를 학습시키고 10%의 데이터를 사용해 검증했을 때, 약 85% 확률로 우리의 컴퓨터는 tic-tac-toe 게임의 승리 / 패배 여부를 예측할 수 있게 되었습니다. (짝짝짝)

머신러닝을 처음 접해 본다면 weka 툴을 써보시는 것을 추천 드립니다.

 

weka introduction :  http://www.cs.waikato.ac.nz/ml/weka/

weka download : http://www.cs.waikato.ac.nz/ml/weka/downloading.html

 

웨카는 머신러닝 기법들을 맛보고 즐길 수 있는 데이터 마이닝 툴 입니다. Youtube 에 weka 에 대한 공식 튜토리얼도 있고, 머신러닝 소개 영상들에서 많이 접하실 수 있는 툴이기도 합니다.

 

다운로드나 툴에 대한 소개는 위의 링크로 대체하고, 머신러닝이란 어떤 것이냐에 대한 느낌을 느껴보기 위해 바로 툴을 사용해 보도록 하겠습니다. 

 

 

weka 를 실행 하게 되면 위와 같은 화면을 보실 수 있습니다. weka 를 받으시면 weka 폴더 내에 /data 내에 .arff 형식의 샘플 데이터들이 있습니다. 이 데이터들을 활용하여 연습을 해 볼수도 있습니다만, 다른 데이터를 활용해 보고자 합니다.

 

weka dataset : http://www.cs.waikato.ac.nz/ml/weka/datasets.html

위의 링크에서 [A gzip'ed tar containing UCI and UCI KDD datasets] 를 다운 받아 편한 곳에 압축을 푸시면 많은 수의 .arff 파일들을 보실 수 있습니다.

 

데이터의 구조를 먼저 알기 위해 .arff 파일의 구조에 대해서 알아보겠습니다. 다운 받으신 dataset 내에 /nominal 폴더 내에 tic-tac-toe.arff 를 열어보시겠습니다.

tic-tac-toe 게임은 아래 그림과 같이 3 x 3 게임판에 o 와 x 를 그려넣어 같은 모양으로 가로 세로 혹은 대각선으로 한줄을 만드는 사람이 이기는 게임 입니다.

틱택토에 대한 이미지 결과

저희가 확인하려고 하는 데이터는 바로 이 게임에 대한 데이터로써, 각 게임들의 승리, 패배 결과 값을 정의하고 있는 게임 입니다. 이 데이터를 가지고 지도학습, supervised learning, 기법을 실험해 볼 수 있을 것 같습니다. 데이터를 한번 열어 보겠습니다.

 


 

 

arff 는 weka 의 데이터 분석을 위해 작성된 포맷 으로 각 줄 마다 아래와 같은 prefix 들을 보실 수 있습니다. 

- %

- @relation

- @attribute

- @data

 

하나 하나 설명 드리자면 우선, %는 주석이고, @relation 은 이 데이터의 테이블 명이라고 생각하셔도 무방할 것 같습니다. attribute 는 각 테이블의 컬럼을 나타내며 { } 를 통해 해당 컬럼이 가질 수 있는 후보 값들을 나타 냅니다.

tic-tac-toe.arff 의 경우 9의 칸과 결과 값을 모두 컬럼으로 나타내고 있습니다. 각 칸의 위치를 컬럼명, top-left-square 등 으로 나타내고 해당 컬럼은 b(blank), o, x 의 값을 가질 수 있는 것이죠. 또한 Class attribute 를 통해 해당 게임이 이겼는지 졌는지를 나타내고 있습니다. 마지막으로 data는 말 그대로 테이블의 데이터 값입니다.


자, 그럼 이제 weka 를 통해 해당 데이터들을 분석해 보도록 하겠습니다.

   

 

 

 

초보자를 위한 머신러닝, ML 101


 첫 번째 글로 우선 머신러닝 기법에 대해서 작성해 보겠습니다. 머신 러닝의 기법은 크게 아래와 같이 세가지 종류로 나누어 볼 수 있을 것 같습니다.


지도 학습

비지도 학습

강화 학습


 지도 학습은 쉽게 생각하면 예제를 주고 컴퓨터를 가르치는 학습 기법 입니다. 1번 데이터는 o, 2번 데이터는 x, 3번 데이터는 o ... 이런 식으로 레이블이 입력된 데이터를 사용합니다. 프로그램에 입력할 학습 데이터를 미리 제공해야 하기 때문에 사람이 직접 개입해야 합니다. 따라서 정확도가 높은 데이터를 사용할 수 있다는 장점이 있지만, 데이터를 입력하는 인건비, 수고 등이 따르고 데이터의 양도 충분치 못할 수도 있습니다.

 

 이에 반해 비지도 학습은 사람의 개입이 없이 컴퓨터 스스로 데이터를 분류하는 기법 입니다. 사실 일반적인 데이터의 대부분이 레이블이 안된 데이터들입니다. 정답이 없는 문제들을 푸는 것이기 때문에 이에 대한 검증도 어렵고 구현도 지도 학습에 비해 어렵지만 지도 학습에 비해 현실에 더 알맞은 기법이라 생각 됩니다.

 

 강화 학습 기법은 앞의 분류로 든 지도 학습 / 비지도 학습과 조금 분류 방법이 다르긴 합니다. 강화 학습은 말 그대로 현재의 상태를 '강화' 하는 방법으로 프로그램이 구현되는 기법 입니다. S 라는 현재 상태에 A 라는 액션을 취했을 때 R 이라는 보상이 주어지고 프로그램은 이 R 을 최대 값으로 맞추는 방식으로 학습이 진행 됩니다. 그런데 여기에 R 에 대한 '지연 보상' 이라는 개념이 들어가게 되면 난이도가 대폭 상승하게 됩니다. 즉, 바둑이나 체스를 예로 들어보겠습니다. 상대 말에게 지금 내 말 하나가 잡히게 될지라도 다음 턴에 상대의 왕을 잡을 수 있는 기회가 생기는 A1 이라는 액션이 있고, 반대로 상대 말을 지금 하나 잡을 수 있으나 다음 턴에 내 왕이 죽을 수 있는 A2 라는 액션이 있다고 하겠습니다. 그렇다면 지연 보상이라는 개념 없이 단순히 A1 이라는 액션을 취할 경우 좋은 결과라고 볼 수 없으며, 더 좋은 선택인 A2 를 하도록 구현하여 할 것 입니다.