2015/03/07 21:19

NMF(non-negative matrix factorization) 기법을 소개한다. 이 기법은 데이터내에 독립된 특성을 찾는데 사용한다. 많은 데이터 세트 내의 항목들은 미리 알기 어려운 다른 특성들과의 조합으로 생성되고 이러한 특성을 찾아 본다. 






이전 분류 방식

  

  - 베이지안 분류기 (Classification)

  - 의사결정트리

  - 지지벡터머신(SVM)

  - 군집 (Clustering)




비음수 행렬 인수분해 (NMF)


  - 행렬 준비 

    + 특성 행렬(feature matrix) : 가로줄에 각각의 특성을 가졌고 세로줄에 단어, 값들은 단어 특성의 중요도

     


    + 가중치 행렬(weights matrix) : 가로줄 타이틀, 세로줄 특성

      


    + 행렬 만들기 = 특성 행렬 * 가중치 행렬


  - 비음수 행렬 인수분해라 불리는 이유는 음수가 아닌 특성과 가중치를 리턴하기 때문이다. 모든 특성은 양수 값을 가져야 함을 의미한다.

  - 단어 출현 횟수와 같은 명사류 데이터뿐만 아니라 주식시장 데이터와 같은 숫자 데이터 문제에도 잘 어울린다.

  - 진행 : 행렬 준비 -> NMF 실행 -> 결과 출력    

     * 특성을 나누는 행렬을 만들고 필요없는 특성을 제거하면서 원하는 차원을 줄여서 원하는 것을 종합적인 결과를 출력함




<참조> 

 

 - 얼굴 인식

 - PCA, NMF


저작자 표시 비영리 변경 금지
Posted by peter yun 윤영식
2015/02/28 11:56

선형 분류기 개념과 지지벡터머신(SVM, support-vector machines)에 대해 알아본다. 데이트 매칭에 데이터를 기본으로 알아봄. 



데이터 세트 


  - 데이터 분할에서 의사결정트리는 세로, 가로 직선으로 고지식함

  - 산포도(scatter plot chart)를 통해 도움받음 

 



기본 선형 분류


  - 산포도에서 각 범주(class) 내 모든 데이터들의 평균을 찾고 그 범주의 중앙을 나타내는 점을 만듦 (그림. 9-4)

  - 일치분류를 위해 백터의 각도를 계산해서 작으면 일치, 크면 불일치 (그림. 9-6)

  - 백터내적(dot-product) : 벡터와 벡터의 방향/크기 비교 






분류 데이터의 특성


  - 데이터 정규화 (Data Normalization)

  - 숫자로 변형 -> 예/아니오(1/-1), 관심/비관심(0/1) : 사람 쌍을 다룰 때 유용 

  - 공통 관심의 수, 모든 관심을 포용할 새로운 변수를 만듦

  - 거리 데이터 구함

  - 각 변수에 대한 축적(scale)을 조정함 : 최대/최소값 




커널 기법 이해

  

  - 커널 트릭 : 차원을 높이지 않고 차원을 올리는 효과를 거둠. 

  - 펑션을 통해 원하는 값을 구함 : 방사 펑션 (RBF: radial basis function)




지지 벡터 머신 (SVM)


  - 각 범주에서 가능한 멀리 떨어진 선을 찾아 해결하려고 시도한다. 비선형을 극복 (non-linear)

  - 먼저 범주를 나눈다 이때 커널 트릭을 사용해서 구하고 이것이 차원이 된다. 각 차원 즉 범주의 사이의 초평면(hyperplane)을 만든다. 

  - 해당 초평면에 근접한 것들이 매칭하는 것이다.  (그림. 9-10)





<참조> 


  - 내적 공간

  - 서포트 벡터 머신(한글), 서포트 벡터 머신 공식(영어)

  - 초평면

  - LIBSVM 라이브러리 

  - 정규화

저작자 표시 비영리 변경 금지
Posted by peter yun 윤영식
2015/02/21 13:23

가격 결정을 위한 모델링은 이질적인 속성을 기반을 둔 숫자 데이터를 예측하는데 최적의 알고리즘이다.




kNN


  - K-nearnest neighbors : k는 마지막 결과를 얻기 위해 평균을 낼 물품의 개수를 말한다. 데이터가 완벽하다면 k=1을 사용한다. 

  - 인접개수의 평균을 낼 때 너무 작거나 크면 안되고 적정개수를 찾아야 한다. 




물품 가중치


  - 거리에 따라 가중치를 둔다. 물품들이 비슷할 수록 그들 간의 거리가 더 가까워진다. 

  - 물품들을 군집화하기 위한 방법 - 적정한 인접 개수를 구하는 것이 필요하다. 

  - 역함수(inverse function), 빼기 함수(substraction function), 가우스 함수(gaussian function)

  - 가중 kNN (Weighted kNN) : 가우시안을 구하고 평균을 구한다 




교차검증


  - 데이터를 학습 세트와 테스트 세트로 나누는 기법들을 총칭한다. (cross validation set) : 표본값을 잘 뽑는 방법

  - training set -> test set 




이질 변수


  - 가격 결정에 너무 큰 영향을 미치는 이질적 요소

  - 변수의 단위가 틀릴때 스케일(Scale)을 조정하여 대입한다. 




실습 


  - $ pip install virtualenvwrapper

 - $ source /usr/local/bin/virtualenvwrapper.sh

 - mkvirtualenv env1

 - vi requirements.txt

// requirements.txt 내역 

beautifulsoup4==4.3.2

html5lib==0.999

lxml==3.4.2

numpy==1.9.1

pandas==0.15.2

python-dateutil==2.4.0

pytz==2014.10

six==1.9.0

wsgiref==0.1.2


  - pip install ipython  (module 없을 경우 계속 pip install <moduleName>)

  - ipython notebook 을 통해서 실습 시작

  - chapter7의 treepredict 데이터 생성 : data.txt

Referrer,Location,Read FAQ,Pages viewed,Service chosen

Slashdot,USA,Yes,18,None

Google,France,Yes,23,Premium

Digg,USA,Yes,24,Basic

Kiwitobes,France,Yes,23,Basic

Google,UK,No,21,Premium

(direct),New Zealand,No,12,None

(direct),UK,No,21,Basic

Google,USA,No,24,Premium

Slashdot,France,Yes,19,None

Digg,USA,No,18,None

Google,UK,No,18,None

Kiwitobes,UK,No,19,None

Digg,New Zealand,Yes,12,Basic

Google,UK,Yes,18,Basic

Kiwitobes,France,Yes,19,Basic


  - treepredict.py 작성 : pandas 통해서 데이터 만듦

import pandas as pd 


def main():

  data = pd.read_csv("./data.txt", sep=",")

  print data

  values = data.values

  print values


if __name__ == '__main__':

  main()


  - pandas로 하면 데이터 유형이 틀려지므로 그냥 책에 있는 내용 copy&paste

  - 실행 내역을 html로 출력

$ ipython nbconvert treepredict.ipynb

[NbConvertApp] Using existing profile dir: u'/Users/nulpulum/.ipython/profile_default'

[NbConvertApp] Converting notebook treepredict.ipynb to html

[NbConvertApp] Support files will be in treepredict_files/

[NbConvertApp] Loaded template full.tpl

[NbConvertApp] Writing 202262 bytes to treepredict.html

(env1)




<참조> 


  - https://virtualenvwrapper.readthedocs.org/en/latest/ : python 가상 환경 

  - https://pypi.python.org/pypi/virtualenv

  - iPython notebook 사용하기 

저작자 표시 비영리 변경 금지
Posted by peter yun 윤영식
2015/02/14 11:29

의사결정 과정 모델링에 대해 알아본다. 의사결정트리는 고객 프로파일링, 재무 위험 분석, 보조 진단, 트래픽 예측과 같은 넓은 응용분야에서 사용한다. 예로 사용자가 유료 고객이 될 가망성을 예측하여 사용자가 고객이 될 것임을 시사하는 요소를 알았다면 이 정보를 이용해서 광고 전략을 짜거나 사이트의 특정 측면에 쉽게 접근할 수 있게 만들거나 유료 고객의 숫자를 늘리는 데 도움이 되는 다른 전략들을 사용할 수 있다.




가입 유형 추정 


  - 유료 고객이 될 가망성을 예측하기 : 베이지안 분류기, 신경망을 이용

  - 관찰 결과를 분류하는 방법 : 의사 결정 트리를 if~then으로 만들고 경로를 따라 내려가면 해답에 이르게 됨 




트리 학습 


  - CART(Classification and Regression Tree) : 데이터를 분리하는 최적의 변수 찾기 true or false로 분기해야 하기 때문 

  - 최적 단편 선정

    + 최상위 부모로 있을 노드를 선정하고 그 하위로 나뉘어 내려감  

    + 지니 불순도(Gini imprity) : 집합 내의 항목 중 하나에 무작위로 적용될 기대 오류율 - 확률이 0이면 모든 것이 올바른 집합안에 있음

    + 엔트로피 : 데이터를 두개의 그룹으로 나누어 엔트로피를 줄여야 한다.

       p(i) = frequency(outcome) = count(outcome) / count(total rows) Entropy = sum of p(i) x log(p(i))  

       p(i) = 빈도(출력) = 횟수(출력)/횟수(가로줄 개수)

       엔트로피 = 모든 출력에 대해 p(i) * log(p(i))의 합 




재귀적으로 트리 만들기


  - 전체 그룹에 먼저 엔트로피를 구함 

  - 어떤 속성이 가장 잘 나누는지 결정하기 위해 정보이득(information gain)을 계산 -> 모든 속성마다 정보이득을 계산해 가장 높은 정보이득을 가진 것을 선택한다. 

  - 관측 값에서 더 분할 할지를 결정 : 새로운 노드마다 최적을 속성을 계산하면서 트리를 생성한다. 




트리 가지치기 


  - 트리를 학습시키면 학습 데이터를 과대하게 반영하는 과잉적합(overfitted) 문제에 직면한다. 

  - 노드 쌍을 병합해서 경계값 이하로 엔트로피를 늘 수 있는지 본다. 그렇다면 한개 노드로 병합한다. -> 과잉적합을 회피 

  - 최소 이득이 높아지면 상위 부모 노드로 병합.

 



손상된 데이터 다루기


  - 데이터 조각이 없을(손상된) 경우 : 각 가지의 결과를 계산하고 개별 가중치로 결합한다.




<참조> 


  - 의사결정트리

  - slideshare 의사결정트리

저작자 표시 비영리 변경 금지
Posted by peter yun 윤영식
2015/02/07 11:59

문서 필터링의 예를 알아본다. 이메일을 문서로 보고 학습된 정보를 통해 좋고 나쁨을 확률적인 값을 구한다. supervised learning의 예이다  




스팸 필터링 

  

  - 분류된 문서를 통해 판단

  - 문서를 bad, good으로 분류 : word === feature 

  - 분류된 것(특성==단어)의 출현횟수를 0과 1사이 값 확률로 변환한다.

  - 스팸필터를 계속 학습 시킨다.




기본 분류기 


  - 나이브 베이지안 분류기 (Naive Bayesian classifier) : A확률과 B확률은 독립적이다. 

    + Pr(A | B)

    + A == feature, B == Category이다. 

    + Category는 문장이 good(0), bad(1) 인지 정의한 정보 

    + 즉, 카테고리별로 피쳐를 분류해서 독립적으로 본다. 

  - 스팸필터의 경우 bad로 필터링되는 경계값을 보통 3으로 설정해서 bad가 될 확률이 good으로 분류될 확률에 비해 3배 높게 설정한다.

  - 피셔 방식(Fisher method) : 특성별 분류 확률 (개별특성) -> 개별특성들에 대한 확률 결합

    + 여기서는 카테고리별로 보지 않고 먼저 피쳐를 보고 카테고리전체를 본다. 

    + Pr(B | A) x Pr(A)/Pr(B)


    Pr(A | B) = Pr(B | A) x Pr(A)/Pr(B)



<참조>


  - 나이브 베이지안 수행하기

저작자 표시 비영리 변경 금지

'Growth Hacker > Machine Learning' 카테고리의 다른 글

[ML] 9주차 - 가격 모델링  (0) 2015/02/21
[ML] 8주차 - 7장 의사결정트리  (0) 2015/02/14
[ML] 7주차 - 6장 문서 필터링  (0) 2015/02/07
[ML] 6주차 - 5장 최적화  (0) 2015/01/31
[ML] 4주차 - 군집하기  (0) 2015/01/03
[ML] 3주차 - 추천하기  (0) 2014/12/13
Posted by peter yun 윤영식

티스토리 툴바