핸즈온 머신러닝
2장. 머신러닝프로젝트 처음부터 끝까지
박해선(옮긴이)
haesun.park@tensorflow.blog
https://tensorflow.blog
2.
프로젝트 진행 과정
•큰 그림을 봅니다.
• 데이터를 구합니다.
• 데이터로부터 통찰을 얻기 위해 탐색하고 시각화합니다.
• 머신러닝 알고리즘을 위해 데이터를 준비합니다.
• 모델을 선택하고 훈련시킵니다.
• 모델을 상세하게 조정합니다.
• 솔루션을 제시합니다.
• 시스템을 론칭하고 모니터링하고 유지 보수합니다.
3.
공개 데이터 저장소
•유명한 공개 데이터 저장소
• UC 얼바인Irvine 머신러닝 저장소(http://archive.ics.uci.edu/ml/)
• 캐글Kaggle 데이터셋(http://www.kaggle.com/datasets)
• 아마존 AWS 데이터셋(http://aws.amazon.com/ko/datasets)
• 메타 포털(공개 데이터 저장소가 나열되어 있습니다)
• http://dataportals.org/
• http://opendatamonitor.eu/
• http://quandl.com
• 인기 있는 공개 데이터 저장소가 나열되어 있는 다른 페이지
• 위키백과 머신러닝 데이터셋 목록(https://goo.gl/SJHN2k)
• Quora.com 질문(http://goo.gl/zDR78y)
• 데이터셋 서브레딧subreddit (http://www.reddit.com/r/datasets)
4.
캘리포니아 주택 가격데이터셋
• 1990년 캘리포니아 인구조사 데이터를 기반으로 합니
다.
• 카네기 멜론Carnegie Mellon 대학교의 통계학과에서 운영
하는 StatLib 저장소(http://lib.stat.cmu.edu/
datasets/)의 데이터를 수정한 버전을 사용합니다
(http://www.dcc.fc.up.pt/~ltorgo/Regression/
cal_housing.html)
• 블록(600~3,000명 단위)마다 인구, 중간 소득, 중간
주택 가격 등
• 머신러닝 체크리스트(부록 B)
5.
비즈니스의 목적은?
• 시스템의구성, 알고리즘, 측정 지표, 튜닝 시간 등을 결정하기 때문에 중요합니다.
• “중간 주택 가격 예측이 다른 신호와 함께 투자 결정을 내리는 머신러닝 시스템의 입력
으로 사용됩니다.”
머신러닝 파이프라인
6.
현재 솔루션은?
• 현재솔루션이 있다면 현재 해결 방법에 대한 정보를 얻을 수 있고 참고 성능으로도 사
용할 수 있습니다.
• “현재는 전문가가 수동으로 중간 주택 가격을 추정합니다. 구역에 관한 최신 정보를 모
으로 복잡한 규칙을 사용합니다.”
• “수동으로 추정한 값은 10% 이상 벗어날 때가 많습니다.”
• 문제 정의: 지도/비지도/강화학습, 분류/회귀, 배치/온라인?
7.
문제 정의
• 레이블된샘플이 있으므로 지도 학습입니다.
• 연속된 값을 예측하므로 회귀 문제입니다. 특히 여러 특성을 사용하므로 다변량 회귀
mulitvariate regression입니다(반대는 단변량 회귀univariate regression).
• 데이터는 오프라인으로 준비되어 있고 크지 않으므로 배치 학습이 적당합니다.
8.
성능 측정 지표
•평균 제곱근 오차Root Mean Square Error(RMSE)
• R2 (scikit-learn 기본값)
RMSE(X, h) =
1
m
m
∑
i=1
(h(x(i)
) − y(i)
)2
R2
= 1 −
∑
m
i=1
(y(i)
− h(x(i)
))2
∑
m
i=1
(y(i) − ¯y)2
= 1 −
Residual sum of squares
Total sum of squares
=
Explained sum of squares
Total sum of sqaures
= Pearson r2
when 선형 회귀
샘플 개수 특성 타깃 or 레이블
가설(hypothesis)
9.
다른 지표는?
• 평균절대 오차Mean Absolute Error(MAE)
• 노름Norm
MAE(X, h) =
1
m
m
∑
i=1
|h(x(i)
) − y(i)
|
∥v∥k = (|v0 |k
+ |v1 |k
+ ⋯ + |vn |k
)
1
k
유클리디안 노름 = l2 노름 = ∥v∥2 = ∥v∥ = m × RMSE
맨하탄 노름 = l1 노름 = ∥v∥1 = m × MAE
k가 클수록 큰 원소에 치우칩니다 : RMSE가 MAE 보다 이상치에 더 민감
k가 무한대이면 가장 큰 원소의 절대값
k가 0이면 벡터에서 0이 아닌 원소의 수입니다
10.
표기법
• 어떤 구역의경도가 -118.29, 위도 33.91, 주민수 1,416, 중간 소득 $38,372이고
중간 주택 가격이 $156,400이라면,
x(i)
=
−118.29
33.91
1,416
38,372
y(i)
= 156,400
특성(n)
벡터(굵은 소문자)
X(i)
=
(x(1)
)T
(x(2)
)T
⋮
(x(1999)
)T
(x(20000)
)T
=
[
−118.29 33.91 1,416 38,372
⋮ ⋮ ⋮ ⋮ ]
행렬(굵은 대문자)
̂y(i)
= h(x(i)
)
가설(hypothesis)
타깃 or 레이블
예측 값(y-햇)
11.
가정 검사
• 지금까지세운 가정을 나열하고 검증하세요.
• 혹시 하위 시스템이 중간 주택 가격이 아니고 등급(분류 문제)을 원하지 않나요?
• 너무 늦게 문제를 발견하지 않도록 주의하세요.
테스트 데이터
• 데이터를더 자세히 파악하기 전에 테스트 데이터를 떼어 놓아야 합니다.
• 전체 데이터에서 너무 많은 직관을 얻으면 과대적합된 모델이 만들어집니다(데이터 스
누핑data snooping 편향)
단순한 방법
19.
split_train_test의 문제점
• 함수를실행할 때마다 다른 테스트 세트가 만들어 집니다(데이터 스누핑 우려)
• 해결책
• 테스트 세트를 따로 떼어 저장하거나 np.random.seed() 함수 사용
• 업데이트된 데이터셋을 적용하기 어려움
• 샘플의 식별자를 해싱한 값을 기준으로 분리
샘플링 편향
• 1,000명중 여성이 48.7%일 때 무작위로 선택하면
• 49%보다 적거나 54% 많은 여성이 테스트 세트에 들어갈 확률이 약 12%입니다
샘플 : n, 비율 : p일 때
n × p ≥ 10, n × (1 − p) ≥ 10 인 이항 분포는
μ = np = 513, σ = np(1 − p) = 15.8 인 정규분포로 근사합니다.
>>> from scipy.stats import norm
>>> norm.cdf(490, 513, 15.8) + (1 - norm.cdf(540, 513, 15.8))
0.11647668242572096
ocean_proximity 변환
• 범주형(텍스트)데이터를 변환하는 방법(원-핫 인코딩one-hot encoding)
• df.factorize() —> sklearn.preprocessing.OneHotEncoder
• pd.get_dummies()
• scikit-learn’s new OneHotEncoder (v0.20 before year-end)
• LabelEncoder는 텍스트 범주 y를 위한 정수 인코딩 <--> OrdinalEncoder는 텍스
트 범주 X를 위한 정수 인코딩 (v0.20)
특성 스케일링
표준점수, z-점수:평균 0, 분산 1
! − !̅
$
사분위값 사용, 이상치에 덜 민감
! − %&
%' − %(
! − !)*+
!),- − !)*+
모든 특성이
0과 1사이에 위치
Normalizer(norm=‘l2’)
다른 방법과 달리
행(포인트) 별로 적용
(유클리디안 거리를 1로 만듦)
q1q3
xminxmax
.
!(
& + !&
&
2차원일 때는 원
(3차원은 구)
이상치에 민감
52.
전처리 단계 연결
튜플리스트
Imputer.fit_transform()->
CombinedAttributesAddr.fit_transform()->
StandardScaler.fit_transform()
클래스 이름의 소문자를 사용