1월, 2016의 게시물 표시

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||으로 구할 수 있다. 뭔 소리인지 아직 모르겠다. 나머지 최대 마진 찾기의 수학적인 부분을 쓰는 것은 패스하기로 했다. 책을 읽고 이해하는 것만으로도 버겁다.

Machine Learning in Action ch.5.3 Logistic Regression

5.3 예제 : 말의 배앓이 치사율 평가하기 이번 예제에는 배앓이하는 말이 죽을 것인지 살 것인지를 예측하는 문제로 로지스틱 회귀를 사용한다. 속성이 28개인 368개의 사례로 되어있다. 말의 생사를 예측하기 위해 로지스틱 회귀와 확률 기울기 상승을 사용할 것이다. 5.3.1 준비 : 데이터에서 누락된 값 다루기 데이터 내에 누락된 값이 있다는 것은 큰 문제이다. 여기에 몇 가지 선택 사항이 있다.  1) 사용 가능한 모든 데이터에서 속성의 평균값을 사용한다. 2) 알려지지 않은 값은 -1과 같은 특별한 값으로 채운다. 3) 사례를 무시한다. 4) 유사한 아이템들로부터의 평균값을 사용한다. 5) 값을 예측하기 위해 다른 기계 학습 알고리즘을 사용한다. 전처리 동안에는 리스트 내에 두 가지를 처리하고록 했다. 첫째, 알 수 없는 값을 실질적인 수로 대체. Numpy 배열은 누락된 값은 처리할 수 없다. 두번째, 검사 데이터에 분류 항목 표시가 누락되어 있는 경우, 무시한다. 하지만 kNN은 무시가 불가능하다. 로지스틱 회귀는 가능. 5.3.2 검사 : 로지스틱 회귀로 분류하기 로지스틱 회귀를 가지고 사례를 분류하기 위해 많은 것을 할 필요는 없다.  이전에 최적화된 가중치로 곱해진 검사 벡터를 시그모이드로 계산하는 것이 전부다. 만약에 시그모이드 함수가 0.5보다 큰 값을 제공해준다면 분류 항목은 1이고 아니면 0이다. 말의 배앓이 예측을 실습하기 위해 함수들을 만든다. def classifyVector(inX, weights):     prob = sigmoid(sum(inX*weights))     if prob > 0.5: return 1.0     else: return 0.0 def colicTest():     frTrain = op...

Machine Learning in Action ch.5.1 & 5.2 Logistic Regression

이미지
이번 5장에는 우선 로지스틱 회귀가 무엇인지 배우며, 몇 가지 최적화 알고리즘을 배우게 될 것이다. 최적화 알고리즘을 공부하면서 기울기 상승을 배우게 될 것이며, 확률적 기울기 상승을 조절하는 것에 대해 알게 될 것이다. 이러한 최적화 알고리즘은 분류기를 훈련하는 데 사용된다. 코세라 머신 러닝 공부할 때 다 했던건데 기억이 나질 않는다.. 솔직히 영어로 봐서 정확히 다 알진 못했지만 다시 하려니 더 열심히 해놨으면 좋았겠다라는 생각이 들었다. 5.1 로지스틱 회구와 시그모이드 함수로 분류하기 : 다루기 쉬운 계단 함수 위와 같은 그래프를 갖는 함수를 시그모이드 함수라한다.  시그모이드 함수는 우리가 분류 항목을 예측할 수 있는 방정식을 원할 때, 분류 항목이 2개인 경우, 시그모이드 함수는 0 또는 1로 결과값을 출력할 것이다.  시그모이드 함수는 로지스틱 회귀에서 어떻게 쓰일까? 로지스틱 휘귀 분류기를 위해 가지고 있는 각각의 속성에 가중치를 곱한 다음 서로 더한다. 그 결과를 시그모이드에 넣고 0 과 1 사이의 수를 구하게 된다. 이 수가 0.5보다 크면 1로 분류되고 반대면 0으로 분류된다. 5.2 가장 좋은 회귀 계수를 찾기 위해 최적화 사용하기 설명한 시그모이드 함수의 입력은 z 이며, 이 z 는 다음과 같이 주어진다. z = w0x0 + w1x1 + ... wnxn x는 데이터이며 , 가장 좋은 계수 w를 찾고자 한다. 이를 위해서는 최적화 이론으로부터 몇 가지를 고려해야만 한다. 우리는 먼저 기울기 상승을 이용한 최적화를 알아볼 것이다.  5.2.1 기울기 상승 기울기 상승 알고리즘은 기울기가 제공한 방향으로 한 단계 이동한다. 기울기 연산자는 항상 크게 증가하는 방향으로 향하게 된다. 이러한 단계는 멈춤 조건에 도달할 때까지 되풀이 된다. 5.2.2 훈련 : 기울기 상승을 사용하여 가장 좋은 매개변수...

Machine Learning in Action ch.4.5 Naive Bayes

4.5 파이썬으로 텍스트 분류하기  텍스트 문서에서 속성들을 추출하기 위해서는 텍스트를 분할해야 한다. 속성은 텍스트 문서에서 얻을 수 있는 토큰들이 될 것이다. 하나의 토큰은 문자의 조합을 구성된다. 택스트의 모든 조각을 토큰 벡터로 줄일 것이다.  이번 실습에서는 한 전자 게시판의 필터를 만들어 볼 것이다. 작성자가 부정적이거나 폭력적인 언어를 사용할 경우 부적합하다는 메시지를 표시한다. 1은 폭력적인것을 나타내고 0은 폭력적이지 않은 것을 나타낸다.  4.5.1 준비 : 텍스트로 단어 벡터 만들기 우리는 하나의 문장을 하나의 벡터로 변환한 단어 벡터 또는 토큰 벡터의 형태로 텍스트 문서를 보기 시작할 것이다.  def loadDataSet():     postingList=[['my', 'dog', 'has', 'flea', 'problems', 'help', 'please'],                  ['maybe', 'not', 'take', 'him', 'to', 'dog', 'park', 'stupid'],                  ['my', 'dalmation', 'is', 'so', 'cute', 'I', 'love', 'him'],                  ['stop', 'posting', 'stupid', 'worthless', 'garbage'],                  ['mr', 'licks', 'ate', 'my...

Machine Learning in Action ch.4.1 ~ 4.4 Naive Bayes

4.1 베이지안 의사결정 이론으로 분류하기 나이브 베이스는 내가 입사하고 싶은 회사의 채용 조건 중에 나이브 베이스 경험자 우대라는 조건이 있었기 때문에 관심을 더 갖고 심의를 기울여 공부해야할 것 같다. 나이브 베이즈는 확률론과 텍스트 처리에 대해 이 책에서는 배운다. 뭔가 실생활에 많이 쓰이는 예제들이 책 뒤편에 자리 잡고 있다. 이메일 스팸 분류는 머신 러닝 자료 찾을 때 늘 보던 것들이었다.  4.1에는 베이스 정리의 일부분을 공부한다. 우리는 분류항목 1에 속하는 데이터의 확률 방정식 (원) : p1(x,y)와 분류 항목 2에 속하는 데이터의 확률 방정식은 (세모) : p2(x,y)가 있다. 속성들을 갖고 새로운 측정으로 분류하기 위해서 다음과 같은 규칙을 사용한다. 만약 , p1(x,y) > p2(x,y)이면 , 분류 항목 1에 속한다. 만약 , p1(x,y) < p2(x,y)이면 , 분류 항목 2에 속한다. 간단히 말하면 , 더 높은 확률을 가지는 분류항목을 선택한다. 베이스 정리 이론은 높은 확률을 가지는 의사결정을 선택하는 것이다. 1. kNN을 사용하여 1000개의 거리 계산을 수행 2. 의사결정 트리를 사용하여 x축을 따르는 데이터인지 y 축을 따르는 데이터인지 분할 3. 각 분류 항목의 확률을 계산하고 이들을 비교 p1과  p2 를 계산하기 위해서는 조건부 확률에 대한 설명이 필요하다. 4.2 조건부 확률 흠,, 조건부확률은 수능 때 공부했지만 기억이 하나도 나지 않는다.. 이건 대충 책을 읽고 이해해야겠다. 4.3 조건부 확률로 분류하기 우리에게 정말 필요한 계산은 p1(x,y) > p2(x,y) 이런 것들이 아니라  조건부 확률을 이용한 p1(c1 | x,y) > p2(c2 | x,y) 이다. 이들이 의미하는 것들은 굉장히 중요하다.  x,y로 확인된 한 지점이 주어졌다면, 이 지점이...