2월, 2016의 게시물 표시

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 행렬 인수분해 여기서는 선형대수의 개념이 많이 포함되어 있기 때문에 스킵해야겠다.

Machine Learning in Action ch.15.1 & 15.2 빅데이터와 맵 리듀스

14장을 나중에 하고 마지막 15장부터 해야겠다. 하둡에 대해 얘기할 것이다. 15.1 맵 리듀스 : 분산 컴퓨팅의 기본 구조 하나의 단일한 컴퓨터가 수행하기 시간이 오래 걸리는 작업을 여러 기기에게 나누어 주어 병렬적으로 작업을 수행한다. 맵 리듀스의 주요 설명은 아래와 같다. 1. 마스터 노드는 맵 리듀스 작업을 제어한다. 2. 맵 리듀스 작업은 맵 작업과 리듀스 작업으로 나누어진다. 3. 맵 작업은 다른 맵 작업과 서로 정보를 교환하지 않으며, 리듀스 작업 역시 이와 마찬가지 4. 맵 단계와 리듀스 단계 사이에는 정렬 단계 또는 결합 단계가 존재. 5. 기기 고장 등으로 작업 수행이 실패할 경우, 처리하지 못한 데이터를 복사하여 다른 기기에 저장한다. 6. 데이터는 매퍼와 리듀서 사이를 키/값 쌍의 형태로 전달된다. 15.2 맵 리듀스에서의 기계학습 하둡의 에코 시스템들 중 Mahout이라는 것이 있다.  맵 리듀스로 수행할 수 있는 알고리즘들이 존재한다.  나이브 베이즈, kNN,SVM 등 여러가지가 있다.  나중에 머하웃 인 액션이라는 책으로 또 공부해야겠다. 

Machine Learning in Action ch.13.1 & 13.2 Dimentionality Redution

이미지
이미지를 분석할 때, 보통 100만픽셀하는 이미지를 분석해야만한다. 100만차원 이미지를 분석하는 것은 너무 힘들다. 그래서 차원 축소를 통해 100만차원을 3차원으로 줄여 분석한다. 데이터에는 속성들의 관계가 명확하게 표현되지 않을 수도 있기 때문에, 서로 다른 기계학습 알고리즘을 적용하기 위해서는 속성들의 관계를 우선적으로 해야한다. 차원 축소는 데이터 전처리에 쓰인다. 데이터에 대한 전처리가 이루어져야만 서로 다른 기계학습을 적용할 수가 있다. 13.1 차원 축소 기술 데이터를 단순화하려는 또 다른 이유들이 존재한다. 1. 사용하기 쉬운 데이터 집합 구축 2. 많은 알고리즘의 계산 비용 축소 3. 노이즈 제거 4. 이해하기 쉬운 결과 도출 차원 축소 기술은 데이터 분류 항목 표시 유무와 관계 없이 사용할 수 있다. 차원 축소 알고리즘 3가지를 알아볼 것이다. 1. 주요 구성요소 분석 (PCA) 2. 요소 분석 3. 독립적인 구성요소 분석 (ICA) 위 세가지 알고리즘 중 책에서는 PCA를 배운다. 13.2 PCA 우선 주요 구성요소를 정해야한다. 변화량이 가장 큰 데이터의 방향에서 첫 번째 주요 구성요소를 가지게 된다. 그리고 두 번째 구성요소는 데이터의 변화량이 두 번째로 크면서 첫 번째 구성요소와 직교하는 방향을 가진 축이 된다. PCA로 데이터 집합에 대해 차원 축소를 함으로써 우리는 두 가지 이득을 볼 수 있다. 1. 의사 결정 트리처럼 간단한 분류기 2. svm의 좋은 의미 아래의 그림을 보면 확연히 느낄 수 있다. 축은 단지 하나 뿐이다. 다른 축은 노이즈가 있을 뿐 아니라 분류하는데 쓰이지 않기 때문이다.

Machine Learning in Action ch.12.1 & 12.2 FP-Growth Algorithm

이미지
이 알고리즘은 11절에 한 알고리즘의 연장선이다. 그래서 빈발 아이템 집합을 찾는다는 목적은 같다. 하지만 속도가 더 빠른 알고리즘이다. 크게 기본적인 2단계로 이루어진다. 1. FP-TREE 구축 2. FP-TREE를 이용해 빈발 아이템 집합 마이닝 12.1 FP-TREE 구축 트리를 구축하기 위해서 원본 데이터 집합을 두 번 살펴본다. 1. 모든 아이템의 빈도를 계산 2. 빈발 아이템에만 접근하여 계산 지지도를 계산하여 임계 값 이하로 발생항 아이템은 빈발하지 않은 아이템으로 간주한다. FP-TREE 구축에 필요한 코드들은 스킵하겠다. 12.2 FP-TREE로 빈발 아이템 집합 마이닝하기 기본적인 3단계가 필요하다. 1. 트리로부터 기본 패턴 조건들을 구한다. 2. 기본 패턴 조건을 가지고 트리 조건을 구축한다. 3. 트리가 하나의 아이템만을 포함할 때까지 1단계와 2단계를 재귀적으로 반복한다. 알고리즘은 그냥 어떤 것인지 알아보고 넘어가는 식으로 공부하기 때문에 자세한 내용은 적지 않는다. 나중에 내 일과를 분석할 때, 나이브 베이즈와 FP성장 알고리즘을 잘 이용하면 더 좋은 결과를 낼 것 같다.

Machine Learning in Action ch.11.3 & 11.4 어프라이어리 알고리즘

이미지
11.3 어프라이어리 알고리즘으로 빈발 아이템 집합 찾기 연관 분석은 빈발 아이템 집합과 연관 규칙이라는 두 가지로 표현된다고 했다. 빈발 아이템 집합을 먼저 찾아야만 연관 규칙을 찾을 수 있다. 빈발 아이템 집합을 찾는 방법이 어프라이어리 알고리즘이다. 11.3.1 후보 아이템 집합 생성 부분집합이 되는 아이템들을 찾기 위해 데이터 집합을 살펴보는 함수를 생성한다. ef createC1(dataSet):     C1 = []     for transaction in dataSet:         for item in transaction:             if not [item] in C1:                 C1.append([item])                   C1.sort()     return map(frozenset, C1)#use frozen set so we                             #can use it as a key in a dict   def scanD(D, Ck, minSupport):     ssCnt = {}     for tid in D:         for can in Ck:             if can.issubset(tid):         ...

Machine Learning in Action ch.11.1 & 11.2 어프라이어리 알고리즘

이미지
마켓에서 남성이 기저귀를 산 뒤 맥주를 산다는 연구 결과는 유명하다. 기저귀와 맥주 간의 연관 분석을 해서 얻어낸 결과이다. 흥미로운 관계들을 수량화할 수 있는 방법은 2가지가 있다. 빈발 아이템 집합으로 모든 데이터 집합에서 공통적으로 나타나는 아이템들을 관찰한다. 연관 규칙으로 데이터 간의 흥미로운 관계들을 측정한다. 하지만 이것들을 하나 하나 찾기엔 시간이 너무 오래걸린다. 그래서 나온 알고리즘이 어프라이어리 알고리즘이다. 어프라이어리 알고리즘은 집합의 수를 줄여 시간을 단축한다. 나중에 더 자세히 알아볼 것이다. 11.1 연관 분석 빈발 아이템 집합을 확인할 때, 빈발에 대한 정의는 지지도와 신뢰도를 통해 정의될 수 있다. 지지도란, 이 아이템 집합에서 확인하고자하는 아이템의 비율로 정의한다. 신뢰도란, 연관 규칙을 정의한다. 예를 들어, 기저귀 -> 맥주라는 순서에 대한 비율로 정의한다. 11.2 어프라이어리 이론 (2,3) 집합이 빈발하지 않다면 (2,3)을 포함하는 아래 집합들을 계산에서 제외시켜 계산 속도를 높이는 알고리즘이 어프라이어리 알고리즘이다.

KCS470 인공지능과 기계학습 2주차 기초확률론

이미지
KMOOC 이라는 사이트에서 카이스트 <인공지능과 기계학습>이라는 강의를 듣기 시작. 2주차 기초확률론 

Machine Learning in Action ch.10.2 & 10.3 k-mean clustering

이미지
10.2 후처리로 군집 성능 개선하기 후처리를 통해 사용자가 정의한 k에 의해 생기는 오류들을 줄일 수 있다. 위 플롯은 3개의 군집을 가진 데이터 집합으로 k-means 를 수행한 결과이다. 결과는 처참하다. 그 이유는 k-means가 전체 최소점이 아닌 지역 최소점에 수렴했기 때문이다. 할당된 군집의 질을 측정하는 데 사용되는 방법으로 SSE(제곱 오류의 합)가 있다. 이 문제를 해결하기 위해 후처리를 사용한다. 즉, SSE가 가장 높은 군집을 두 개의 군집으로 분할하는 것이다. 10.3 양분하는  k-means  지역 최소점에 수렴하여 오류를 발생시키는 문제점을 극복하기 위해 양분하는 k-means가 개발되었다. 이것은 하나의 군집을 두 개로 분할한다.  그리고 분할된 군집을 선택한다.  그 군집은 SSE가 최소일 때 결정된다. def biKmeans(dataSet, k, distMeas=distEclud):     m = shape(dataSet)[0]     clusterAssment = mat(zeros((m,2)))     centroid0 = mean(dataSet, axis=0).tolist()[0]     centList =[centroid0] #create a list with one centroid     for j in range(m):#calc initial Error         clusterAssment[j,1] = distMeas(mat(centroid0), dataSet[j,:])**2     while (len(centList) < k):         lowestSSE = inf       ...

Machine Learning in Action ch.10.1 k-mean clustering

clustering 은 군집화로서 비지도 학습의 한 유형이다. 비지도 학습은 목적 변수가 없어서 무엇을 찾아야 하는지 알지 못하는 경우에 사용한다. 군집화는 유사성을 띄는 데이터끼리 군집을 이루어 분류된다. 그래서 때로는 군집화를 비지도 분류라고도 한다. 분류와 차이점은 미리 정해놓은 분류 항목이 없다는 것이다. 군집화에는 여러 가지 종류가 존재한다. 많이 있지만 주로 사용되는 종류는 3가지이다. 1. k-means 2. bisecting k-means 3. hierarchical  clustering 군집화에도 몇 가지 문제점이 존재하는데 이 문제점들은 후처리(postprocessing)을 통해 해결할 것이다. 10.1 k-means clustering 알고리즘 k-means 는 간단히 말하면 주어진 데이터 집합 안에서 사용자가 정의한 k개의 군집을 찾고자하는 알고리즘이다. http://youtu.be/IuRb3y8qKX4 위의 링크는 유튜브인데  k-means에 대해 설명을 잘 했다. def distEclud(vecA, vecB):     return sqrt(sum(power(vecA - vecB, 2))) #la.norm(vecA-vecB) def randCent(dataSet, k):     n = shape(dataSet)[1]     centroids = mat(zeros((k,n)))#create centroid mat     for j in range(n):#create random cluster centers, within bounds of each dimension         minJ = min(dataSet[:,j])         rangeJ = float(max(dataSet[...

Machine Learning in Action ch.9.5 ~ 9.7 Regression Tree

9.5 모델 트리 각각의 단말 노드를 간단한 상수 값으로 처리하는 것처럼 데이터를 모델링하는 방법으로 각각의 단말 노드에 구간별로 선현 모델을 적용하는 모델링 방법이 있다. 구간별 선형이란 여러가지 선형적인 부분들로 구성된 모델을 의미한다. 의사결정 트리가 다른 기계학습 알고리즘보다 좋은 것은 결과를 이애하기 쉽기 때문이다. 여러 개의 직선은 상수 값으로 이루어진 큰 트리보다 해석하기 쉽다. def linearSolve(dataSet):   #helper function used in two places     m,n = shape(dataSet)     X = mat(ones((m,n))); Y = mat(ones((m,1)))#create a copy of data with 1 in 0th postion     X[:,1:n] = dataSet[:,0:n-1]; Y = dataSet[:,-1]#and strip out Y     xTx = X.T*X     if linalg.det(xTx) == 0.0:         raise NameError('This matrix is singular, cannot do inverse,\n\         try increasing the second value of ops')     ws = xTx.I * (X.T * Y)     return ws,X,Y def modelLeaf(dataSet):#create linear model and return coeficients     ws,X,Y = linearSolve(dataSet)     return ws def modelErr(dataSet...

cs109 #Lab2 Data Engineering

1. Retrieving data from the web 1.1 request 우선 사이트에서 사이트 정보를 갖고 오는 것부터 시작한다. req = requests.get("https://en.wikipedia.org/wiki/Harvard_University") 위 코드를 통해 request 한다. page = req.text 텍스트로 page 변수에 저장한다. '\n \n \n\n Harvard University - Wikipedia, the free encyclopedia \n \n

cs109 #Lecture 2 DataScraping

cs109의 강의 구성이 어떻게 되는지 잘 모르겠다.. 배운 거 다른 교수가 또 하고 또 하고 그런다. 그리고 올린 강의 교재도 다 안 끝내고 수업이 끝난다. 무슨 영화 트레일러 같은 느낌이다. 여튼 그래도 듣기 시작한 거 다 들어야겠다. 1. Pandas 또 pandas를 배운다.. 배우지 못한 것들 위주로 해야겠다.. 1.1 Split-Apply-Combine 말 그대로 groupby 함수를 이용해서 split하고, 적용하고 싶은 함수(ex. count(), mean() ...)를 이용해 split된 데이터 프레임에게 apply하고, 다시 합쳐 큰 데이터 프레임을 만든다. grouped_data = ratings['movie_id'].groupby(ratings['user_id']) 위 코드는 rating의 user_id를 기준으로 rating의 movie_id를 split하는 것이다. 그렇다면 user_id가 한 개일 때 여러가지 moive_id들이 존재할 것이다. ratings_per_user = grouped_data.count() 쪼개진 데이터 프레임에 count 함수를 적용시킨다. 1.2 Quiz print (ratings[ratings.movie_id.isin(good_movie_ids)].rating) 이건 도약이 좀 있지만 isin 함수가 잘 쓰일 수 있다는 생각에 써봤다. ratings 데이터 프레임에 good_movie_ids (rating 이 가장 높은 영화의 ids의 리스트) 가 movie_id 열에 존재하면 isin 함수를 통해 True를 반환한다. 그럼 []안에 True 값이 가리키는 mov의 rating 출력된다. 2. Passing a Function 2.1 lamda 한 줄로 사용자 정의 함수를 표현할 수 있다. average_ratings = grouped_data.apply(lambda f: ...

cs109 #Lab 1. An Introduction to Pandas and Python

이미지
공부할 것을 또 찾아버렸다. 머신러닝 인 액션을 아직 다 못 끝냈지만 곧 끝나기 때문에 이것도 같이 해야겠다. 데이터 마이닝하는 데에 도움되는 강의 내용들이 많아 정리하면서 공부해야겠다. Jupyter 로 강의를 한다. 원하는 정보가 바로바로 뜨기 때문에 파이참보다 좋은 것 같다. 우선 Jupyter에 대한 사용법부터 설명한다. 1. Jupyter 사용법 1.1 명령어 사용하기 !를 이용하여 명령어 사용이 가능하다. 예를들면, !C:/Users/llewyn/Anaconda3/Scripts/pip install seaborn 1.2 Markdown 사용 Look up http:/www.google.com Lets eat a burrito. $\alpha = \frac{\beta}{\gamma}$ Longer: $$\alpha = \frac{\beta}{\gamma}$$ 1. an item 2. another item 3. i like items hello, i am **bold** , or i am *important*, and i am a `tick` > and mile to go before i sleep ```python def fune():     print "hello" ``` 위 마크다운을 실행해보면  아래와 같은 화면이 된다. 2. Pandas  여기서는 내가 아는 것들은 다 제외시키고 정리해야겠다. 2.1 Basics df.dtypes 는 data cleanup 하기 전에 데이터 타입 알아보고 싶을 때 사용. 2.2 Querying df.rating < 3 의 결과는 불리안으로 처리된다. 2.3 Filtering df.query("rating > 4.5") 은 rating이 4.5를 초과하는 데이터 프레임 을 반환 df.query("rat...

Machine Learning in Action ch.9.3 & 9.4 Regression Tree

이미지
9.3 회귀를 위해 CART 알고리즘 사용하기 9.3.1 트리 구축하기 회귀 트리를 구축하기 위해서 createTree 함수를 이용한다. 그리고 chooseBestSplit 함수를 이용해 분할하기에 가장 좋은 것으로 데이터 집합을 분할하고, 데이터 집합을 위해 단말 노드를 생성하는 두가지 작업을 한다. def regLeaf(dataSet):#returns the value used for each leaf     return mean(dataSet[:,-1]) def regErr(dataSet):     return var(dataSet[:,-1]) * shape(dataSet)[0] def chooseBestSplit(dataSet, leafType=regLeaf, errType=regErr, ops=(1,4)):     tolS = ops[0]; tolN = ops[1]     #if all the target variables are the same value: quit and return value     if len(set(dataSet[:,-1].T.tolist()[0])) == 1: #exit cond 1         return None, leafType(dataSet)     m,n = shape(dataSet)     #the choice of the best feature is driven by Reduction in RSS error from mean     S = errType(dataSet)     bestS = inf; bestIndex = 0; bestValue = 0     for featIndex in range(n-1):   ...

Machine Learning in Action ch.9.1 & 9.2 Regression Tree

9.1 지역적으로 복잡한 데이터 모델링하기 분류에 쓰이는 의사결정 트리는 ID3라는 알고리즘을 사용했다.  ID3는 데이터 분할하는 데에 가장 좋은 속성을 선택한다.  그리고 그 속성이 갖고 있는 값의 갯수대로 분할하여 트리를 구축해낸다.  그러나 ID3 알고리즘에는 연속적인 속성을 직접적으로 제어할 수 없다는 제약이 있다.  이진 분할을 사용하면 연속적인 속성들을 제어하도록 트리 구축 알고리즘을 쉽게 적용할 수 있다.  즉, 선택된 속성에 대한 분할 기준이 되는 값을 설정하여 이 값보다 큰 값과 작은 값으로 연속적인 속성을 두가지 값으로 이진 분할하는 것이다.  CART 알고리즘은 이진 분할 구축과 연속적인 변화를 제어하는 알고리즘이다. 9.2 연속적이고 이산적인 속성으로 트리 구축하기 분류에 쓰인 의사결정 트리와 마찬가지고 딕셔너리를 이용해 트리를 구축할 것이다.  우리는 두 가지 유형의 트리를 생성할 것이다.  1번째는 회귀 트리로, 트리 각 노드에 단일한 값을 가진다. 2번째는 모델 트리로, 이는 각 단말 노드에 선형 방정식을 갖는다. 아래의 코드는 두 가지 유형의 트리에 모두 쓰이는 코드이다. def loadDataSet(fileName):      #general function to parse tab -delimited floats     dataMat = []                #assume last column is target value     fr = open(fileName)     for line in fr.readlines():         curLine = line.strip().spl...

Machine Learning in Action ch.8.4 & 8.5 Regression

이미지
8.4 데이터를 이해하기 위한 축소 계수 우리가 가지고 있는 데이터의 속성이 데이터 점보다 많다면, 즉,데이터 행렬 X에서 열의 개수(n)이 행의 개수(m)보다 많을 때, 예측 불가능하다. 또한 데이터 속성이 데이터 점보다 많다면 데이터 행렬 X에 전체 순위가 없다고 말한다. 이 문제를 해결하기 위해 능형 회귀와 전방향 단계별 회귀라는 두 가지 축소 방법이 존재한다. 8.4.1 능형 회귀 능형 회귀는 추가적인 행렬을 더해 비특이 행렬을 만든다. 람다 값은 모든 ws의 합계에 최댓값을 부여하기 위해 사용된다. 이렇게 뚜렷한 패널티가 있기 때문에 우리는 중요하지 않은 매개변수를 줄일 수 있다. 이것을 축소하고 한다. 축소 방법은 중요하지 않은 매개변수들을 버림으로써 데이터를 더울 더 잘 이해할 수 있게 한다. def ridgeRegres(xMat,yMat,lam=0.2):     xTx = xMat.T*xMat     denom = xTx + eye(shape(xMat)[1])*lam     if linalg.det(denom) == 0.0:         print("This matrix is singular, cannot do inverse")         return     ws = denom.I * (xMat.T*yMat)     return ws ridgeTest() 함수에서 서로 다른 30개의 람다 값을 가지고 ridgeRegres() 함수를 호출한다.  위 플롯은 30개의 람다 값에 따른 계수의 변화량을 보여주고 있다.  8.4.2 라소 라소는 일반적인 최소 제곱 회귀와 유사한 능형 회쉬 방정식으로 표현될 수 있다. 능형 회귀는 아래와 같은 제약이 추가된다. 이 식은 모든...

#3 <책은 도끼다>를 읽으며..

이미지
책 정보 저자 : 박웅현 출판사 : 북하우스  이 책 읽고 블로그에 글을 쓴 것 같은데 안 써서 이제야 와서 쓴다.. 알고 보니 담론에 대해 글을 쓰면서 잠깐 나왔다. 이 책은 2번째 읽고 있다. 다시 읽고 있지만 다시 한 번 놀라면서 읽고 있다. 사실 이 책은 잠 자기 전 샤오미 라이트를 켜고 꼬박 꼬박 읽는다. 오후에는 <안나 카레니나>를 읽고 <책은 도끼다>를 서브로 다시 한번 읽는 셈이다. 안나 카레니나도 책은 도끼다 에서 소개를 받아 읽은 책이다. 책은 도끼다는 사실 다른 여러 책들을 소개하는 책이다. 이 이유 때문에 여자 친구가 읽기 싫어한다. 내가 이 책의 장점을 잘 설명하지 못 한 것 같다. 가끔 고등학교 수학 선생님을 만난다. 수학 선생님은 독서 모임을 틈틈이 갖는다고 했다. 독서에 대해 얘기하다가 선생님께서 인문학이라는 것은 "저자의 생각을 배우는 것이다." 라는 말이 굉장히 마음에 와 닿았다. 그 말을 듣고 생각난 책이 <책은 도끼다>였다. 기본적으로 이 책의 표면적인 의도는 저자의 틀을 도끼로 깬 책을 소개하는 것이다. 하지만 저자의 저의는 그 책 안에서 자신의 생각과 경험으로 얻는 깨달음이다. 결코 그냥 책을 소개하는 책이 아님을 여자친구한테 소개해주고 싶었지만, 이 또한 경험일 거라는 생각에 넘어갔다. 이 책에 대한 느낌을 객관적으로 생각해봤다. 확실히 사람은 자신의 환경과 성향에 따라 느낀 점이 다른 것 같다. 굳이 비교해보진 않았지만 난 폴 세잔의 말이 굉장히 와 닿았다. "나는 사과 한 알로 파리를 정복할 것이다"     -폴 세잔- 후기 인상파의 거장 폴 세잔이 한 말이다. 이 말을 할 때 당시 그림 좀 그린다는 사람들은 파리의 몽 마르뜨에 앉아서 다른 화가들과 담론을 하며 그림을 그렸다. 하지만 폴 세잔은 프랑스 남부인 엑상 프로방스로 내려가면서 저 말을 했다고 한다. 시간이 지나...