Data science (98)

반응형

Gradient Boosting 의 기초


Gradient Boosting이란 도대체 무엇인지, 약한 Learner를 강화 시켜서 강한 학습기를 만드는 것이 무슨의미인지 직관적으로 이해할 수 있던 자료. https://www.youtube.com/watch?v=sRktKszFmSk Gradient Boosting = Residual Fitting 이다. 매우 Simple한 모델을 구축한 후, Residual에 Fitting한 모델을 만들고, 이 두 개를 결합한다. 그리고 결합된 모델에서 다시 Residual이 나오면 다시 이 Residual에 Fitting하는 모델을 만들어나가고 이를 계속 반복하여 최종 모델을 만들게 된다.




그리고 Stackoverflow에 누군가 Gradient Boosting에 대해 설명한 내용이다. GB는 residual fitting method이다. 아래 그림은 Regression에 GB 방법을 적용시킨 것이지만, Classification에도 GB 를 적용할 수 있다. 적절한 residual만 설정하면 똑같이 적용할 수 있다. 또한 GB 에 가장 인기 많은 베이스모델은 바로 Shallow한 Decision tree이다. decision tree는 다른 통계모형과는 다르게 가정이 적고, 범주형이든 연속형이든 제약없이 쉽게 만들 수 있는 모델이라고 설명하고 있다.







반응형
반응형

XGBoost 모델에서의 변수선택


/* 2017.9.3 by 3months */


원본글

https://machinelearningmastery.com/feature-importance-and-feature-selection-with-xgboost-in-python/



Gradient Boosting에서의 변수 중요도 (Feature Importance)


gradient boosting의 장점은 boosted tree가 완성된 후, feature의 중요도 스코어를 내는 것이 상대적으로 쉽다는 것이다.  어떠한 변수가 decision tree에서 "중요한 결정" 을 내리는데 사용된다면 그 변수의 중요도는 높을 것이다. 중요도는 변수별로 계산되며, 각각의 변수는 중요도 랭킹에 따라 정렬될 수 있다. 어떠한 변수의 중요도는 하나의 decision tree에서 그 변수로 인해 performance measure를 증가하는 양으로 계산된다. 이 때 performance measure는 purity(Gini index)가 사용된다. 최종적인 변수의 중요도는 모든 decision tree의 중요도의 평균값이 된다. boosted decision tree에서 변수의 중요도를 구하는 기술적인 방법은 https://www.amazon.com/dp/0387848576?tag=inspiredalgor-20 이 책의 page 367 에서 볼 수 있다고 한다. 또한 https://stats.stackexchange.com/questions/162162/relative-variable-importance-for-boosting 이 링크도 참고할만 하다.



Python XGBoost에서 변수의 중요도 구하기


get_xgb_imp 함수를 이용해 XGBoost의 변수 중요도를 구할 수 있다. 해당 함수의 파라미터로 트레이닝된 XGBoost의 모델과 feature의 이름을 리스트 데이터 타입으로 넣어주면 된다.


출처 - https://stackoverflow.com/questions/38212649/feature-importance-with-xgbclassifier

def get_xgb_imp(xgb, feat_names):
    from numpy import array
    imp_vals = xgb.booster().get_fscore()
    imp_dict = {feat_names[i]:float(imp_vals.get('f'+str(i),0.)) for i in range(len(feat_names))}
    total = array(imp_dict.values()).sum()
    return {k:v/total for k,v in imp_dict.items()}


예)

from xgboost import XGBClassifier model = XGBClassifier()
# train_x와 train_y는 학습하고자 하는 트레이닝 셋의 설명변수와 종속변수의 ndarray 타입이다. model.fit(train_x, train_y) feat_names = [i for i in range(0,100)] # 변수가 100개인 경우 가정 feature_importance = get_xgb_imp(model,feat_names)

{0: 0.021963824289405683, 1: 0.020671834625323, 2: 0.041343669250646, 3: 0.023255813953488372, 4: 0.05297157622739018,
5: 0.03488372093023256, 6: 0.025839793281653745, 7: 0.021963824289405683, 8: 0.04780361757105943, 9: 0.04392764857881137,
10: 0.06847545219638243, 11: 0.023255813953488372, 12: 0.006459948320413436, 13: 0.012919896640826873,
14: 0.012919896640826873, 15: 0.015503875968992248, 16: 0.0012919896640826874, 17: 0.003875968992248062,
18: 0.006459948320413436, 19: 0.003875968992248062, 20: 0.002583979328165375, 21: 0.00904392764857881,
22: 0.0012919896640826874, 23: 0.0012919896640826874, 24: 0.00516795865633075, 25: 0.0, 26: 0.0,
27: 0.014211886304909561, 28: 0.002583979328165375, 29: 0.0012919896640826874, 30: 0.00516795865633075,
31: 0.002583979328165375, 32: 0.007751937984496124, 33: 0.003875968992248062, 34: 0.00904392764857881,
35: 0.0012919896640826874, 36: 0.012919896640826873, 37: 0.0103359173126615, 38: 0.015503875968992248,
39: 0.003875968992248062, 40: 0.006459948320413436, 41: 0.006459948320413436, 42: 0.012919896640826873,
43: 0.006459948320413436, 44: 0.0103359173126615, 45: 0.02454780361757106, 46: 0.025839793281653745,
47: 0.021963824289405683, 48: 0.006459948320413436, 49: 0.0103359173126615, 50: 0.01808785529715762,
51: 0.020671834625323 .....

* 결과는 위와 같이 dict 타입으로 반환된다.



변수 중요도 그래프 그리기


아래와 같이 matplotlib를 통해 변수 중요도의 barchart를 그릴 수 있다.

from matplotlib import pyplot
pyplot.bar(range(len(feature_importance)), feature_importance.values())
pyplot.show()


반응형
반응형

수식없이 이해하는 Gaussian Mixture Model


/* 2017.8.4 by. 3개월 */


개요


머신러닝에서 자주 사용되는 Gaussian Mixture Model(GMM)을 알아보겠습니다. GMM은 머신러닝에서 Unsupervised Learning(클러스터링)에 많이 활용이 됩니다. 하지만 다른 K-means와 같은 클러스터링 알고리즘과는 다르게 통계적인 용어나 수식 때문에 한 번에 이해하기가 어렵습니다. 이 포스팅에서는 수식 없이 기초적인 통계 수준에서 Gaussian Mixture Model을 이해할 수 있게 글을 써보려고 합니다.


우선 GMM을 알기 위해서는 Mixture Model을 알아야합니다. Mixture Model 전체 분포에서 하위 분포가 존재한다고 보는 모델입니다. 즉, 데이터가 모수를 갖는 여러개의 분포로부터 생성되었다고 가정하는 모델입니다. 책에서는 보통 이를 두고, "Unsupervised Learning의 모수적 접근법"이라고 합니다. 


이 중에서 가장 많이 사용되는 가우시안 믹스쳐 모델(GMM)은 데이터가 K개의 정규분포로부터 생성되었다고 보는 모델입니다.


<표준 정규분포의 pdf>


샘플 데이터 생성


예를 들어, A, B, C라는 세 종류의 정규분포의 PDF(probability density function)를 상상해봅시다. GMM은 데이터가 이 3가지 정규분포중 하나로부터 생성되었으며, 또 그 안에서 random하게 정규분포 형태를 갖고 생성되었다고 보는 모델입니다.


<3개의 정규분포의 pdf>


정규분포 1 : 평균 = -0.5, 표준편차 = 0.2 (파란색)

정규분포 2 : 평균 = -0.1, 표준편차 = 0.07 (주황색)

정규분포 3 : 평균 = 0.2, 표준편차 = 0.13 (녹색)


<3개의 정규분포로부터 랜덤하게 생성된 데이터>


정규분포 1로부터 2000개, 정규분포 2로부터 5000개, 정규분포 3으로부터 10000개의 데이터를 랜덤하게 생성 후, 분포를 알아보기 위해서 그린 히스토그램입니다. 지금 우리는 데이터가 어느 분포로부터 나왔는지를 알기 때문에 색을 통해서 데이터를 구분하고 있습니다. 하지만 우리가 실제로 보는 데이터는 바로 이 데이터들을 모두 합친 모양일 것입니다.


<실제 업무에서 보게되는 데이터>


세 종류의 데이터를 모두 합치면 위와 같은 모양이 됩니다. 여러분들은 이 데이터를 보고 "아 왠지 데이터가 3개의 정규분포로부터 생성되었을 것 같아." 라고 생각하고, GMM을 적용시키면 되는 것입니다. 그림을 보면 무엇이 떠오르시나요?


첫 번째, 3개의 정규분포의 평균과, 분산을 어느정도 짐작할 수 있습니다.

두 번째, 각각의 분포로부터 생성되는 데이터의 양의 차이가 있습니다.


즉, 우리가 알아야할 건 총 9개입니다. 데이터를 통해 이 9개의 모수를 알아내야합니다. (세 가지 분포의 평균과 모수, 세 가지 분포의 Weight) 이 9개의 모수를 통해 데이터의 분포를 설명할 수 있는 혼합 PDF를 만들어낼 수 있는 것이죠.


모수 추정


GMM에서의 모수는 두 가지 종류가 있습니다. 첫 번째는 3가지 정규분포 중 확률적으로 어디에서 속해있는가를 나타내는 Weight 값이고, 두 번째, 각각의 정규분포의 모수(평균, 분산)입니다. 첫 번째 종류의 모수를 잠재변수 라고 부르며, 잠재변수가 포함된 모델은 Mixture Model에서의 모수 추정은 MLE(maximum likelihood estimation)으로 구할 수 없기 때문에 EM(Expectation Maximazation)이라고 부르는 알고리즘을 통해 iterative하게 구하게 됩니다. (왜냐하면 잠재변수가 포함되었기 때문에 likelihood function을 미분할 수가 없기 때문입니다. - 이 부분은 EM 알고리즘을 공부하시면 됩니다.) GMM에 대한 이해가 우선이므로, 이 포스트에서는 EM 알고리즘을 통해 Mixture Model의 모수를 추정하는 방법은 다루지 않겠습니다.



실제 모수와 추정된 모수의 비교


모수 추정은 파이썬 sklearn 패키지의 GaussianMixture 모듈을 이용하였습니다.


실제 모수


Weight1 = 2000/(2000+5000+10000) = 0.117

Weight2 = 5000/(2000+5000+10000) = 0.29

Weight3 = 10000/(2000+5000+10000) = 0.588

평균1 = -0.5

평균2 = -0.1

평균3=  0.2

표준편차1 = 0.2

표준편차2 = 0.07

표준편차3 = 0.13


추정된 모수


Weight1^ = 0.100714

Weight2^ = 0.39059817

Weight3^ = 0.50868783

평균1^ = -0.54073433

평균2^ = -0.07930454

평균3^ =  0.22779283 

표준편차1^ = 0.1680513611965104

표준편차2^ = 0.094137665150565528

표준편차3^ =  0.11380030755670215





데이터의 분포와 데이터를 통해 추정한 모수를 통해 그린 혼합 모델의 PDF입니다. 물론 왼쪽 그림은 히스토그램이라 Y축이 빈도이고, 오른쪽그림은 PDF이기 때문에 scale은 다르지만 모양이 거의 같다는 것을 알 수 있습니다. sklearn의 GaussianMixtureModel 패키지가 모수를 잘 추정해준 것입니다. 혼합모델의 PDF는 구해진 모수를 통해 구할 수 있는데 혼합모델PDF = Weight1*정규분포1PDF + Weight2*정규분포2PDF + Weight3*정규분포3PDF로 구할 수 있습니다.



클러스터링


모수 추정을 완료하였으면 클러스터링은 쉽습니다. 어떤 데이터를 관측하였을 때, "이 데이터가 어떤 분포에서 왔는가?" 를 확률적으로 알아내기만 하면 됩니다. 즉, 예를 들어 데이터 -1.0을 관찰하였을 때, 정규분포1에서 -1.0을 관찰하였을 확률, 정규분포2에서 -1.0을 관찰하였을 확률, 정규분포3에서 -1.0을 관찰하였을 확률을 비교하여 가장 큰 확률을 갖는 정규분포로 이 데이터를 분류하면 됩니다. 그러면 어떤 정규분포에서 그 데이터를 관찰하였을 확률을 어떻게 구할까요? 바로 p-value를 이용해서 구할 수 있습니다.



반응형
반응형

TF-IDF를 통해 sentence classification 해보기


/* 2017.7.7 by 3months.*/


TF-IDF 는 TF/DF 이며, TF(Term Frequency)와 DF(Document Frequency)는 아래와 같이 정의된다.


TF : 현재 문서에서 단어 A가 나타난 횟수

DF : 모든 문서에서 단어 A가 나타난 총 횟수


예를 들어 문서1에서 Mars라는 단어가 3회 나타났고, 모든 문서를 통틀어서 5번 나왔다고 하면

TF-IDF 값은 3/5 = 0.6이다.


문서1에서 Have라는 단어가 100회 나타났고, 모든 문서를 통틀어서는 100000번 나왔다고 하면

TF-IDF 값은 100/100000 = 0.001 이다.


이러한 방식으로 어떠한 단어에 대한 TF-IDF 값을 통해 문서를 feature화 할 수 있고, 이것은 특정 단어의 상대적인 빈도를 나타내주는 값이므로 합리적으로 그 문서를 나타낼 수 있는 feature가 된다.


TF-IDF 모델로 sentence classification


from sklearn.feature_extraction.text import TfidfVectorizer
sentences = ['This is the first document.',
              'This is the second document.',
              'And the third one.',
              'Is this the first document?']
vect = TfidfVectorizer()
X = vect.fit_transform(sentences)
X.todense()


위와 같이 4개의 문장이 있다고 해보자. 그러면 sklearn 라이브러리에서 제공하는 함수를 통해 이를 tfidf vector로 만들 수 있다. 각각의 sentence에 이것을 적용하면 결과 X는 매트릭스가 될 것이다.


y = [1,2,3,4]


위와같이 label을 임의로 정의해보자.


from sklearn.linear_model import SGDClassifier
model = SGDClassifier(loss='logloss')
model.fit(X, y)


tf-idf vectorization을 통해 sentence의 feature를 정의했으면 다시 sklearn의 라이브러리를 이용해 classifier를 만들고, 적합을 시키면된다. 여기서는 SGDClassifier (Stochastic Gradient Descent)라는 linear classifier를 사용하였는데, 아무 classifier나 사용해도된다. (ex LogisticRegression 등등)


X_pred = vect.transform(['My new document third'])

y_pred = model.predict(X_pred)


이제 테스트 데이터를 위와 같이 정의하고 구축한 모델로 예측해보자.


print y_pred


결과

[3]


구축한 모델은 해당 문장을 3번으로 분류했다. third라는 단어가 포함돼서 그런 것 같다. 만약 테스트 데이터에 second라는 단어나 first를 포함시켜보면 모델이 다른 label로 분류한다는 것을 확인할 수 있다.


반응형
반응형

/* 2017.7.7 by 3months */


Vectorization : Low Rank Matrix Factorization

* Coursera의 앤드류 응 교수님의 강의를 머신러닝을 보고 요약한 것입니다. 스스로 공부를 하면서 정리를 한 것이기 때문에 내용 설명이 세세하지 않을 수 있으니 참고해주십시오.



영화 A와 영화 B가 비슷하다는 것을 어떻게 판단할 수 있을까?


위와 같은 영화-사용자 테이블에서 주어진 rating들을 Y라는 matrix form으로 나타내어보자.


또 predicted rating, 즉 rating에 대한 예측값을 위와같은 matrix form으로 쓸 수 있다. 여기서 는 i번 째 사용자의 파라미터 벡터이고

는 j번째 영화에 대한 feature 벡터이다. 예를들어 위 matrix의 1행 1열은 1번 째 사용자 1번째 영화에 대해 내린 rating의 예측값이다.



위의 predicted ratings matrix는 사용자 파라미터 매트릭스 A와 영화 feature 매트릭스 B로 분해할 수 있다.


A = [ - theta1 -

 - theta2 -

 - theta3 -

- ....  -

 - thetan -]


(예를 들어, theta1은 유저1의 사용자 파라미터 벡터)


B = [- x1 -

- x2 -

- x3 -

- ... -

- xm -]


(x1은 영화1의 feature 벡터)


그러면 가 predicted ratings matrix가 된다. 이처럼 매트릭스를 A, B로 분해하는 것을 low rank matrix factorization이라 한다. Optimization을 통해 B 매트릭스를 얻을 수 있고, 최종적으로 i번째 영화의 feature vector인 를 얻을 수 있다. = [x1, x2, x3 ... xn] 으로 나타낼 수 있고 예를 들어, x1 = action, x2= romance, x3 = comedy ... 와 같이 생각해볼 수 있다. 그러면 영화i와 영화 j와 연관되어 있다는 것은 어떻게 알 수 있을까? 그러면 영화 i를 좋아하는 사용자에게 영화 j를 추천해줄 수 있을 것이다.  가장 편리한 measure은 바로 두 벡터의 distance인 이다. 이 값이 작을 수록 두 영화가 비슷하다고 판단할 수 있다.





반응형
반응형

Collaborative Filtering 기초


/* 2017.7.5 by 3months */



 Movie

 Alice

 Bob

 Carol

 Dave

 x1(romance)

x2(action)

 Love at last

 5

 5

 0

 0

?

?

 Romance Forever

 5

 ?

 ?

 0

 ?

?

 Cute puppies of love

 ?

 4

 0

 ?

?

?

 Nonstop car chases

 0

 0

 5

 4

 ?

 ?

 Swords vs. karate

 0

 0

 5

?

 ?

 ?


앞서 contents based approach에서 movie와 user로 이루어진 위와 같은 평점 테이블에서 x1, x2를 알아내기 어렵다는 것을 알았다. (왜냐하면 이 영화가 얼마나 로맨틱한지 얼마나 액션 영화인지 일일이 보고 평가를 내리는 것은 어렵기 때문이다.) 그런데 각 유저들의 feature에 대한 파라미터들을 이미 알고있다고 가정하면 어떨까? 예를 들어 parameter(alice) = [0 5 0], parameter(bob) = [0 5 0], parameter(carol) = [0 0 5], parameter(dave) = [0 0 5] 라고 하자. 그러면 Love at last의 feature은 대략 x0=1, x1 = 1, x2 = 0 라는 것을 알 수 있다. Alice를 예로 들어보면 [0 5 0][1 1 0] = 5 이라서 love at last의 rating이 5가 된다. 이처럼 각 유저들의 parameter들을 안다면 같은 방식으로 다른 영화들의 feature 값을 알아낼 수 있다.





그러므로 위와 같은 optimization 과정을 통해 콘텐츠의 feature vector인 x(i)를 알아낼 수 있다.


정리하면 contents based approach는 콘텐츠의 feature를 통해 유저의 파라미터를 알아내서 이를 통해 rating을 예측하는 것이고, 앞서 설명한 방식은 이와 반대로 유저의 파라미터를 통해 콘텐츠의 feature를 알아내서 이를 통해 rating을 예측하는 것이다. 이는 마치 닭이먼저냐 달걀이 먼저냐와 같은 문제가 된다. 유저의 파라미터를 알면 콘텐츠의 feature를 알 수 있고, 콘텐츠의 feature를 알면 유저의 파라미터를 알 수 있다. 실제로 할 수 있는 것은, random 하게 유저의 파라미터(theta)를 설정하는 것이다. 그리고 이를 통해 콘텐츠의 feature (x)를 추정하고 이를 통해 다시 theta를 설정하고, 다시 x를 설정하는 과정을 반복적으로 수행한다. 이것이 바로 collaborative filtering의 기초적인 아이디어이다.



반응형
반응형
Recommendation System, Contents Based Approach


/* 2017.7.5 by 3months. */


앤드류 응 교수님의 Coursera 머신러닝 강의를 정리한 포스팅입니다.


예 : 영화 평점 예측하기


Movie 

 Alice

Bob

Carol

Dave

 Love at last

 5

 5

 0

 0

 Romance Forever

 5

 ?

 ?

 0

 Cute puppies of love

 ?

 4

 0

 ?

 Nonstop car chases

 0

 0

 5

 4

 Swords vs. karate

 0

 0

 5

 ?


Notation



출처: http://3months.tistory.com/141 [Data Science & Personalized Medicine]

예 : 영화 평점 예측하기


Movie 

 Alice

Bob

Carol

Dave

 Love at last

 5

 5

 0

 0

 Romance Forever

 5

 ?

 ?

 0

 Cute puppies of love

 ?

 4

 0

 ?

 Nonstop car chases

 0

 0

 5

 4

 Swords vs. karate

 0

 0

 5

 ?


Notation



출처: http://3months.tistory.com/141 [Data Science & Personalized Medicine]

예 : 영화 평점 예측하기


Movie 

 Alice

Bob

Carol

Dave

 Love at last

 5

 5

 0

 0

 Romance Forever

 5

 ?

 ?

 0

 Cute puppies of love

 ?

 4

 0

 ?

 Nonstop car chases

 0

 0

 5

 4

 Swords vs. karate

 0

 0

 5

 ?


Notation



출처: http://3months.tistory.com/141 [Data Science & Personalized Medicine]

예 : 영화 평점 예측하기


Movie 

 Alice

Bob

Carol

Dave

 Love at last

 5

 5

 0

 0

 Romance Forever

 5

 ?

 ?

 0

 Cute puppies of love

 ?

 4

 0

 ?

 Nonstop car chases

 0

 0

 5

 4

 Swords vs. karate

 0

 0

 5

 ?


이러한 영화 평점 테이블에서 missing value(?) 을 예측하는 것이 recommendation system의 목적이다. 그렇다면 어떻게 평점을 예측할 수 있을까? 한 가지 방법은 바로 Content Based Recommendation Approach이다.


 Movie

 Alice

 Bob

 Carol

 Dave

 x1(romance)

x2(action)

 Love at last

 5

 5

 0

 0

0.9

 0

 Romance Forever

 5

 ?

 ?

 0

 1.0

 0.01

 Cute puppies of love

 ?

 4

 0

 ?

 0.99

 0

 Nonstop car chases

 0

 0

 5

 4

 0.1

 1.0

 Swords vs. karate

 0

 0

 5

?

 0

 0.9


다음과 같이 영화에 대한 feature가 있다고 가정하자. x1은 romance 장르의 정도를 나타낸다. 그러면 Love at last에 대한 feature vector x_1 = [1 0.9 0] 이라고 하자. (첫번째 원소인 1은 interceptor feature이다.) Romance Forever의 feature vector을 x_2이라하면 x_2 = [1 1 0.01] 이라고 할수 있다.


그러면 이를 linear regression으로 풀 수 있다. 각 사람마다 parameter 3개가 있다고 보고 이 파라미터를 러닝하면된다. 그리고 종속변수는 rating이다. 만약 alice의 파라미터인 parameter(alice) = [0 5 0] 이라고 가정한다면, alice의 cute puppies of love에 대한 평점의 예측값은 [0 5 0][1 0.99 0] = 4.95이다. 지금은 그냥 파라미터값을 임의로 정한 것이지만 이 파라미터들을 러닝할 수 있을 것이다.


이렇게 Contents의 속성을 통해 rating을 예측하는 방법을 contents based recommendation system이라 한다. 이러한 contents의 속성별로 유저가 각각의 속성에 대응하는 파라미터를 가지고 있다고 보면 되는 것이다.




수식으로 표현하면 위와 같다. 우리의 목적은 데이터를 통해 유저마다 존재하는 파라미터를 학습하는 것이다. 이 파라미터와 영화 속성값과의 내적값을 통해 rating을 구할 수 있다.  또한 user j의 평가한 영화의 갯수 m(j)를 regulariztion term에 넣어서 활용할 수 있다. (데이터가 적은 사람은 overfitting을 방지하기 위해 더 regularization한다.)





파라미터 학습 방법은 위와같은 squared error을 최소화 시키면된다. 또한 overfitting을 방지하기 위해 regularization term을 넣어줄 수도있다. 이를 위해서 mle 같은 통계적인 모수 추정방법을 사용할 수 있지만 머신러닝에서는 gradient descent 방법을 일반적으로 사용하여 구하게 된다. gradient descent 방법에서는 iteration을 돌면서 파라미터들을 변경시켜 오차값을 줄이는 방식으로 동작한다.


contents based approach의 단점은 영화나 책에 대하여 feature를 알아내는 것이 어렵다는 것이다. 이 영화가 얼마나 로맨틱한지 얼마나 액션영화인지 그 정도를 수치화해서 feature로 정의하는 것은 간단하지 않다.


반응형
반응형

앤드류 응 교수님의 Coursera Machine Learning 강의를 정리한 포스팅입니다.


추천시스템은 머신러닝 분야의 중요한 응용 분야중의 하나이다. 많은 실리콘 밸리 회사들이 더 좋은 추천 시스템을 만들기 위해 노력하고 있다. 아마존, 넷플릭스 등등의 회사들이 웹 사이트에서 이러한 추천 시스템을 활용하고 있다. 이러한 추천 시스템은 이러한 회사들이 더 좋은 수익을 올릴 수 있도록 도와준다. 그러므로 추천 시스템의 성능을 개선하는 것은 기업의 이익에 큰 영향을 미친다. 추천 시스템 분야는 학계보다는 산업계에서 더 선호되는 분야라고 한다.


예 : 영화 평점 예측하기


Movie 

 Alice

Bob

Carol

Dave

 Love at last

 5

 5

 0

 0

 Romance Forever

 5

 ?

 ?

 0

 Cute puppies of love

 ?

 4

 0

 ?

 Nonstop car chases

 0

 0

 5

 4

 Swords vs. karate

 0

 0

 5

 ?


Notation


n_u = no.users. (= 4)

n_m = no.move (= 5)

r(i,j) = 1 if user j has rate movie i (rating을 한 경우 1로 정의)

y(i,j) = rating given by user j to movie i (only if r(i,j) = 1) (movie i가 user j 에게 받은 평점)



?은 아직 영화를 보지 않고, 평점을 내리지 않은 것이다. 이를 예측하는 것이 바로 기본적인 추천 시스템의 목적이다.



반응형
반응형

/* 2017.7.2 */


Universal Approximation Theorem


Universal Approximation Theorem이란 1개의 히든 레이어를 가진 Neural Network를 이용해 어떠한 함수든 근사시킬 수 있다는 이론을 말합니다. (물론 활성함수는 비선형함수여야합니다.) 재미로 1개의 히든 레이어를 가진 신경망 모델로 실제 함수를 근사시킬 수 있는지 확인해보았습니다.


import numpy as np
%matplotlib inline
import matplotlib.pyplot as plt
from keras.models import Sequential
from keras.layers import Dense
from keras.optimizers import SGD
from keras import optimizers
import math

우선 필요한 라이브러리를 임포트합니다.


x = np.linspace(-10, 10, 100)
y = 3*np.sin(x)*np.cos(x)*(6*x**2+3*x**3+x**1)*np.tan(x)

제가 근사시키고 싶은 함수는 위와 같습니다.

y = 3sin(x)cos(x)(6x^2+3x^3+x)tan(x) 라는 함수인데 그냥 생각나는대로 만든 함수입니다.




이 함수의 모양은 이렇게 생겼습니다. Universal Approximation Theorem은 신경망 모델로 이러한 복잡한 함수도 근사시킬 수 있다는 이론인데 한 번 확인해보겠습니다.


우선 여러개의 히든 레이어를 가진 신경망 모델로 확인해보겠습니다.



Multi layer perceptron

model = Sequential()
model.add(Dense(10, input_shape=(1,), activation='relu'))
model.add(Dense(10, input_shape=(1,), activation='relu'))
model.add(Dense(10, input_shape=(1,), activation='relu'))
model.add(Dense(10, input_shape=(1,), activation='relu'))
model.add(Dense(1, activation='linear'))
rms = optimizers.RMSprop(lr=0.01, rho=0.9, epsilon=1e-08, decay=0.0)
model.compile(loss='mean_squared_error', optimizer=rms, metrics=['accuracy'])
model.fit(x, y, epochs=3000)


위와 같은 4개의 히든 레이어로 구성된 신경망 모델을 만들고 RMSProp optimizer을 통해 학습하였습니다. 학습된 모델로 구현된 함수는 아래와 같이 생겼습니다.


prediction = model.predict(x) plt.plot(x, prediction) plt.show()




조금 다른 부분도 있지만 잘 근사한 것을 확인할 수 있습니다. 사실 처음에는 adam optimizer을 사용하였는데, loss 한계점 아래로는 떨어지지가 않았습니다. 그래서 learning rate를 조절할 수 있는 rmsprop optimizer을 이용하였고, learning rate를 다양하게 변화시켜가면서 위와 같은 hyperparameter일 때 가장 잘 학습하는 것을 확인하였습니다.



Singlel hidden layer perceptron

model = Sequential()
model.add(Dense(10000, input_shape=(1,), activation='relu'))
model.add(Dense(1, activation='linear'))
rms = optimizers.RMSprop(lr=0.06, rho=0.9, epsilon=1e-08, decay=0.0)
model.compile(loss='mean_squared_error', optimizer=rms, metrics=['accuracy'])
model.fit(x, y, epochs=5000)


진짜 universal approximation theorem은 "단 한 개"의 히든레이어로도 이런 것을 할 수 있다는 것이기 때문에 한 개의 히든 레이어만 가지고 함수를 근사시켜보겠습니다. 무려 10000개의 node를 갖는 1개의 히든레이어를 5000 epochs 을 돌려서 다음과 같은 근사함수를 만들어냈습니다.




위의 multi layer perceptron 보다는 못하지만 어느정도 근사할 수 있다는 것을 확인할 수 있었습니다. 노드수, learning rate, optimizer 등을 바꿔가면서 해보면 더 잘 함수를 근사시킬 수 있을 것입니다.



반응형
반응형

Word Embedding


Word Embedding이란 Deep Learning 분야, 이 중에서도 특히 자연어처리에서 필수적으로 알아야할 개념이다. Word Embedding은 Word를 R차원의 Vector로 매핑시켜주는 것을 말한다.



예를 들어 위와 같이 cat이나 mat같은 단어를 특정 차원의 벡터로 바꾸어주는 것이다. 이렇게 단어를 벡터로 바꾸어주는 것은 하나의 Matrix이다. 이를 W라 부른다. W 함수는 매우 중요하다. 이를 통해 단어가 의미 있는 벡터로 변한다. 비슷한 두 개의 단어는 비슷한 벡터로 바뀐다던지 하는 식으로 말이다. W는 Learning을 통해 학습할 수 있다.


예를 들어, 5000개의 단어로 이루어진 단어 세트가 있으면 각각의 단어는 [0,0,0,1,0 ... 0,0,0] (5000열) 과 같이 나타낼 수 있다. 이 때 각각의 단어를 Word Embedding을 통해 32차원 벡터로 나타내고자 하면 W의 차원은 5000*32이다. 이를 학습하여 [0.2,0,4,0.5 ... 0.8,8] 과 같은 32차원의 벡터를 형성해낸다.


Word Embedding은 다음과 같은 놀라운 특성도 가질 수 있다.



woman을 나타내는 벡터와 man을 나타내는 벡터의 차이는 남녀의 차이를 나타내는 벡터이다. 이것이 aunt와 uncle의 차이를 만들어낸다. 예를 들어 he is a man는 옳은문장 she is a man은 틀린 문장을 구분하는 classifier에서 aunt와 uncle에 대해서도 똑같은 일을 할 수 있게 만든다.


참고


http://colah.github.io/posts/2014-07-NLP-RNNs-Representations/

반응형
반응형