Building Machine Learning System with Python ch.2.2

이미지
평가 : 홀드아웃 데이터와 교차 검증 우리가 정말 하고 싶은 작업은 새로운 데이터에 대해 일반화하는 모델의 능력을 측정하는 것이다.  알고리즘이 훈련 시 보지 못한 인스턴스에 대한 성능을 측정해야한다. 이를 테스트하기 위해 두 부분으로 나누어, 하나는 모델을 훈련시키고 다른 하나는 데스트에 사용했다. 이상적으로는 훈련할 때와 테스트할 때 모든 데이터를 사용하는 것이 좋다. 이를 교차 검증이라하며, 단순한 교차 검증의 형태는 단일 잔류라 한다. 하나의 예제를 제외한 모든 데이터로 모델을 학습하고, 이 모델로 남은 하나의 예제를 잘 분류하는 지 보는 것이다.  from threshold import fit_model, predict correct = 0.0 for ei in range(len(features)):     training = np.ones(len(features), bool)     training[ei] = False     testing = ~training     model = fit_model(features[training], is_virginica[training])     predict(model, features[testing])     predictions = predict(model, features[testing])     correct += np.sum(predictions == is_virginica[testing]) acc = correct/float(len(features)) print('Accuracy: {0:.1%}'.format(acc)) fit_model 과 predit 함수들을 통해 단일 잔류로 검증을 할 수 있었다.  하지만 단일 잔류의 중요한 문제점은 몇 배 ...

Building Machine Learning System with Python ch.2.1

이미지
아이리스 데이터셋을 이용해 분류 작업을 한다. 흠.. 근데 뭔가 공부한 것들을 다시하는 느낌이라 복습한다고 생각해야겠다.  여기서 느낀 것은 시각화를 데이터 분석 초기에 하는 것이라는 것이다.  알고리즘만 공부할 때는 마지막에 시각화해서 보여주는 코드로 공부해서 그런지  시각화가 초기에 쓰면 좋은 점들을 생각 못했다.  초기에 데이터들에 대한 간략한 정보들을 쉽게 알 수 있는 것이 시각화인 것 같다.  아이리스 데이터셋 아이리스 데이터셋은 4가지 속성과 150가지의 예제를 가지고 있다. 1. 꽃받침 길이 2. 꽃받침 너비 3. 꽃잎 길이 4. 꽃잎 너비 이 데이터셋에는 4개의 속성이 있고 각 꽃은 종이 표기되어 있다. 여기서 우리가 하고 싶은 것은  "들판에서 새로운 꽃을 보면 기존의 데이터로 이 꽃을 예측할 수 있을까?" 첫번째 시각화 시각화는 초반에도 얘기했지만 분석의 초기 탐험 단계에 탁월하다.  from matplotlib import pyplot as plt import numpy as np from sklearn.datasets import load_iris data = load_iris() features = data.data feature_names = data.feature_names target = data.target target_names = data.target_names for t in range(3):     if t == 0:         c = 'r'         marker = '>'     elif t == 1:         c='g'      ...

Building Machine Learning System with Python ch.1.3

이미지
데이터 다시 보기 그래프를 다시 한 번 봐보자.  3주차 4주차 사이에 변곡점이 존재한다. 그래서 3.5주차를 기준으로 데이터를 둘로 나누어 따로 훈련해야겠다. inflection = 3.5 * 7 * 24 xa = x[:inflection] ya = y[:inflection] xb = x[inflection:] yb = y[inflection:] fa = sp.poly1d(sp.polyfit(xa, ya, 1)) fb = sp.poly1d(sp.polyfit(xb, yb, 1)) plot_models(x, y, [fa, fb], os.path.join(CHART_DIR, "1400_01_05.png")) 그래프를 그려보면 아래와 같다.  위와 같이 3.5주차를 기준으로 다른 차수들로 그래프를 그려보면 또 아래와 같다. 위 그래프를 보면 고차 다항식은 다소 과적합화 되어 있고 저차 다항식은 과소적합화 되어 있다.  그렇다면 어떻게 미래를 예측할 수 있는 모델을 찾을 수 있을까? 훈련과 테스트 미래를 볼 수 없더라고 부분 데이터로 유사한 영향을 가정할 수 있고, 해야만 한다.  그 예로, 일정 부분의 데이터를 제거하고 나머지로 훈련해보자. 변곡점 이후로부터 훈련된 모델의 테스트 오차는 현저한 차이가 있다. Error d=1: 6397694.386394 Error d=2: 6010775.401243 Error d=3: 6047678.658525 Error d=10: 7037666.529344 Error d=53: 7052608.109674 오차가 가장 작은 2차 다항식이 최후의 승자이다. 최초 질문에 대답하기 큰 흐름을 잘 반영하는 2차 다항식 모델을 찾았다.  이 함수를 어떻게 현실에 적용할 것인가. 만약 시간당 100,000 요청이 언제쯤 될지 찾는 일 같은...

Building Machine Learning System with Python ch.1.2

이미지
적절한 모델과 학습 알고리즘 선택 모델을 만들기에 앞서 현실의 이론적 근사치에는 항상 현실과 차이가 있다. 이를 근사치 오차라고 한다.  이는 모델이 예측한 예상 값과 실제 값 사이의 거리 제곱으로 계산한다. 우선 단순한 직선으로 시작해보자. 어떻게 하면 근사치 오차가 가장 작도록 차트에 직선을 그을 수 있을까? Scipy 의 polyfit() 함수가 정확히 이런 일을 수행한다. 이 함수는 x,y,우리가 원하는 다항 함수의 차수를 고려해 모델 함수를 찾는다. fp1, res1, rank1, sv1, rcond1 = sp.polyfit(x, y, 1, full=True) print("Model parameters of fp1: %s" % fp1) print("Error of the model of fp1:", res1) f1 = sp.poly1d(fp1) polyfit() 함수는 적합화된 모델 함수 fp1의 매개변수를 반환한다. 또한 full=True 옵션을 설정하면 추가적인 정보를 얻을 수 있다.  정확히 근사치 오차를 나타내는 잔차(res1)가 관심거리이다. 출력값은  Model parameters of fp1:  [2.59619213 989.02487106] [3.17389767e+08] 이다. 그렇다면 가장 적합한 직선은  f( x ) = 2.59619213*x  +  989.02487106 이다. 모델 매개변수로부터 모델을 생성하려면 poly1d() 함수를 사용한다. f1 = sp.poly1d(fp1) 아래와 같은 함수를 그려주는 함수를 작성하고 기존 데이터 플롯에 그려본다. def plot_models(x, y, models, fname, mx=None, ymax=None, xmin=None):     plt.figure(num=N...

Building Machine Learning System with Python ch.1.1

이미지
<머신 러닝 인 액션>을 끝냈다기 좀 그렇지만 한 번 훑어보고 이제 이라는 책을 시작해보려한다. 책을 한 번 보니까 코드에 대한 설명과 세부 설명을 생략한 것들이 많이 보인다. 우선 라이브러리는 scipy, numpy, matplotlib 를 사용하여 데이터 분석을 한다. pandas가 없어서 살짝 당황했다. 책을 다 보면 이해하겠지.. 처음에는 데이터 분석의 흐름에 대해 얘기한다. 1. 데이터 읽기와 정리 2. 입력 데이터의 탐구와 이해 3. 기계학습 알고리즘을 위해 어떻게 최적으로 데이터를 나타낼지에 대한 분석 4. 적절한 모델과 학습 알고리즘 선택 5. 수행 정확도 측정 모든 예제가 위 5 단계를 기반으로 이루어진다. 이제 예제를 갖고 위 5 단계를 실습해보겠다. 1. 데이터 읽기와 정리 및 전처리 import scipy as sp data = sp.genfromtxt("web_traffic.tsv"), delimiter="\t") scipy 라이브러리를 불러오고 데이터를 data 변수에 넣는 코드이다. 여기서 주의해서 볼 것은 delimiter = "\t" 이다. 각 열을 정확히 구별하는 구별자로 탭을 명시한것이다. x = data[:, 0] y = data[:, 1] x = x[~sp.isnan(y)] y = y[~sp.isnan(y)] x 와 y 에 각각 1번째 열과 2번째 열을 넣고, nan 값을 제외시켜 전처리하는 코드이다. 이제 데이터의 형태를 파악하기 위해 matplotlib 라이브러리를 이용해 산점도를 그려볼 것이다. import matplotlib.pyplot as plt plt.scatter(x, y, s=10) plt.title("Web traffic over the last month") plt.xlabel("Time...

Machine Learning in Action ch.14.3 특이 값 분해(SVD) (FINAL!!!)

이미지
14.3 협력적 여과 기반 추천 엔진 협렵적 여과는 추천하고자 하는 사용자 데이터에 대한 데이터 집합을 가지고 다른 사용자의 데이터와 비교하는 작업을 수행하는 것을 뜻한다. 사용자 또는 아이템의 유사도를 알고 있다면 기존 데이터를 사용하여 알려지지 않은 선호도를 예측할 수 있다. 아이템 기반과 사용자 기반 유사도 측정에 대해 알아볼 것이다. 14.3.1 유사도 측정    우선 아이템 기반과 사용자 기반에 대해 설명한다. 위처럼 데이터 집합이 존재한다고 가정해보면 아이템 기반 유사도 측정은 열에 대해 유사도 측정하는 것이고, 사용자 기반 유사도 측정은 행에 대해 유사도 측정하는 것이다. 예를 들면, 유사도 측정 방법 중 유클리드 거리를 사용해보면, 트리 팁과 폴드 포크간의 유사도는 sqrt((2-2)^2+(3-3)^2+(1-1)^2) = 0 우나기 돈과 폴드 포크간의 유사도는 sqrt(4+9+1+1+4+25+1) = sqrt(45) 이므로 거리가 더 짧은 트리 팁과 폴드 포크가 더 유사하다고 매우 보여진다. 이제 유사도 측정법에 대해 나열한다. 1. 유클리드 거리 2. 피어슨 상관관계 3. 코사인 유사도 자세한 설명은 생략한다. 14.3.2 추천 엔진 평가하기 우리에게는 예측을 위한 목적 값이 없기 때문에 교차검증을 사용하여야한다. 측정 방법은 제곱 평균 제곱근(RMSE)이다. 드디어 끝났다.. 이제 Building Machine Learning Systems with Python 이라는 책을 통해 실습하며 실력을 쌓아야겠다. 우선 선형대수부터 공부해야할 것 같긴 하다...

Machine Learning in Action ch.14.1 & 14.2 특이 값 분해(SVD)

이미지
데이터 간소화하는 알고리즘인 특이 값 분해라는 알고리즘을 공부할 것이다. 하지만 심도 깊게 공부하지는 않을 것이다.  선형대수가 많이 나와 아직 공부하지 않은 부분이기 때문에 나중에 다시 해야겠다고 마음 먹었다. 특이 값 분해는 추천 엔진과 이미지 압축에 많이 쓰인다고 한다.  14.1 SVD 응용 프로그램 특이값 분해를 사용하면 노이즈와 불필요한 정보를 제거할 수 있다.  14.1.1 잠재적인 의미 색인  특이값 분해를 사용하는 방법을 잠재적 의미 색인 또는 잠재적 의미 분석이라고 한다. 잠재적 의미 색인에서 행렬은 문서와 단어들로 구성되어 문서 검색하는 데에 쓰였는데 문서를 더 효과적으로 검색하기 위해 특이값 분해가 개발되었다.  하지만 동의어 문제가 존재한다. 14.1.2 추천 시스템 또 다른 특이값 분해 응용 프로그램으로 추천 시스템이 있다.  추천 시스템은 아이템 또는 사람 간의 유사성을 계산하는 것이다.  오른쪽에 있는 행렬을 보면 음영처리된 부분이 있다. 애드,피터, 트레이시는 왼쪽 3개의 음식에는 점수를 매기지 않았다.  왼쪽 3개는 일본 음식이고 오른쪽 2개 음식은 BBQ 음식이다.  그래서 한 행렬을 2개의 차원으로 나눌 수 있다.  다음에 원본 데이터에서 이러한 새로운 공간을 어떻게 구할 수 있는지 알아볼 것이다.  특이값 분해가 데이터 분석 사례로 유명한 넷플릭스 대회 우승한 팀이 사용한 알고리즘이다. 14.2 행렬 인수분해 여기서는 선형대수의 개념이 많이 포함되어 있기 때문에 스킵해야겠다.