중고나라 물품의 가격을 산정할 때

가격을 쉽게 가져올 수 있는가?

제품의 상태는 어떻게 판단하나?

A/S 


가격을 예측하는 모델을 만든다.

베이지안 분류기나 의사결정트리 SVM은 가격과 같은 많은 이질적인 속성들에 기반을 둔 숫자 데이터를 예측하기 어렵다.

가격 예측에는 여러 변수들의 최적 가중치를 찾아야 하는데 그것을 자동으로 결정하기 위해 5장에서 개발한 최적화 기법들을 사용


01. 예제 데이터 세트 만들기

와인을 이용한 가격 예측


02. kNN

- k-nearest neighbors : 가장 비슷한 것 몇 개를 찾아 가격들이 대강 같다고 가정하는 것. 

(1) 이웃 개수

- k : 마지막 결과를 얻기 위해 평균을 낼 물품의 개수

- 노이즈를 추가함 : 몇 사람은 싸게 구입할 것이고 어떤 사람은 비싸게 구입할 수도 있기 때문이다.

- 기술 변수를 적당하게 추가해야 한다. 최적화 기법으로 물품 개수를 선정해야 한다.

(2) 유사도 결정하기

- 유클리디안 거리를 사용한다.

* 다른 곳에서는 피어슨 상관계수, 코사인(자카드, 맨해튼 거리)(?) 사용 가능

* 어떤 걸 사용할 지에 대해서는 좀 알아봐야한다.

kNN은 계산량은 많지만 새로운 데이터가 추가될 때마다 새로 학습하지 않아도 되는 장점이 있다.


03. 물품 가중치

- 이유 : 적정한 거리의 군집을 만들기 위해서 가까운 건 더 가깝게 만들어 주고 먼 것은 더 멀게 만들어 주기 위해서

거리에 가중치를 주는 방법 3가지

- 역 함수 : 거리 값을 1에서 나눈다. 노이즈에 너무 민감할 수 있다.

- 빼기 함수 : 뺀 값이 0보다 작으면 0으로 한다. 하지만 0이 되는 경우 추천을 하지 못하는 경우 발생

- 가우스 함수 : 빨리 계산하기가 어렵지만 적당한 가중치를 만들어 줌

- 가중 kNN

결과들의 평균을 계산하는 대신에 가중 평균(weighted average)을 계산한다.

가중 평균은 각 물품의 가중치(여기서는 가우시안을 사용)에 값을 곱한 후 서로 더하고, 그것을 전체 가중치의 합으로 나눠서 계산


04. 교차 검증(cross-validation)

데이터를 학습 세트와 테스트 세트로 나누는 기법들을 총칭하는 이름

전체 데이터의 5% 정도를 테스트 세트로 만든다. 그러면 나머지 95% 학습 세트가 된다.

실제 결과와 예측의 차이를 구한다.


05. 이질 변수

(1) 축척 조정

거리를 실제 값에 근거하는 방법이 아니라 값을 정규화해서 그 값들이 모두 같은 공간에 있는 것처럼 만드는 방법


06. 축척 최적화

어닐링 최적화를 시도하여 교차 검증이 최적값을 될 수 있는 변수들의 가중치를 찾는다.


07. 불균등 분포

- 어디서 구매했는지에 따라 가격이 달라질 수 있으므로 해당 위치의 데이터를 더 면민히 관찰해야 한다.

- 확률 밀도 추정하기

단일 가격을 예측하기 보다는 물품이 특정 가격 범위 내에 떨어질 확률을 계산


뒷부분엔 이베이를 활용하여 가격을 예측하였다.



신고
Posted by 공놀이나하여보세

2.1 분포

- 어떤 값과 그 값이 나타날 확률의 집합

PMF(probability mass function) - 확률 질량 함수

Thinkbayes.py에 정의된 파이썬 모듈


*삽질기

from thinkbayes import Pmf 를 하고 나면 아래와 같은 에러가 발생했다.

File "thinkbayes.py", line 88 if x <= xs[0]: ^ SyntaxError: invalid syntax



맥을 사용하는데 미숙한 내가 웹브라우져에서 '파일->별도 저장' 으로 저장을 했더니 thinkbayes.py 파일에 웹코드가 들어간 문제였다.

그래서 그냥 웹브라우져에 있는 파일을 긁어서 thinkbayes.py로 새로운 파일을 만들고 붙여 넣기를 하여 사용했다.


2.2 쿠키 문제

쿠키 문제를 잘 읽어봐야 2.3장이 이해가 간다.

pmf.Set : 가설에 대한 사전 확률값을 설정함

pmf.Mult : 우도 값을 설정하면 위에서 설정한 확률 값을 곱해준다.

pmf.Normalize : 정규화를 해준다. 그런데 왜 정규화를 해주는지 책으로는 잘 모르겠다.

일단은 Prob를 해주기 전에 정규화를 해 줘야 한다고 생각을 해야겠다.


pmf.Prob : 사후 확률 즉 베이지안 이론에 근거한 결과값을 확인할 수 있다.


2.3 베이지안 프레임워크

아래 코드를 보면 앞에서는 pmf.Set에 확률 값을 넣어줬는데 여기서는 각 가설마다 1이란 값을 넣어줬다.

원래 확률의 총합은 1이 되는 것이지만 여기서는 각각의 값을 넣어준 후 pmf에 들어 있는 가설의 수로 나누어 확률이 표현되는 것 같다.

Normalize라는게 어떻게 보면 위에 1이란 값을 가설의 수로 나누어 확률로 만들어 주는 일도 하는 것이 아닐까 하는 생각이 든다.

__init__함수는 가설의 사전확률 값을 설정하는 것이다. 그런데 이상한 것이 Pmf를 클래스가 인자로 받고 또 Pmf.__init__을 호출하면서 매개변수로 self를 넘긴다는 것이다. 휴 내가 파이썬 문법을 잘 모르니 이게 또 어렵다. 이건 다음에 또 공부해 봐야겠다.

*뒷부분을 보다 보니 class의 인자가 Pmf임을 알 수 있다.

*이것은 Pmf함수를 상속받는 다는 말인 것 같다.

def __init__(self, hypos): Pmf.__init__(self) for hypo in hypos: self.Set(hypo, 1) self.Normalize()


Update는 우도 값을 설정해주는 함수이다.

매개변수인 data는 사후확률을 구하고자 하는 쿠키 이름이다.

이 책에서는 vanilla를 data로 입력하였는데 이 뜻은 vanilla가 선택되었을 때 어느 그릇에서 나왔는지에 대한 사후 확률을 구하기 위해서이다.

self.Likelihood는 data값에 대한 우도 값을 리턴해주는 함수이다. 이 함수는 아래에 정의한다.

    mixes = {

        'Bowl 1':dict(vanilla = 0.75, chocolate = 0.25),

        'Bowl 2':dict(vanilla = 0.5, chocolate = 0.5),

    }

    def Likelihood(self, data, hypo):

        mix = self.mixes[hypo]

        print mix

        like = mix[data]

        print like

        return like


입력한 vanilla가 각 그릇에서 나올 수 있는 사후 확률을 구해준다. 

for hypo, prob in pmf.Items():

    print hypo, prob


2.4 몬티 홀 문제

다시 몬티 홀 문제이다.

1장에서 몬티 홀 문제가 나왔는데 이해를 하지 못했다.

파이썬 코드를 풀어보며 이해가 될 지 안될지 한번 해보자 ㅋㅋ


A B C 세개의 가설을 입력으로 받는다.

'B'를 update에 입력한다. 앞에서 봤지만 update에 입력하는 값은 사후확률을 구하고자 하는 값이다. 

헉!!! 앞에서 가설은 그릇이었고 update에 입력하는 값은 그릇에 들어있던 쿠키였는데 여기서는 가설 중에 하나인 'B'를 입력한다 왜지??????


Likelihood함수를 보니 내용이 바꼈다.

가설과 데이터('B')가 같으면 우도가 0이고 가설이 'A'이면 우도가 0.5 가설이 'C'이면 우도가 1이다.

왜???? 이건 결국 다시 1장으로 돌아가 공부를 하고 와야한다. ㅠㅠ

다시 정리해보자.

A B C 세개의 문자 중 한개의 뒤에 자동차가 있다.

게스트가 'A'를 선택했다.

그러자 호스트가 'B'뒤에 아무것도 없는 것을 보여주었다.

그러면서 'C'로 바꿀 것이냐 말 것이냐를 물어본다.

그럼 게스트는 'C'를 선택하는 것이 옳으냐 'A'를 선택하는 것이 옳으냐이다.

여기서 'A'랑 'C' 둘 중에 하나를 고르는 것이니 확률은 1/2이 아닌가??


이해가 잘 가지 않아 파이썬으로 몬티 홀 문제를 짜서 실제로 돌려보았다.

아래 주소에서 확인 가능하다.

http://gongnorina.tistory.com/55


likelihood 함수를 다시 보자.
    def Likelihood(self, data, hypo):
        if hypo == data:
            return 0
        elif hypo == 'A':
            return 0.5
        else:
            return 1


사실 likelihood함수가 잘 이해가 가지 않는다.

몬티 홀은 알겠지만 여전히 이 함수는 이상하다. 

이건 또 다음에 더 보자.


2.5 프레임워크 캡슐화

여기서는 thinkbayes파일의 Suite함수에 대해 설명하고 있다.

Suite함수는 Pmf를 상속받은 베이지안용 클래스이다.

몬티 홀은 Likelihood 함수만 내용이 좀 달라지므로 Likelihood함수만 다시 작성해 주었다.


2.6 M&M문제

Suite를 이용하여 M&문제를 풀어보았다.

역시 Likelihood함수만 다시 작업해 주었다.


Likelihood함수가 역시 또 어렵다.

여기서 data는 bag, color 두개나 리턴한다.

그건 Update에서 data를 두개 넣어주었기 때문이다.

이것보다 더 특이한건 Update를 두개 넣어준 것이다.

bag1에서 yellow, bag2에서 green이 나올 화률을 토대로 bag1과 bag2 의 확률을 구하는 문제인데 이렇게 Update를 여러개 넣는 방법에 대해서는 이야기해준 적이 없다.


2.7.토의

이렇게 이번장이 끝났다.

몬티 홀이 뭔지 알 수 있었고

Suite라는 인터페이스에 대해서 알 수 있었다.

우리는 Likelihood라는 함수만 재정의 해주면 된다.


하지만 오늘 공부에서 의문점이 몇가지 있다.

이 문제는 또 시간이 지나면서 해결되지 않을까 하는 생각이 든다.

(1) 몬티홀 문제에서 Likelihood를 이렇게 정의한 까닭은?

왜 'A'는 0.5고 elif는 1인지??

(2)  M&M문제에서 Update를 두개나 넣어준 이유는??


답을 아는 분이 계시면 답문 주세요~^^

신고
Posted by 공놀이나하여보세

이거 혼자 공부하려니 어렵군요.

1.6 M&M문제

문제는 '노랑 초콜렛이 1994년에 생산한 봉지에서 나왔을 확률은 얼마인가?'입니다.

문제를 잘 풀어보면 '노랑 초콜렛은 1994년 봉지에서 나오고, 초록 초콜렛은 1996년 봉지에서 나올 확률이다.'

정의를 잘 살펴보자

A: 봉지 1은 1994년에 생산했을 때 봉지 2는 1996년에 생산했다.

B: 봉지 1은 1994년에 생산했을 때 봉지 2는 1996년에 생산했다.


A의 경우를 계산해보자.

1) p(H) : 사전확률. p(H)라고 되어 있지만 실직적으로 p(A)의 확률이다. p(A) = 1/2이다.

2) H는 Hypothesis이다. 여기서는 A이다.

3) D는 Data이다. 노랑과 초록이 선택될 확률이다

4) 노랑과 초록은 독립이므로 수식은 아래와 같다.

p(D|H) = p(노랑|1994) * p(초록|1996) = 0.20 * 0.20 = 0.004

5) p(H|D) = p(H)p(D|H) / p(D)이다. 


여기서 p(D)를 구하는 법이 나오지 않았다.

p(D) = p(A) * p(노랑|1994)*p(초록|1996) + p(B) * p(노랑|1996)*p(초록|1994)이다

p(D) = p(D|H)(가설A에서 나온 것) + p(H|D)(가설 B에서 나온 것) 이 되고

이것은

p(D) = 1/2 * 0.004 + 1/2 * 0.0014  = 0.0027이다.


책에서 문제는 가정 A의 사후확률을 구하는 것이므로 답은 0.002/0.0027 = 20/27이다.

약간 헷깔리는 것은 책에서 문제가 가정 A의 사후확률을 구하는 것인가? 이다. ㅋㅋ

=> 23페이지를 보면 'p(H|D)는 여기서 계산하고자 하는 데이터를 확인한 이후의 가설 확률로, 사후 확률이라고 한다.' 라고 되어 있으니 문제는 사후 확률을 구하는 것이 맞다.


1.7 몬티홀 문제

이건 이해가 잘 가지 않는다.

우도를 A의 경우에는 1/2로 하고 C의 경우에는 1로 주었다. 왜일까?

우도의 뜻을 내가 좀 더 정확하게 이해를 해야할 것 같다.

=> 이 문제는 2장에 python코드로 푸는 문제가 있으니 코드를 보며 잘 이해해 보도록 하자.



신고
Posted by 공놀이나하여보세