기계학습 평가 척도. precision recall

Published / by greennuri

엄태웅님의 youtube 링크

여기서는 preision, recall에 대한 설명 보다 왜 이런 평가 지표를 쓸가에 대해서 잘은 모르지만 최대한(제 나름) 설명 하려고합니다.

일반적으로 지도학습(대부분 지도학습 이지만 ^^)에서 성능을 평가 하는 척도는 정확도 (accuracy)인데요.

deep learning이나 machine learning 예제로 나오는 코드 보면 거의 대부분 정확도(acc)라는 지수로 모델의 성능이 좋다 나쁘다를 평가 합니다.

cnn쪽에서는 예외적으로 top-1 error, top-5 error을 쓰는데요 우선 그것은 제외하겠습니다.

acc(정확도)는 고양이 사진 100장, 개 사진 100장 이 있고 고양이 사진은 90장, 개 사진은 90장으로 판별 했다고 볼때, 180(맞춘 전체값) / 200(전체 데이터셋 크기) 해서 90%의 값이 나옵니다

acc(정확도)는 전체 데이터 중에서 정답을 맞춘 비율을 의미합니다.

더 자세한 정의는 여기 참고 하세요

그런데, 고양이랑 개 사진은 애호가가 많아서 인터넷에서 엄청 찾을 수 있는데, 좀 드문 수달도 같이 학습 시켜서 고양이 사진 100장, 개 사진 100장, 수달 사진 10장으로 기계학습을 시켜서 고양이 사진 89장, 개 사진 85장, 수달 사진 1장을 제대로 인식 했다고 하면 전체 인식률은

89(고양이) + 85(개) +1(수달) / 210(전체) = 83.333 약 83% 나옵니다

그런데 수달은 10장 중에 1장만 제대로 인식 했는데 전체 정확도는 83%입니다

뭐가 이상하지 않나요?

문제를 더 간단히 해보면

고양이 사진 90장, 수달 사진 10장으로 어떤 모델을 학습하고,  제대로 인식된 고양이 사진이 80장, 수달 사진이 3장 이면 정확도는

80 + 3 / 100 = 83 % 정확도

수달은 10장 중에 3장만 제대로 뽑아 냈는데, 정확도는 83% ???

이러한 경우는 학습 시키는 데이터의 수량이 비슷하지 않아서 생기는 문제입니다. 이러한 경우 정확도가 아닌 다른 평가 척도를 가져와야 하는데 그중 대표적인데 precision, recall, f1입니다. 자세한 설명은 링크를 통해 들어보세요

설명을 워낙 잘 하셔서 링크로 대신합니다.

 

원문

scikit으로 mnist나 iris 같은 데이터를 지도 학습 시킨다고 할때

어떠한 지도학습 모델에 적용 시키느냐에 따라서 성능(acc)이 차이가 나지만,

동일한 지도학습 모델에서도 파라메터 최적화 여부에 따라서 성능이 더 좋아 지기도 합니다.

여기서는 scikit-learn에서 제공하는 grid_search를 통해 학습 모델 최적화에 대해서 얘기 합니다.

from __future__ import print_function

from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.model_selection import GridSearchCV
from sklearn.metrics import classification_report
from sklearn.svm import SVC

print(__doc__)

# Loading the Digits dataset
digits = datasets.load_digits()

# To apply an classifier on this data, we need to flatten the image, to
# turn the data in a (samples, feature) matrix:
n_samples = len(digits.images)
X = digits.images.reshape((n_samples, -1))
y = digits.target

# Split the dataset in two equal parts
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.5, random_state=0)

# Set the parameters by cross-validation
tuned_parameters = [{'kernel': ['rbf'], 'gamma': [1e-3, 1e-4],
                     'C': [1, 10, 100, 1000]},
                    {'kernel': ['linear'], 'C': [1, 10, 100, 1000]}]

scores = ['precision', 'recall']

for score in scores:
    print("# Tuning hyper-parameters for %s" % score)
    print()

    clf = GridSearchCV(SVC(), tuned_parameters, cv=5,
                       scoring='%s_macro' % score)
    clf.fit(X_train, y_train)

    print("Best parameters set found on development set:")
    print()
    print(clf.best_params_)
    print()
    print("Grid scores on development set:")
    print()
    means = clf.cv_results_['mean_test_score']
    stds = clf.cv_results_['std_test_score']
    for mean, std, params in zip(means, stds, clf.cv_results_['params']):
        print("%0.3f (+/-%0.03f) for %r"
              % (mean, std * 2, params))
    print()

    print("Detailed classification report:")
    print()
    print("The model is trained on the full development set.")
    print("The scores are computed on the full evaluation set.")
    print()
    y_true, y_pred = y_test, clf.predict(X_test)
    print(classification_report(y_true, y_pred))
    print()

# Note the problem is too easy: the hyperparameter plateau is too flat and the
# output model is the same for precision and recall with ties in quality.

위 예제는 원문에 있는 코드를 그대로 가져 왔습니다

예제 코드에서는 svm을 최적화 하는 예제

보통 일반적으로 학습을 하려 하면 다음과 같이 수행.

X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.5, random_state=0)
#학습 및 평가 데이터셋 분리 
clf = SVC()
clf.fit(X_train, y_train)
#위 코드를 실행 시키면 주어진 데이터에서 알아서 학습을 수행

위 코드에서 나오는 정확도(acc)는 svc 모델의 초기값을 기반으로 나온 정확도

이걸 grid_search를 통해 다음과 같이 최적화 시킴

# Set the parameters by cross-validation
tuned_parameters = [{'kernel': ['rbf'], 'gamma': [1e-3, 1e-4],
                     'C': [1, 10, 100, 1000]},
                    {'kernel': ['linear'], 'C': [1, 10, 100, 1000]}]

scores = ['precision', 'recall']

for score in scores:
    print("# Tuning hyper-parameters for %s" % score)
    print()

    clf = GridSearchCV(SVC(), tuned_parameters, cv=5,
                       scoring='%s_macro' % score)
    clf.fit(X_train, y_train)

    print("Best parameters set found on development set:")
    print()
    print(clf.best_params_)
    print()
    print("Grid scores on development set:")
    print()
    means = clf.cv_results_['mean_test_score']
    stds = clf.cv_results_['std_test_score']
    for mean, std, params in zip(means, stds, clf.cv_results_['params']):
        print("%0.3f (+/-%0.03f) for %r"
              % (mean, std * 2, params))
    print()

    print("Detailed classification report:")
    print()
    print("The model is trained on the full development set.")
    print("The scores are computed on the full evaluation set.")
    print()
    y_true, y_pred = y_test, clf.predict(X_test)
    print(classification_report(y_true, y_pred))
    print()

tunes_parameters 변수에 해당 모델(여기서는 svc)에서 최적화 시킬 파라메터를 정의 한다.

scores 변수에는 precision, recall 어느 지수를 기준으로 최적화 할지를 지정한것.

위 코드를 수행 하면 precision 기준 최적화 한 셋트(tunes_parameters에 나온 파라메터를 다 대입해서 수행)와 recall 기준 최적화 한 셋트를 수행

grid_search는 위의 그림 중 왼쪽에 해당, 모델을 이루고 있는 하이퍼 파라메터를 그림과 같이 그리드를 구성하고 각각 지점에서 성능을 측정한다.

그리고 scikit_learn에서 최적화 알고리즘중 하나인 random_search는 위 그림 중 오른쪽에 나타난데로, 하이퍼파라메터들을 랜덤하게 골라서 최적화를 수행한다.

 

 

 

jhbot 서비스 약관

Published / by greennuri

본 이용 약관에 따라 귀하와 jhbot 간의 계약(‘계약’)이 체결됩니다. 계약을 주의해서 읽어 보시기 바랍니다. 계약 내용을 이해하고 승인함을 확인하려면 ‘동의’를 클릭하십시오.

A. jhbot 서비스 소개

본 계약은 귀하의 jhbot 서비스(‘서비스’) 사용을 규율합니다. 본 서비스를 통해 귀하는jhbot 내 서비스(‘콘텐츠’)를 획득 또는 구독할 수 있습니다.jhbot 서비스는 귀하의 거주 국가(‘본국’)에서 사용할 수 있습니다. 귀하는jhbot 서비스를 사용하려면 호환되는 하드웨어 및 소프트웨어(최신 버전 권장 또는 필수)와 함께 인터넷 연결(요금이 부과될 수 있음)이 필요합니다. jhbot 서비스의 성능은 이러한 요인에 영향을 받을 수 있습니다.

B. jhbot 서비스 사용

귀하는 jhbot 서비스를 무료로 취득할 수 있습니다.

jhbot  서비스를 사용하고 콘텐츠에 액세스하려면 Facebook ID가 필요합니다.

개인 정보

jhbot 서비스 사용에는jhbot의 개인정보 취급방침이 적용됩니다.

 

Neural Variational Inference for Text Processing

Published / by greennuri

https://arxiv.org/abs/1511.06038

abstract

Recent advances in neural variational inference have spawned a renaissance in deep latent variable models. In this paper we introduce a generic variational inference framework for generative and conditional models of text. While traditional variational methods derive an analytic approximation for the intractable distributions over latent variables, here we construct an inference network conditioned on the discrete text input to provide the variational distribution. We validate this framework on two very different text modelling applications, generative document modelling and supervised question answering. Our neural variational document model combines a continuous stochastic document representation with a bag-of-words generative model and achieves the lowest reported perplexities on two standard test corpora. The neural answer selection model employs a stochastic representation layer within an attention mechanism to extract the semantics between a question and answer pair. On two question answering benchmarks this model exceeds all previous published benchmarks.

한글 축약

최근 신경 변이 추론의 진보는 깊은 잠재 변수 모델에서 르네상스를 일으켰다. 이 논문에서는 생성 및 조건부 텍스트 모델을위한 일반적인 변화 추론 프레임 워크를 소개한다. 기존의 변량 방법은 잠재 변수에 대한 다루기 어려운 분포에 대한 분석 근사를 유도하지만, 여기서는 이산 텍스트 입력을 조건으로하는 추론 네트워크를 구성하여 변량 분포를 제공합니다. 우리는 두 가지 매우 다른 텍스트 모델링 응용 프로그램, 생성 적 문서 모델링 및 감독 질문 응답에 대해 이 프레임 워크를 검증합니다. 우리의 신경 변이 문서 모델은 연속적인 확률적 문서 표현과 단어 생성 모델을 결합하여 2 개의 표준 테스트 코퍼에서 가장 낮은보고 난민을 성취합니다. 신경 응답 선택 모델은주의 메커니즘 내에서 확률 적 표현 레이어를 사용하여 질문 및 답변 쌍 사이의 의미를 추출합니다. 두 가지 질문 응답 벤치 마크에서이 모델은 이전에 게시 된 모든 벤치 마크를 능가합니다.

딥러닝으로 문장 분류 하기

Published / by greennuri

http://www.bonaccorso.eu/2016/08/02/reuters-21578-text-classification-with-gensim-and-keras/

자연어 처리에서 word2vec은 거의 기본으로 쓰인다.

개인적으로 말하면 word2vec은 symbolic data를 vector represent 형태로 변환 해주는 역할을 수행 한다고 봄(아님 말고..)

문장을 분류하기 위한 여러가지 방법이 있는데

가장 기본인 bag-of-word(BOG라고 간단히 부르기도 함) 모델은 문장을 단어 주머니로 비유해서

하나의 문장은 여러 단어가 들어가 있는 주머니로 인식한다.

이 방법은 간단한데 비해 단어의 순서, 수식관계 같은 정보가 사라진다.

그래서 좀 더 발전 된데 CBOW(Continus Bag of Word) 연속? 흠… 순서가 있는 단어 주머니 모델이다.

이 모델로 하면서 deep learning을 위해 vector화된 데이터로 변환 하는 방법이 word2vec(대충.. 넘어가자 어렵다…)

이 방법을 이용하면 단어를 입력하면 수치로 변형된 벡터가 나온다 그걸 가지고 딥러닝에 쓰면되는데.

그 입력을 단어가 아니라, 구/절/문장/텍스트 단위로 확장 시키고 그 특성을 활용해서

각각을 구분하는 방법을 딥러닝으로 구현하는 것을 보여줌.

spark랑 gensim을 비교한 내용

http://hoondongkim.blogspot.kr/2016/07/word2vec-vector-algebra-comparison.html

 

딥러닝 만드는 제작자들한테 부탁 하고 싶은것

Published / by greennuri
  1. 좀 쉽게 만들어줘~~~
    1. theano, tensorflow같은 그래프 구조 어렵다(허접이라 좀 어렵다)
  2. gpu 가속 기본으로 좀 넣어줘라
    1. gensim 니네들은 뭔데 gpu가속 안 하냐…
  3. 분산 컴퓨팅이랑 통합 좀 해줘
    1. 데이타 크면 컴퓨터 하나를 몇시간을 켜야 하는데… 허접한 컴이라도 몇대 있음 분산 병렬 처리로 좀 되게 해줘…

쉽게 이야기 하면, keras 같은 모듈 방식에 spark위에서 멀티로 돌려도

알아서 처리 되는, 그리고 gpu도 기본으로 사용하는 라이브러리 좀…