Machine Learning in Action ch.8.1 & 8.2 Regression

이미지
8.1 회귀로 최적선 찾기 우리가 회귀를 사용하는 이유는 수치형 목적 값을 예측하기 위해서이다. 그 방법은 입력에 대한 목적 값의 방벙식을 세우는 것이다. 예를 들면, 행복 = 돈 * 0.4 + 지혜 * 0.8 이것이 곧 회귀 방정식이다. 여기서 0.4 와 0.8은 가중치라고 한다. 즉, 예측이란 회귀 가중치로 입력된 값을 곱하고 , 곱한 값을 모두 더하여 얻어진다. 위와 같은 회귀를 선형 회귀라고 한다. 다른 회귀 유형도 있다. 비선형 회귀는 출력을 위해 입력 된 모든 값을 곱하는 기능을 가지고 있다. 예를 들면, 행복 = 0.002 * 돈/ 지혜 이것이 비선형 회귀에 대한 예제이다. 데이터로부터 어떻게 회귀 방정식을 구할 수 있을까? 입력 데이터는 행렬 X에 있고, 벡터 w에는 회귀 가중치가 담겨있다. 예측 값은 y1 = X1^T * w 로 구하게 된다. w를 찾는 방법은 오류를 최소하하는 것이다. 여기서 제곱 오류를 사용한다. 수학적인 표현이 많아 스킵한다. 실습 예제를 해보면 위와 같이 코드를 작성해 보면 아래와 같은 선형 회귀를 플롯할 수 있다. 8.2 지역적 가중치가 부여된 선형 회귀  선형 회귀의 한 가지 문제점은 데이터에 대한 부족적합 경향을 보인다는 것이다. 그래서 여기에 추정 값에 성향을 추가하여 평균 제곱 오류를 줄일 수 있는 방법을 다룬다. 평귭 제곱을 오류를 줄이는 방법 중 지역적 가중치가 부여된 선형 회귀 또는 줄여서 LWLR이라는 방법이 있다. 이것은 관심이 있는 데이터 점 근처에 있는 다른 데이터 점들에 가중치를 부여한다. 약간 kNN과 비슷한 느낌이다. (출처 : http://javacan.tistory.com/entry/MachineLearningInAction-08-Regression) 가우스 확률 분포 같은 수학적 계산은 넘어가고 LWLR 함수를 보면 아래와 같다. def lwlr(testPoint,xAr...

Machine Learning in Action ch.7.7 AdaBoost

이미지
7.7 분류 불균형 분류에 대한 여섯 개의 알고리즘에서 우리는 분류하는 대상에 대한 비용이 동일하다고 가정했다. 하지만 대부분의 경우 비용이 모두 다르다. 이번에는 비용이 서로 다른 경우 분류기의 성능을 시각화하는 몇 가지 그래픽 기술에 대해 살펴봐야겠다. 7.7.1 또 다른 성능 측정 방법 : 정확도, 재현율 , ROC 우리는 이 때까지 오류율을 통해 성능 측정을 했다. 하지만 어떤 사례가 잘못 분류된 것인지 나타내지는 못한다. 이때 기계학습에서는 분류 오류를 좀 더 자세하게 나타내는 혼동 행렬이라는 도구를 사용한다.                                          예측                          +1                         -1       현실 +1             긍정적인 참 (TP)         부정적인 거짓 (FN)        -1             긍정적인 거짓 (FP)       부정적인 참 (TN) 첫번 째 측정 방법 정확도 = TP/(TP + FP) 정확도는 분류기가 긍정적으로 예측한 그룹 중에서도 실제로도 긍정적인 부분을 말한다. 두번 째 측정 방법 재현율 = TP/(TP...

kNN 알고리즘 & Naive Bayes 알고리즘 요약

kNN 분류 알고리즘이며 지도 학습 알고리즘 중 하나이다. 다른 알고리즘들보다 훨씬 간단한 알고리즘이다. 장점으로는 높은 정확도와 아웃사이어에 둔감하며 데이터에 대한 가정이 없음 단점은 계산 비용이 높고 많은 메모리 요구 우선 좌표평면에 트레이닝 세트를 설정해 놓고 분류하고자하는 좌표를 놓아보면 가장 가까운 k개의 투표자들의 과반수의 라벨에 따라 분류하고자 하는 점의 라벨을 분류한다. 가장 쉬운 알고리즘으로서 별로 사용되지 않을 것 같다. SVM이나 나이브 베이스가 더 많이 쓰일 것 같다. 이 알고리즘은 필기체 인식과 영화 장르 분류 등으로 사용할 수 있다. 나이브 베이즈  데이터 분류에서 의사 결정 트리는 매우 성공적이지 않으며 kNN은 많은 계산이 요구되기 때문에 가장 좋은 선택은 곧 확률적인 비교일 것이다. 나이브 베이즈 알고리즘은 베이즈 정리를 기초로 조건부 확률을 이용한다. 주로 텍스트 분류이나 스팸 메일 분류기 등으로 사용된다. 분류하고자 하는 문서 안의 단어들을 쪼개 자신의 딕셔너리에 있는지 확인하고 그 단어들이 자신의 딕셔너리 안에서 어떤 라벨에 속하는가에 따라 조건부 확률을 통해 문서를 분류한다.

Machine Learning in Action ch.7.4 & 7.5 AdaBoost

7.4 전체 AdaBoost 알고리즘 구현하기 전에 구현했던 의사결정 스텀프를 가지고 AdaBoost 알고리즘을 구현할 것이다. def adaBoostTrainDS(dataArr,classLabels,numIt=40):     weakClassArr = []     m = shape(dataArr)[0]     D = mat(ones((m,1))/m)   #init D to all equal     aggClassEst = mat(zeros((m,1)))     for i in range(numIt):         bestStump,error,classEst = buildStump(dataArr,classLabels,D)#build Stump         #print "D:",D.T         alpha = float(0.5*log((1.0-error)/max(error,1e-16)))#calc alpha, throw in max(error,eps) to account for error=0         bestStump['alpha'] = alpha          weakClassArr.append(bestStump)                  #store Stump Params in Array   ...

Machine Learning in Action ch.7.3 AdaBoost

이미지
7.3 의사결정 스텀프로 약한 학습기 생성하기 의사결정 스텀프는 간단한 의사결정 트리이다. 이것은 하나의 분할을 가지는 트리이며 이것이 곧 하나의 스텀프가 된다. 데이터 집합을 가지고 의사결정 스텀프를 구축하기 위한 2가지 함수를 작성한다. 1번째, 어떤 값이 테스트를 위한 임계 값보다 작거나 큰 경우, 이값은 검사에 사용 2번째, 관련이 더 많은 함수는 데이터 집합에 가중치가 부여된 상태로 반복하고 가장 낮은 오류를 산출하는 스텀프를 찾음 def stumpClassify(dataMatrix,dimen,threshVal,threshIneq):#just classify the data     retArray = ones((shape(dataMatrix)[0],1))     if threshIneq == 'lt':         retArray[dataMatrix[:,dimen] <= threshVal] = -1.0     else:         retArray[dataMatrix[:,dimen] > threshVal] = -1.0     return retArray      def buildStump(dataArr,classLabels,D):     dataMatrix = mat(dataArr); labelMat = mat(classLabels).T     m,n = shape(dataMatrix)     numSteps = 10.0; bestStump = {}; bestClasEst = mat(zeros((m,1)))     minError = inf #init error sum, to +infinity    ...

Machine Learning in Action ch.7.1 & 7.2 AdaBoost

이미지
6장인 SVM을 다 끝내지 못한 채 7장을 하려니 뭔가 찝찝한 기분이다. 우선 AdaBoost를 쉽게 설명하자면, 당신이 어떤 중요한 결정을 하려할 때, 한 전문가를 신뢰하기 보다 여러 전문가들의 충고를 듣고자 하는 것과 같다. 즉, 메타 알고리즘으로서 서로 다른 알고리즘들을 결합하는 방법 중 하나이다. 우리는 가장 인기가 좋은 메타 알고리즘 중 AdaBoost에 초점을 둘 것이다. 7.1 데이터 집합의 다양한 표본을 사용하는 분류기 위에서 쓴 것처럼 AdaBoost는 메타 알고리즘 혹은 앙상블 메소드라 한다. 오류율이 낮고 코드가 쉽다는 장점이 있다. 그리고 가장 좋은 건 조절을 위한 매개변수가 없다. 아웃 라이어에 민감하다는 단점도 갖고 있다. 7.1.1 배깅 : 임의로 추출한 재표본 데이터로부터 분류기 구축하기 배깅은 다양한 분류기를 통합하는 방법이다. 배깅은 크기가 S인 원본 데이터 집합을 가지고 크기가 S인 다른 데이터집합을 S번 만들게 된다.  S개의 데이터 집합들을 구축하고 나면, 학습 알고리즘은 개별적으로 각각의 데이터 집합에 적용된다.  여기에서는 랜던포레스트처럼 배깅보다 더 발전된 방법을 다룬다. 드디어 랜덤 포레스트가 나왔다.. 캐글에서 자주 쓰이는 알고리즘 중 하나라던데 궁금하다.. 7.1.2 부스팅 부스팅은 배깅과 유사한 기술이다. 다만 배깅은 언제나 동일한 유형의 분류기를 사용하는 데 비해 부스팅은 순차적으로 다른 유형의 분류기를 사용한다.  부스팅은 이전 분류기에서 잘못 분류된 데이터에 초점을 맞추어 새로운 분류기를 만든다. 부스팅은 가중치를 부여한 모든 분류기의 합계로 계산하므로 배깅과는 차이가 있다.  가중치에 있어서도 배깅은 이전 반복에서 성공한 분류기를 기반으로 처리하기 때문에 부스팅과는 차이가 있다. 부스팅에는 많은 유형이 있으나 이번에는 AdaBoost를 공부할 것이다. 이제부터 우리...

Machine Learning in Action ch.6.1 & 6.2 SVM (Support Vector Machine)

SVM은 캐글에서 좀 많이 본 알고리즘이다. SVM은 최고의 주식 분류사가 되고자 하는 일부 사람들에게 중요하게 생각되고 있다. 이번 장에서는 SVM이 무엇인지 배우고 몇 가지 주요 전문 용어가 소개될 것이다. SVM을 다루는 방법은 여러가지가 있다. 그 중 우리는 SMO 알고리즘에 초점을 두고 공부한다. 그런 다음, 대용량 데이터 집합을 처리하도록 SVMs을 확장하기 위해 커널을 어떻게 사용하는 지 알아본다. 마지막으로 SVMs을 가지고 더 좋은 작업을 할 수 있는 지 알아보기 위해 실습한다. 6.1 최대 마진으로 데이터 분리하기 책에는 그래프가 있어서 설명하기 쉽지만 그래프가 없는 관계로 용어만 알아보자. 선형 분리 : 데이터의 점들을 충분히 분리할 수 있는 경우 초평면 분리 : 선이나 평면이나 N-1 차원으로 데이터 집합을 나누는 경우 마진 : 초평면 분리에 가장 가까운 지점을 찾고 이 지점이 가능한 한 가장 크기를 원할 때, 이것을 마진이라고 한다. 지지 벡터 : 초평면 분리에 가장 가까운 지점이 지지 벡터이다. 이제 우리는 분리선에서 지지 벡터까지의 거리를 가장 크게 해야한다는 것을 알았다. 6.2 최대 마진 찾기 이 선이 데이터를 가장 잘 분리하는 선인지 어떻게 측정할 수 있을까? 초평면 분리는 w^T*x + b 로부터 얻는다. 수직선의 길이를 구해보면 |w^T*x + b| / ||w||으로 구할 수 있다. 뭔 소리인지 아직 모르겠다. 나머지 최대 마진 찾기의 수학적인 부분을 쓰는 것은 패스하기로 했다. 책을 읽고 이해하는 것만으로도 버겁다.