기타/Kaggle
- #2. Scaling and Normalization 2021.02.24
- #1 : Handling Missing Values 2021.02.14
- [Tacademy x Kakr] 함께해요! 첫번째 캐글 - 3주차 : 모델과 앙상블 2020.11.28
- [Tacademy x Kakr] 함께해요! 첫번째 캐글 - 2주차 : Feature Engineering 2020.11.10
- [Tacademy x Kakr] 함께해요! 첫번째 캐글 - 1주차 2020.11.02
- # 6. Random Forests 2020.09.08
- # 5. UnderFitting and Overfitting 2020.09.08
- #4. Model Validation 2020.09.06
- #3. Your First Machine Learning Model 2020.09.06
- #2. Basic Data Exploration 2020.09.05
#2. Scaling and Normalization
#1 : Handling Missing Values
[Tacademy x Kakr] 함께해요! 첫번째 캐글 - 3주차 : 모델과 앙상블
Kaggle 데이터분석 캠프 3주차 - 모델과 앙상블
-
빅데이터 / 4차 산업혁명 시대에 가장 중요한 것 ? : Data
-
Data가 중요한 이유
- 기존의 결정 방식에 영향을 주던 것 : 경험과 직관
- 최근에는 결정에 데이터가 중요한 비중을 차지
-
Data Driven Approach : '패턴' 이 중요
- 어떻게 전처리를 해서
- 어떻게 분석한 후(EDA, feature engineering)
- 좋은 모델을 만들어낼 것인가?
-
머신러닝 : 데이터 속의 pattern recognition
- 목표(최소 오차)를 위해
- 일반적인 함수(조건)을 만드는 것
- feature - feature / feature - target 사이의 상관관계를 학습
-
데이터의 분석 과정
- 문제 설정
- 데이터 수집, 전처리
- EDA
- 인사이트 얻기
- feature engineering
- 모델 개발
- 모델 평가
- kernel 참고
- 3~8 무한반복…
- 보통 Kaggle에서는 3~8의 과정만을 다루게 됨
-
머신러닝을 공부하려면 : 데이터와 사람(=자료) 이 많은 곳으로!
Scikit-learn 분류 모델 만들기
- logistic regression
- 선형 회귀모델 (y = ax + b)의 변형
- 확률 개념(odds)를 도입
- maximum likelihood estimation을 이용하여 학습
- support vector machine
- 주어진 데이터의 클래스 그룹 사이의 margin이 최대가 되는 support vector를 탐색
- support vector와 수직인 경계(결정 경계, descision boundary)를 찾는 알고리즘
- 경험적 위험 최소화(ERM)
- 주어진 훈련 데이터에 대해서만 손실 최소화
- 새로 추가된 데이터의 경우 오차가 발생할 수 있음
- 신경망, 선형회귀 등
- 구조적 위험 최소화(SRM)
- 관찰하지 않은 데이터에 대해서도 손실 최소화
- 일반화된 최소 오차를 계산
- Support Vector Machine의 목표
- soft margin
- 유연한 경계면
- 경계를 넘어가는 데이터를 감수하더라도 최선의 경계선 탐색
- har margin
- 데이터를 분명하게 가르는 경계선
- Kernel Trick
- 저차원에서는 분리가 안될 수 있지만, 고차원으로 보낼 경우 가능할 수 있음
- Kernel 함수라는 매핑 함수를 이용 : 저차원 연산에서도 고차원 연산처럼 만들어주기 때문에 Kernel trick이라고 부름
- ex. Linear, Poly, RBF(방사기저함수), Hyper-Tangent(쌍곡선)
- decision tree
- if-then 분류를 이용한 데이터 분류
- greedy algorithm(최적의 트리 생성을 보장하지 않음)
- 변수가 가진 정보량에 따라 분류
- tree 깊이가 깊어지면 overfitting 가능성 존재
- SVM 등 다른 모델 대비 빠른 편
- if-then 분류를 이용한 데이터 분류
- random forest
- 결정 트리를 여러 개 만들어 학습
- 데이터 row, column의 일부를 샘플링하여 각 모델에 학습
- 생성된 각 결정 트리를 앙상블
- 간단하고 빠른 알고리즘
- 변수 소거 없이 많은 입력 변수를 다룰 수 있음
- 일반화 성능이 좋음 (참고 : 모델의 분산과 편향)
- XGBoost
- Extreme Gradient Boosting Tree 알고리즘
- 균형 트리 분할로 인한 과적합 규제
- 가지치기, 자체 교차 검증 기능 제공
- 결측치를 자체 처리
- Early Stopping : 검증 Score가 일정 수준에 도달하면 학습을 멈춤
- LightGBM : XGBoost의 장점을 취하되, 리프 중심의 트리 분할로 가볍고 빠르면서 나은 성능 제공 / But 적은 데이터에서는 과적합 우려
k-Fold Cross Validation
- 기존의 데이터 학습 과정
- 샘플된 데이터로 모델 학습
- 나머지 데이터로 모델 검증
- k-fold cross validation
- 데이터를 k개 그룹(fold)으로 나눔
- 임의의 1개 그룹은 검증에, 나머지 데이터는 모델 학습에 사용, 총 k회 반복
- 각 fold에 대한 score 계산
- 검증 횟수를 늘려 다소 일반화된 모델을 생성 가능
Out-of-Fold / Stacking 앙상블
- Out-of-Fold
- K-Fold에서 추론 과정을 추가
- 모델 출력은 label 대신 확률로 나타냄
- 각 모델의 확률값의 평균 계산
- Stacking 앙상블
- 추가 모델 구성 없이 기존 모델 성능을 극대화
- 학습 데이터 외에 검증용으로 쓰는 fold 데이터 역시 추론 과정에 활용
- 학습 fold와 검증 fold의 추론 결과를 각각 저장
- 충분한 모델이 생성되지 않으면 오히려 정확도가 낮아질 수 있음
- 어느 정도 성능이 나오는 모델들을 합칠 때 효과가 나타나는 편
[Tacademy x Kakr] 함께해요! 첫번째 캐글 - 2주차 : Feature Engineering
- 성인 인구의 수입 분석 : 정형 데이터 분석
- 학습 목표 : 차원 축소 / 스케일링 / 이상치, 범주형, 결측치 처리
- 본 모델에 들어가기까지의 데이터 전처리(?)
Overview
-
데이터 사이언스로 돈을 버는 법 : 흥미, 관심사 > 조회수를 높일 만한 결과 도출하기
-
문제점 : 생각만큼 데이터 품질이 좋지 않다
- Kaggle의 경우 매우 정제가 잘 된 편
- 실제로는 데이터 '만' 많은 경우가 많음 : 쓸모가 없거나, 품질이 좋지 않거나
-
데이터 분석의 약 70% 가량이 전처리
-
왜?
- 데이터 수집/처리기가 불안정하거나
- 데이터의 수집, 가공, 저장 비용
- 데이터 형태가 너무 많아짐(시계열, 음성, 영상 등등...)
- 수집된 데이터와 컴퓨터로 분석 가능한 형태 사이의 간극 존재
-
Data Science
- 데이터의 수집, 가공, 서비스 적용, 다시 수집, ...
- EDA 전에 전처리가 우선되어야 함 : EDA시 잘못된 데이터로 인한 오해가 있을 수 있기 때문
Data
-
데이터 : 정형 vs 비정형 / 수치형 vs 범주형
-
정형 데이터 : Table 형태로 존재 (주로 SQL로 처리)
-
비정형 데이터 : 이미지, text 등등
-
수치형 데이터 : 양적 정보
-
범주형 데이터 : Categorical data
-
데이터 사이언티스트의 업무
- 내가 다룰 데이터가 어떤 구조로 이루어지는가?
- 데이터 변형 시 어떤 변화가 이루어지는가?
- 이 데이터가 내가 원하는 목적과 얼마나 부합하는가?
-
데이터 처리 시의 문제
- 용량은 작은데 불러올때 메모리 사용량이 어마어마한 이유는?
- 실제 데이터는 0, 1꼴의 작은 값이지만, 실제 계산 시에는 Int64/Float64형태로 불러옴, 이로 인해 차지하는 메모리 용량이 실제 값보다 더 커짐
Data Preprocessing
-
데이터 전처리
- missing value : 어떻게 해서 생기게 되었는지?버려도 되는 값인지?
- outlier : 분포를 크게 벗어난 값
- dependent / independet value : kaggle의 경우 target이 정해져 있음 - 현업의 경우 어떤 값을 target으로 할지 직접 정해주어야 함
- train / test split
- scaling
-
missing vlaue : 존재하지 않는 값 / 시스템 오류로 인한 비정상 값
- '', '#N/A', 'NaN', 'NULL' 등
- dataset의 ? : missing value인가? 무직인가? ...?
- 다수 column에 ?가 있다면 서로 간의 상관관계가 있을 수 있을까?
- 결측치의 처리 : 삭제 or 대치
- 삭제 : 대부분이(ex. 80%) missing인 경우 / 기본 dataset이 많아서 몇 개 빠져도 상관 없는 경우
- 대치 : 다른 sample 분포로 예측 가능한 경우 / 의미적 추론이 가능한 경우
-
Outlier : 동 feature 샘플들과 비교할 때 비정상적으로 떨어진 관측치
- Outlie의 처리 : 삭제, 대치, 로그변환
- 대치 : 의미상 다른 값(보통 최대/최소) 로 대체해도 무관한 경우
- 삭제
- 극단적인 Outlier의 경우 삭제하는 것이 유의미할 수 있음
- 다른 cluster에 속하는 새로운 유의미한 data일 가능성 역시 있음 - 이 경우 scaler 등을 통해 처리하는 쪽이 더 나음
- Outlie의 처리 : 삭제, 대치, 로그변환
-
Scaling
- 같은 수치형이라도 평균/최대/최소값은 서로 다름
- 수치 데이터들의 range가 다를 경우, 각 feature를 그대로 학습시키면 결과값에 미치는 영향력이 서로 달라질 수 있음
- min-max scaler : 정규화(normalization)
- standard scaler : 표준화(standardization
- Data Leakeage : test data는 일어나지 않은 일 > scale된 train과 다른 분포가 나타날 수 있지만, 같은 분포를 갖고 있음을 가정
Feature Engineering
-
Feature : 모델 예측에 사용될 수 있는, 데이터를 표현하는 모든 변수, 개체, 특성
-
Feature Engineering : 더 나은 모델 알고리즘을 위한 Raw data에서 Feature를 만들어내는 과정
-
인코딩
- 컴퓨터가 이해하기 힘든 형태의 데이터를 처리 가능한 형태로 변환하는 과정
- one-hot encoding : 범주형 변수를 독립적 feature로 변환
- label encoding : 순서가 있는 변수를 숫자 형태로 numbering
- mean encoding : 분포를 바탕으로 값 mapping - 학습은 빠르나 overfitting 위험
-
차원의 저주
- feature수가 늘어남에 따라 해당 target을 설명하는 data 수가 줄어드는 현상
- 차원이 낮을수록 모델 성능이 높아짐
- 모델 복잡도 감소 / overfitting 회피 : 특성 선택 vs 추출
- 특성 선택 : 높은 성능을 나타내는 feature를 선택 (with greedy algorithm)
- 특성 추출 : feature를 바탕으로 새 feature 구성 (with PCA, LDA)
-
PCA(주성분 분석)
- 고차원 feature 중 중요 몇 가지를 추출
- 비지도 학습의 일종
- 큰 분산 = 많은 정보
- 데이터 분산을 표현하는 벡터 > 표현력이 큰 벡터 선별 후 원본 데이터 투영 > k (k < d)인 데이터 셋으로 재구성
- 단점 : 새로 만들어진 feature가 갖는 의미는 불확실해짐
Before Modeling
-
Kaggle조사에서
- 가장 좋아하는 ML/DL method: 딥러닝, 인공신경망, 시계열 분석, ...
- But 실무에서 사용되는 DL Method : 데이터 시각화, Logistic Regression, Cross-Validation, 결정 트리, Random Forest, ...
- 의외로 고전적 분석법들이 잘 동작하는 경우가 많음
-
이렇게 배운 걸 모두 활용해야 하는가?
- 모든 도구들이 항상 필요한 건 아니지만, 배워 두면 언젠가 쓸 일이 생긴다
- 사용법을 숙지하면 다른 작업에 활용될 여지도 있다
[Tacademy x Kakr] 함께해요! 첫번째 캐글 - 1주차
- 4차 Kaggle 대회를 맞이하며 다시 시작하는 kaggle 입문 수업
- 총 4회에 걸친 커리큘럼
- 1주차 : kaggle 맛보기
- 2주차 : kaggle feature engineering - 기술적 노하우
- 3주차 : 모델링 검증 & 앙상블 해보기
- 4주차 : 마무리
1주차의 목적
- 머신러닝/딥러닝/라이브러리 강의는 넷 상에 매우 좋은 자료가 많음
- 이번 주의 주된 목표
- 캐글 소개
- 대회(Competition) 소개
캐글에서 어떻게 공부하는지
- 캐글이란?
- 데이터 사이언스 / 머신러닝 학습자들의 커뮤니티
- 컴피티션(대회), dataset, Notebook(일종의 Code), Discussion의 크게 4가지로 활동 가능
- 캐글러의 목표?
- 재미, 성취, 공부, 상금, 취업 등 복합적
- 나의 경우 : 공부나 취업 정도가 될 듯....
- 이번 수업에서 임의로 설정한 목표 : 메달, 그리고 티어
- Kaggle의 Tier
- 가장 많은 사람들이 Contributor에 속하고, Expert부터가 진짜 실력자라고 볼만 한 레벨
- 예상과는 달리 오히려 Competition에서 티어 높이기가 쉽고, Notebook - Discussion으로 갈수록 어려움
- upvote를 많이 받아야 메달을 따고 티어를 높이는데, 어지간한 내용이 아니고서야 잘 받기가 힘듬 + 나와 Novice tier는 집계에 들어가지 않기때문에 더더욱....
- Data Science의 내용 전개
- 정보 수집 및 구조화 - Kaggle에서는 어느 정도 제공
- 데이터 수집
- 구조화 : SQL, Big Query 등등...
- 데이터 전송 : 분산 처리(하둡, 스파크 등등...)
- 판단 - Kaggle의 주 목적
- 분석 및 판단 - EDA 및 시각화를 통한 데이터 종류 분석 : 지도/비지도 학습 분류
- 데이터의 종류 : 정형(보통 csv파일로 제공), 시계열, 이미지, 음성, txt 등등....
- 정보 수집 및 구조화 - Kaggle에서는 어느 정도 제공
대회 살펴보기
- Kaggle 대회의 Type
- Featured : 대부분의 대회, 높은 예측 score를 받을수록 유리
- Analytics : 분석 - 나만의 Notebook 만들기
- Research : 연구
- Getting Started : 튜토리얼 대회
- Playground : 일종의 재미용 대회
- 제출 방식
- Simple Competition : csv 형태로 제출
- Code Competition : 코드로 제출
- Simple Competition은 개인의 Computing 자원에 따라 유/불리가 갈릴 수 있음
- Code competition은 공통된 note북 환경을 이용하나, 사전에 개인이 학습시켰던 모델의 활용이 가능한 경우 개인 자원에 따라 유/불리가 갈릴 수 있음
- 대회 접근 순서
- 대회의 주제 확인
- data 종류, 양 확인
- Evaluation 기준, 참가자들의 leaderboard 확인
- 기존의 Discussion 확인 : 빠른 Follow-Start를 위해
- Upvote가 많은 Notebook 확인
- 대회 스코어
- Public Leaderboard : test 데이터 중 일부만을 이용해 점수 측정
- 데이터는 임의로 선택되므로 항상 leaderboard가 높다고 최종 등수까지 높은 것은 아님
- Public Leaderboard : test 데이터 중 일부만을 이용해 점수 측정
- 대회 참여 시 참고하면 좋을 Notebook
- EDA 관련 : 대회 초반
- 전처리 및 모델링 : 대회 중 ~ 후반
- 대회 진행에 따른 discussion
- 대회 초반 : 설명의 부족, 개선 건의
- 대회 중~후반 : 적용 시 좋을 라이브러리, 관련 논문 소개
- 대회 후 : 자신의 솔루션 공개
Competition의 진행 순서
- 이상적이라면 : 입력-모델링-출력
- 실제
- 입력 : 보통 pandas 라이브러리 사용
- EDA : 데이터 시각화, 통계를 통한 좋은 feature 찾기
- 전처리 : 모델에 맞게 수정
- 모델링 : 모델- 결과 모델 사이의 반복을 통한 문제 개선
- EDA : 데이터에서 무엇을 볼 것인가?
- 어떤 문제를 해결할지(상관관계 등)
- 어떤 데이터가 있고, 어떻게 처리할지
- 누락(NULL)이 있는지, 있다면 어떻게 처리할지
- 특이값(Outlier)이 있는지, 어떻게 처리할지
- 데이터 활용을 위한 새 feature를 활용할지
- EDA시 데이터의 분류
- 수치형 데이터 : 이산형 / 연속형
- 범주형 데이터 : 명목형 / 순서형
# 6. Random Forests
Introduction
-
결정 트리는 여러분에게 어려운 결정을 남겨줍니다. 많은 잎을 갖는 깊은 트리는 각 예측이 적은 집의 데이터에서 온 데이터이기 때문에 오버피팅을 유발할 것입니다. 한편 적은 잎을 갖는 얕은 트리는 raw 데이터에서 많은 특성을 찾지 못해 좋지 못한 성능을 갖게 될 것입니다.
-
비록 오늘날의 대부분의 모델링 기술이 오버피팅과 언더피팅 사이의 이러한 긴장을 마주하고 있지만, 많은 모델들은 더 나은 성능을 위한 좋은 아이디어를 갖고 있습니다. 우리는 이런 예시로 Random Forest를 알아볼 것입니다.
-
Random Forest는 많은 트리를 이용하여, 각 구성 트리의 예측을 평균하여 예측합니다. 보통 단일 결정 트리보다 더 나은 예측 정확도를 갖고 기본 파라미터로도 잘 동작합니다. 만약 여러분이 계속해서 모델링한다면, 여러분은 더 좋은 성능을 갖는 모델들에 대해 배우게 되겠지만, 대부분은 적절한 파라미터에 민감하게 반응합니다.
Example
- 여러분은 이미 데이터를 불러오는 코드를 본 적이 있습니다. 데이터를 불러올 때, 우리는 다음과 같은 변수를 갖게 됩니다.
- train_X
- val_X
- train_y
- val_y
- 우리는 scikit-learn에서 결정 트리를 만든 방식과 유사하게 랜덤 forest model을 만듭니다 - 이번에는 DecisionTreeRegressor 대신 RandomForestRegressor 클래스를 사용합니다.
from sklearn.metrics import mean_absolute_error
forest_model = RandomForestRegressor(random_state=1)
forest_model.fit(train_X, train_y)
melb_preds = forest_model.predict(val_X)
print(mean_absolute_error(val_y, melb_preds))
/opt/conda/lib/python3.6/site-packages/sklearn/ensemble/forest.py:245: FutureWarning: The default value of n_estimators will change from 10 in version 0.20 to 100 in 0.22.
"10 in version 0.20 to 100 in 0.22.", FutureWarning)
202888.18157951365
Conclustion
- 더 개선의 여지가 있지만, 결정 트리의 오차값인 250000을 볼 때 매우 큰 개선이 이루어졌습니다. 우리가 단일 결정 트리의 최대 깊이를 바꾼 것과 같이 랜덤 포레스트의 성능을 여러분이 바꿀 수 있는 파라미터가 존재합니다. 하지만 이러한 튜닝 없이 일반적으로 하는 것이 랜덤 포레스트 모델의 가장 좋은 기능 중 하나라고 할 수 있습니다.
- 여러분은 곧 튜닝과 적절한 파라미터값일 때 더 좋은 성능을 제공(하지만 파라미터 값을 위해 적당한 기술이 필요한)하는, XGBoost 모델에 대해 배울 것입니다.
# 5. UnderFitting and Overfitting
- 이번 수업을 마치고 나면, 여러분은 언더피팅(underfitting)과 오버피팅(overfitting)의 개념에 대해 알고, 이러한 개념을 모델을 더 정확하게 만들기 위해 사용할 수 있을 것입니다.
Experimenting With Different Models
-
이제 여러분은 모델의 정확도를 측정하는 적절한 방법을 갖고, 다른 모델과 비교하여 어떤 것이 제일 괜찮은 예측을 제공하는지 실험할 수 있습니다. 하지만 모델을 위한 대안은 어떻게 해야 할까요?
-
여러분은 scikit-learn 문서에서 결정 트리 모델이 (여러분이 오랫동안 원하거나 필요로 하는 것 보다도 많은) 옵션을 제공하는 것을 볼 수 있습니다. 가장 중요한 옵션은 트리의 깊이를 결정하는 것입니다. 이 수업의 가장 첫 단원을 되돌아보면 트리의 깊이는 예측 이전에 얼마나 많은 분류가 이루어지는지에 대한 단위였습니다. 이것은 매우 얇은 트리입니다.
-
실제로, 트리가 최상단(모든 집)에서 잎까지 10개의 분류를 갖는 것은 매우 흔하지 않은 일입니다. 이것이 깊어질수록, 데이터셋은 더 적은 집의 잎으로 나누어집니다. 만약 트리가 한 개의 분류만을 갖고 있다면, 그 트리는 데이터를 2개의 그룹으로 나눌 것입니다. 만약 한번 더 나누면, 우리는 4개의 집 그룹을 얻게 될 것입니다. 다시 나누면 8개의 그룹이 만들어질 것입니다. 만약 계속해서 그룹의 개수를 두배로 만들면서 각 단계마다 더 많은 분류를 추가한다면, 우리는 10단계에 이르렀을 때 개의 집의 그룹을 얻게 될 것입니다.
-
우리가 집들을 매우 많은 잎으로 나누게 될 때, 우리는 각 잎에 매우 적은 집들이 남겨지게 됩니다. 매우 적은 집들을 갖는 잎은 실제 집값과 꽤나 가까운 예측을 하겠지만, 새로운 데이터에 대해서는 매우 적절하지 않은 예측을 하게 될 것입니다(각 예측은 매우 적은 집들에 기반하기 때문입니다).
-
모델이 학습 데이터에 거의 정확하게 일치하게 되지만, 새로운 데이터나 검증 시에는 그렇지 못한 이 현상을 오버피팅이라고 부릅니다. 반면, 만약 트리가 매우 얕다면, 집들을 분명한 그룹으로 나누지 못할 것입니다.
-
극단적으로, 만약 트리가 집들을 2~4개의 그룹으로 나눈다면, 각 그룹은 넓은 범위의 집을 갖게 될 것입니다. 예측 결과는 학습 데이터에도 불구하고, 대부분의 집에 대해 동떨어진 결과를 낼 것입니다(같은 이유로 검증 시에도 좋지 않은 결과가 나타날 것입니다). 모델이 중요한 특정이나 패턴을 데이터에서 찾지 못한다면, 학습 데이터일지라도 좋지 못한 성능을 나타낼 것입니다. 이를 언더피팅이라고 부릅니다.
-
우리는 검증 데이터에서 예측하여야 하는 새로운 데이터에 대한 정확도에 집중하기 때문에, 우리는 언더피팅과 오버피팅 사이의 스위트 스팟을 찾아야 합니다. 시각적으로, 우리는 검증 커브(아래 붉은 색)의 최저점을 원하고 있습니다.
Example
- 트리 깊이를 조절하기 위한 몇 가지 대안이 있고, 다른 경로보다 일부 경로가 더 깊은 깊이를 갖도록 하는 많은 방법이 있습니다. 하지만 max_leaf_nodes 매개변수는 매우 감각적으로 오버피팅과 언더피팅을 조절할 수 있도록 해줍니다. 모델에 더 많은 잎을 만들수록, 언더피팅 영역에서 오버피팅으로 이동하게 됩니다.
- 우리는 max_leaf_nodes를 위한 다른 값들로부터 MAE 점수를 비교하기 위한 유틸리티 함수를 사용할 수 있습니다.
from sklearn.tree import DecisionTreeRegressor
def get_mae(max_leaf_nodes, train_X, val_X, train_y, val_y):
model = DecisionTreeRegressor(max_leaf_nodes=max_leaf_nodes, random_state=0)
model.fit(train_X, train_y)
preds_val = model.predict(val_X)
mae = mean_absolute_error(val_y, preds_val)
return(mae)
- 이 데이타는 여러분이 본(그리고 이미 써본) 코드를 사용하여 train_X, val_X, train_y, val_y로 저장됩니다.
- 우리는 for-루프를 이용하여 max_leaf_nodes에 따라 다른 값으로 만들어진 모델의 정확도를 비교해볼 수 있습니다.
# compare MAE with differing values of max_leaf_nodes
for max_leaf_nodes in [5, 50, 500, 5000]:
my_mae = get_mae(max_leaf_nodes, train_X, val_X, train_y, val_y)
print("Max leaf nodes: %d \t\t Mean Absolute Error: %d" %(max_leaf_nodes, my_mae))
Max leaf nodes: 5 Mean Absolute Error: 347380
Max leaf nodes: 50 Mean Absolute Error: 258171
Max leaf nodes: 500 Mean Absolute Error: 243495
Max leaf nodes: 5000 Mean Absolute Error: 254983
- 목록의 옵션에 따르면, 500이 최적화된 잎의 개수임을 알 수 있습니다.
Conclusion
- 결론적으로:모델은 다음과 같은 문제를 겼을 수 있습니다:
- 오버피팅 : 앞으로 일어나지 않거나, 덜 정확한 예측으로 이끄는 가짜 패턴을 잡는 경우 혹은
- 언더피팅 : 연관된 패턴을 잡는데 실패하여, 덜 정확한 예측으로 가는 경우
- 우리는 모델 학습에 사용되지 않은, 검증 데이터를 사용하여, 후보 모델의 정확도를 측정합니다. 이를 통해 우리가 많은 후보 모델을 시도해보고 가장 좋은 하나를 선택할 수 있습니다.
#4. Model Validation
-
우리는 모델을 만들었습니다. 하지만 그게 얼마나 좋은 걸까요?
-
이번 수업에서는, 여러분은 여러분의 모델의 질을 측정하기 위한 모델 검증(model validation)을 사용하는 법을 배울 것입니다. 모델의 질을 측정하는 것은 여러분의 모델을 반복해서 향상시키기 위한 핵심입니다.
What is Model Validation
-
여러분은 여러분이 만드는 거의 모든 모델의 가치를 평가하고 싶을 것입니다. 대부분의(비록 모든 것은 아니지만) 어플리케이션의 경우, 모델의 질에 대한 적절한 측정 방법은 예측의 정확도입니다. 다시 말해, 모델의 예측이 실제로 일어나는 것과 유사한가를 보는 것입니다.
-
많은 사람들은 정확도 예측에 있어 큰 실수를 하곤 합니다. 그들은 그들의 학습 데이터를 이용해 예측을 한 뒤 학습 데이터의 목표값과 비교합니다. 이러한 접근법에 대한 문제점과 해결법은 잠시 후 알게 되겠지만, 먼저 어떻게 해야 할 지에 대해 알아보도록 합시다.
-
여러분은 먼저 이해할 수 있는 방식으로 모델의 질을 요약할 필요가있습니다. 만약 10000가구에 대한 예측과 실제 집값을 비교한다고 할 때, 여러분은 아마 좋거나 나쁜 예측의 혼합을 보게 될 것입니다. 10000개의 예측과 실제 값을 보는 것에는 핵심을 볼 수 없습니다. 우리는 이것을 하나의 계측값으로 요약할 필요가 있습니다.
-
모델의 질을 요약하기 위한 많은 계측법이 있지만, 우리는 Mean Absolute Error(평균 절대 오차 - MAE라고도 불리는) 것으로 시작해볼 것입니다. 마지막 단어인, 오차로부터 시작해봅시다.
-
각 집값의 예측되는 오차는 :
error=actual−predicted
-
그래서, 만약 집값이 $150000이고, 여러분이 예측이 $100000이라면 오차는 $50000이 됩니다.
-
MAE 계량을 통해, 우리는 각 오차의 절대값을 얻을 수 있습니다. 이 방법은 각 오차를 양수로 변환해줍니다. 우리는 그 뒷 각 오차의 평균값을 계산합니다. 이 방법이 모델의 질을 측정하기 위한 우리의 계량법입니다. 순수하게 영어로 표현하면,
On average, our predictions are off by about X.
- MAE를 계산하기 위해서는, 먼저 모델이 필요합니다.(코드 중략) 일단 모델을 생성하고 나면, 평균절대오차를 계산하는 방법은 다음과 같습니다.
from sklearn.metrics import mean_absolute_error
predicted_home_prices = melbourne_model.predict(X)
mean_absolute_error(y, predicted_home_prices)
434.71594577146544
The Problem with "In-Sample" Scores
-
우리가 계산한 측정값은 표본 내 성적("In-Sample" Scores)이라고 부를 수 있습니다. 우리는 모델을 구축하고 평가하기 위해 집들에 대한 하나의 "샘플"을 사용했습니다. 이게 왜 좋지 않은가에 대해 알아봅시다.
-
생각해봅시다, 거대한 부동산 시장에서, 문 색깔은 집값과 그다지 연관이 없습니다.
-
하지만, 여러분이 모델을 만들때 쓴 샘플에서, 녹색의 문을 갖는 모든 집들은 매우 비싼 것으로 나타났습니다. 이 모델의 역할은 집값을 예측하기 위해 패턴을 찾는 것이고, 그래서 이러한 패턴을 찾아내어, 녹색의 집이 매우 비쌀 것이라는 예측을 할 것입니다.
-
이러한 패턴이 학습 데이터에서 나타났기 때문에, 학습 데이터에서 이 모델은 정확할 것으로 나타날 것입니다.
-
하지만 모델이 새 데이터를 볼 때 이러한 패턴이 잡히지 않는다면, 이 모델은 연습때보다 매우 부정확할 것입니다.
-
모델의 실험값은 새 데이터에 대한 예측에서 오기 때문에, 우리는 모델을 만들 때 쓰이지 않은 데이터를 성능 측정에 사용합니다. 이를 위한 가장 직접적인 방법은 모델 제작 시 일부 데이터를 제외하고, 이전에 보이지 않은 데이터를 정확도 측정 테스트에 사용하는 것입니다. 이 데이터를 검증 데이터(Validation data)라고 부릅니다.
Coding It
-
scikit-learn 라이브러리는 데이터를 둘로 나누기 위해
train_test_split
이라는 함수를 갖고 있습니다. 우리는 이 데이터중 일부를 모델 피팅을 위한 학습 데이터로 사용하고, 나머지 데이터를mean_absolute_error
를 계산하기 위한 검증 데이터로 사용할 것입니다. -
코드는 다음과 같습니다:
from sklearn.model_selection import train_test_split
# split data into training and validation data, for both features and target
# The split is based on a random number generator. Supplying a numeric value to
# the random_state argument guarantees we get the same split every time we
# run this script.
train_X, val_X, train_y, val_y = train_test_split(X, y, random_state = 0)
# Define model
melbourne_model = DecisionTreeRegressor()
# Fit model
melbourne_model.fit(train_X, train_y)
# get predicted prices on validation data
val_predictions = melbourne_model.predict(val_X)
print(mean_absolute_error(val_y, val_predictions))
260991.8108457069
#3. Your First Machine Learning Model
Selecting Data for Modeling
- 여러분의 데이터셋의 변수는 머릿속으로만 생각하거나, 멋지게 출력하기에는 너무 많이 있습니다. 어떻게 이해하기에 과도한 양의 데이터를 줄일 수 있을까요?
- 우리의 직관을 이용하여 몇 가지 변수를 고르는 것으로 시작해봅시다. 나중의 수업에서는 변수의 우선 순위를 자동으로 매기는 통계학적 기술에 대해 알아볼 것입니다.
- 변수/열을 선택하기 위해, 우리는 데이터셋의 모든 열을 볼 필요가 있습니다. DataFrame의 Column 특성을 통해 알 수 있습니다(아래에 코드가 있습니다.)
melbourne_file_path = '../input/melbourne-housing-snapshot/melb_data.csv'
melbourne_data = pd.read_csv(melbourne_file_path)
melbourne_data.columns
Index(['Suburb', 'Address', 'Rooms', 'Type', 'Price', 'Method', 'SellerG',
'Date', 'Distance', 'Postcode', 'Bedroom2', 'Bathroom', 'Car',
'Landsize', 'BuildingArea', 'YearBuilt', 'CouncilArea', 'Lattitude',
'Longtitude', 'Regionname', 'Propertycount'],
dtype='object')
# The Melbourne data has some missing values (some houses for which some variables weren't recorded.)
# We'll learn to handle missing values in a later tutorial.
# Your Iowa data doesn't have missing values in the columns you use.
# So we will take the simplest option for now, and drop houses from our data.
# Don't worry about this much for now, though the code is:
# dropna drops missing values (think of na as "not available")
melbourne_data = melbourne_data.dropna(axis=0)
- 데이터의 하위 집합(subset)을 선택하기 위한 여러 가지 방법이 있습니다. Pandas Micro-course는 이런 것들을 더 깊이 다루지만, 우리는 두 가지 접근법에 집중해볼 것입니다.
- "예측 타겟"을 선택하는, Dot notation
- "특징"을 선택하는, Column list 선택
Selecting The Prediction Target
- 여러분은 dot-notation으로 변수를 추출할 수 있습니다. 이 하나의 열은 일럴로 저장되며, 1개 열을 갖는 DataFrame과 유사합니다.
- 우리는 Prediction target이라고 하는, 예측하고자 하는 열을 선택할 때 dot notation을 사용할 것입니다. 편의를 위해, prediction target은 y라고 부릅니다. 그렇기 때문에 멜버른의 데이타에서 집값을 저장하기 위한 코드는 다음과 같습니다.
y = melbourne_data.Price
Choosing "Features"
- 우리의 모델(나중에는 예측에 사용될)에 입력된 열은 "특성(features)"라고 불립니다. 이 경우, 집값을 판단하기 위해 사용되는 열이 될 것입니다. 때때로, 여러분은 타겟을 제외한 모든 열을 특성으로 활용할 것입니다. 다른 경우 더 적은 특성을 이용하는 것이 더 나을 것입니다.
- 이번에는, 우리는 몇 가지 특성을 이용하여 모델을 구성할 것입니다. 나중에 어떻게 다른 특성을 갖는 모델을 순회하고 비교하는지에 대해 배우게 될 것입니다.
- 우리는 브래킷 내에 제공되어 있는 열 이름을 특성으로 선택합니다. 이 리스트 내의 각 아이템은 문자열로 되어 있습니다.
- 예시는 다음과 같습니다:
melbourne_features = ['Rooms', 'Bathroom', 'Landsize', 'Lattitude', 'Longtitude']
- 편의를 위해, 이 데이터를 X라고 부릅니다.
X = melbourne_data[melbourne_features]
- 가장 위의 몇 개의 열을 보여주는
describe
메소드와head
메소드를 이용해서 집값을 예측하기 위해 데이터를 빠르게 확인해봅시다.
X.describe()
X.head()
- 이 명령어로 시각적으로 데이터를 확인하는 것은 데이터 사이언티스트들의 중요한 업무 중 일부입니다. 여러분은 더 많은 직관을 제공하는 데이터셋에 종종 놀라게 될 것입니다.
Building Your Model
- 여러분은 모델을 만들기 위해
scikit-learn
라이브러리를 사용하게 될 것입니다. 코딩할 때, 샘플 코드에서 볼 수 있듯 종종sklearn
라고도 쓰입니다. Scikit-learn은 보통 Dataframe에 저장된 데이터들을 모델링하는데 가장 유명한 라이브러리입니다. - 모델을 구성하고 사용하는 단계는 다음과 같습니다:
- 정의 : 어떠한 모델이 될 것인가? 결정 트리? 다른 형태의 모델인지? 모델 타입의 다른 몇몇 파라미터들 역시 명시되어야 합니다.
- 피팅 : 제공된 데이터에서 패턴을 확인합니다. 이것이 모델링의 핵심입니다.
- 예측 : 말 그대로의 의미입니다.
- 가치 판단 : 얼마나 모델이 정확한지 판단합니다.
- 여기 scikit-learn을 이용한 결정 트리 모델과 특성과 타겟 변수를 이용한 예시가 있습니다.
# Define model. Specify a number for random_state to ensure same results each run
melbourne_model = DecisionTreeRegressor(random_state=1)
# Fit model
melbourne_model.fit(X, y)
DecisionTreeRegressor(criterion='mse', max_depth=None, max_features=None,
max_leaf_nodes=None, min_impurity_decrease=0.0,
min_impurity_split=None, min_samples_leaf=1,
min_samples_split=2, min_weight_fraction_leaf=0.0,
presort=False, random_state=1, splitter='best')
- 많은 머신 러닝 모델들은 모델 학습에 임의성을 이용합니다. random_state로 숫자를 명시하는 것은 여러분이 각 단계마다 같은 결과를 얻도록 합니다. 이는 좋은 시도일 수 있습니다. 어떠한 숫자를 사용하면, 모델의 질은 어떠한 값을 고르더라도 의미 있게 관련되지는 않을 것입니다.
- 우리는 이제 결정을 할 수 있는 피팅된 모델을 갖고 있습니다.
- 실제로, 여러분은 우리가 가격을 이미 알고 있는 집보다는 시장에 나타나는 새로운 집에 대해 결정을 내리고자 할 것입니다.하지만 우리는 얼마나 예측 함수가 잘 동작하는지 보기 위해 처음의 몇 개 열에 대해 결정을 내릴 것입니다.
print("Making predictions for the following 5 houses:")
print(X.head())
print("The predictions are")
print(melbourne_model.predict(X.head()))
Making predictions for the following 5 houses:
Rooms Bathroom Landsize Lattitude Longtitude
1 2 1.0 156.0 -37.8079 144.9934
2 3 2.0 134.0 -37.8093 144.9944
4 4 1.0 120.0 -37.8072 144.9941
6 3 2.0 245.0 -37.8024 144.9993
7 2 1.0 256.0 -37.8060 144.9954
The predictions are
[1035000. 1465000. 1600000. 1876000. 1636000.]
#2. Basic Data Exploration
Using Pandas to Get Familiar With Your Data
- 어떠한 머신 러닝 프로젝트를 위한 첫 단계는 데이터에 친숙해지는 것입니다. 이를 위해 Pandas 라이브러리를 사용할 것입니다. Pandas는 데이터를 분석하고 조작하기 위해 데이터 사이언티스트들이 사용하는 주된 도구입니다. 대부분의 사람들이 그들의 코드에서 Pandas를
pd.
로 줄여 씁니다. 우리는 다음 명령어를 사용합니다.
import pandas as pd
- Pandas 라이브러리의 가장 중요한 부분은 DataFrame입니다. 데이터프레임은 여러분이 표로 생각하는 데이터를 다룹니다. 이는 엑셀의 시트나, SQL 데이터베이스의 표와 유사합니다.
- 판다스는 이러한 종류의 데이터를 다루고자 할 때 강력한 도구가 됩니다.
- 예를 들어, 우리는 오스트레일리아 멜버른의 집값 데이터를 보고자 합니다. 이번 예시에서, 여러분은 아이오와의 집값을 이용하여 새로운 데이터셋에 같은 절치를 진행하게 될 것입니다.
- (멜버른의) 예시 데이터는
../input/melbourne-housing-snapshot/melb_data.csv
에 존재합니다. - 우리는 데이터를 불러온 후 다음 명령어로 분석합니다.
# save filepath to variable for easier access
melbourne_file_path = '../input/melbourne-housing-snapshot/melb_data.csv'
# read the data and store data in DataFrame titled melbourne_data
melbourne_data = pd.read_csv(melbourne_file_path)
# print a summary of the data in Melbourne data
melbourne_data.describe()
Interpreting Data Description
- 원래의 데이터셋에서 각 열은 8개의 숫자를 보여줍니다. 첫 번째, Cound는 얼마나 많은 행이 non-missing values를 갖는지 보여줍니다.
- Missing Value는 여러 가지 이유로 발생합니다. 예를 들면, 2번째 침실의 크기는 침실이 1개뿐인 집을 조사할 때는 수집되지 않습니다. missing data에 대한 주제는 곧 다시 알아볼 것입니다.
- 두번째 값은 평균입니다. 여기서, std는 표준편차를 의미하며, 수치적으로 값들이 얼마나 분포했는지를 나타냅니다.
- min, 25%, 50%, 75%, 그리고 max값이 의미하는 것은, 각 열을 최저에서 최고값으로 분류하는 것을 생각해보면 됩니다. 첫 번째(최소) 값이 min입니다. 만약 리스트에서 1/4만큼 진행하면 값들 중 25%보다 크고 75%보다 작은 값을 보면 됩니다. 이 값을 25% 값이라고 하며, 50, 75퍼센트 값은 이와 같이 정의되며, max는 가장 큰 값이 됩니다.