Statistics and Probability2022. 5. 30. 14:47
반응형

이 글은 Nikhita Singh Shiv Kalpana의 'Data Normalization With R'을 번역 및 정리한 글입니다. 원문은 여기서 찾으실 수 있습니다.

*맨 밑에 요약 및 정리가 있습니다.

#데이터 #정상화 #표준화 #Data #Normalization #Standardization #Z-score #Robust #Scalar # Min-Max #UnitLength #머신러닝 #Bioinformatics


데이터 분석에서 데이터 전처리 과정은 가장 중요한 단계 중 하나입니다. 프로그래머들은 종종 이 단계를 무시하거나 건너뛰고 바로 분석으로 들어가는데, 이것은 데이터에 편향을 줘서 예측 정확성에 영향을 주기도 합니다.

Data Normalization은 무엇인가요?

데이터 정상화(Data normalization)는 수치의 범위를 조정하여 표준 수치로 맞추는 자료 전처리 단계입니다. 머신러닝에서는 피쳐 스케일링(feature scaling)이라고도 합니다.

왜 Data Normalization이 필요한가요?

거리 기반 알고리즘(Distance-based algorithms) 및 기울기 강하 기반 알고리즘(gradient-descent-based algorithm) 등의 머신러닝 알고리즘은 자료의 범위가 맞춰져 있어야 합니다. 그 이유를 알아보기 위해 아래의 예를 같이 보겠습니다. 1.1년에서 10.5년까지 범위인 경력과 $37k에서 $122k까지 그에 상응하는 연봉의 두 변수를 가진 35명의 데이터가 있습니다 (출처: https://www.kaggle.com/rsadiq/salary)

SVM, K-Means, KNN과 같은 거리 기반 알고리즘(distance-based algorithms)은 거리함수(distance function)를 이용하여 대상 간의 유사점을 찾아 구분합니다. 이러한 알고리즘은 변수의 크기에 민감합니다. 만약 범위를 동등하게 맞추지 않으면, 더 큰 범위의 변수인 연봉이 상대적으로 작은 변수인 경력에 비해 더 많은 영향을 가지는 것으로 판단하게 될 것입니다. 그리고 이것은 데이터에 편향을 가져와 결국 정확도에 영향을 미칩니다.

​이와는 달리 기울기 강하 기반 알고리즘(gradient-descent-based algorithms)은 벡터 값으로 이루어진 함수 θ를 사용합니다. 변수들의 범위 서로 다를 때, θ는 범위가 작은 변수에서 그 학습 속도가 더 빠르기 때문에 더 빨리 강하합니다. 그러므로 변수들이 같은 학습 속도를 가진 채로 움직이도록 조정할 필요가 있습니다. 그리고 이것이 최소값에 더 빠르게 수렴하도록 만들죠. 이 현상은 아래의 그래프에서 관찰할 수 있습니다. 왼쪽 그래프는 범위 조정이 되지 않아서 (작은 범위의 변수가 더 느린 학습 속도를 가지기 때문에) 범위 조정이 된 오른쪽의 그래프보다 더 시간이 많이 걸립니다.

주성분 분석(Principal component analysis; PCA)은 최대의 분산을 포착하려함으로 범위 조정이 필요합니다. 만약 범위가 조정되어있지 않다면, 더 큰 범위를 가진 변수가 다른 변수들에게 영향을 미치는 편향이 생길 수 있습니다.

나무 기반 모델(Tree-based models)은 회귀와 분류에 특정한 규칙을 따릅니다. 그러므로, 여기서는 범위 조정이 필요치 않습니다.


Data Normailzation의 방법들

1. Z-score Normalization (Standardization; 표준화)

2. Robust Scalar

3. Min-Max Normalization

4. Mean Normalization

5. Unit Length


Z-score Normalization (Standardization)

Z-score normalization은 각 관측치 x에서 표본 평균을 뺀 후, 그것을 표준 편차로 나눈 x'를 다룹니다. 이러한 x'의 평균과 표준편차는 각각 0과 1이 됩니다. 공식은 다음과 같습니다:

 

Z-score normalization을 이용하는 R 예제 코드
Z-score normalization을 적용한 데이터의 첫 6행

 

위: 경력 햇수의 표준화, 아래: 연봉의 표준화

위의 데이터 분포 설명에 보이듯이, 변수 표준은 0에 근접하고 표준편차는 1이 됩니다. 또한, 최소값과 최대값은 수치 범위를 벗어납니다. 표준화(Standardization)가 범위 제한을 하진 않지만, 표본 평균과 표준편차는 여전히 이상치(outlier)에 영향을 받습니다. 이러한 이상치(outlier)가 있을 때에는, Robust scalar 방식을 쓰는 것이 좋습니다.


Robust Scalar

바로 위에서 언급한 것처럼, Robust Scalar는 이상치(outlier)가 있을 때에 사용할 수 있습니다.

Robust scalar는 원래 값인 x에서 중간값(median)을 뺀 다음, 1사분위와 3사분위 사이의 범위인 사분위수 범위(interquarile range)로 나눠주어 x'로 변환시킵니다. 그 공식은 다음과 같습니다:

Robust scalar를 이용한 R 예제 코드

데이터 분포 설명에서 보이듯이, 중간값(median)은 0이 됩니다. 또한, 평균과 표준편차는 0과 1이 아닙니다. 적용 후 최소값과 최대값 또한 제한되지 않습니다.


Min-Max Normalization

Min-Max normalization은 모든 x 값을 0과 1사이의 값으로 변환하며, 이것은 (0-1) normalization으로 불리기도 합니다. 만약 데이터가 음수 값을 가지면, 수치 범위는 -1에서 1 사이로 지정합니다. Min-max normalization의 공식은 다음과 같습니다:

정해진 0과 1사이가 아니라 특정한 [a, b] 간격으로 범위 조정도 가능합니다. 이러한 방법은 예를 들어 최대값이 255이고 최소값이 0을 가진 픽셀의 이미지 처리에 쓰입니다. 공식은 다음과 같습니다:

Min-max normalization을 이용한 R 예제 코드

위의 분포에서 보는 것과 같이, Min-max normalization을 적용한 수치의 최소값은 0, 최대값은 1이 됩니다. 모든 수치는 이 사이에서만 존재합니다.


Mean Normalization

Mean normalization은 Min-max normalization과 같은 방식으로 수치를 변환시킵니다. 한가지 다른 점은 먼저 모든 값 x에 표본 평균을 뺀다는 점입니다. 공식은 다음과 같습니다:

Mean normalization을 이용한 R 예제 코드

Unit Length Normalization

Unit length normalization은 각각의 x 벡터를 유클리드 길이(Euclidean length)로 나누어서 변환시킵니다.

Unit length normalization을 이용한 R 예제 코드

Min-max normalization과 Unit length는 둘 다 범위가 [0,1]로 제한됩니다. 이것은 만약 데이터에 이상치(outlier)가 있다면 큰 단점입니다. 이상치가 있는 데이터는, Robust scalar 방법을 사용합니다.


Scatter Plot

이제 산점도(scatter plot)을 그려서 normalization 이전과 이후의 데이터를 비교해 보겠습니다. 원래의 데이터를 그리는 코드는 다음과 같습니다:

 

이제 normalization을 적용한 산점도를 그려보겠습니다.

Scatter plot을 그리는 R 예제 코드

 

원래의 데이터와 Normalization을 적용한 데이터의 분포에서 볼 수 있듯이, 연봉과 경력 년수 두 변수 사이의 관계 및 데이터의 분포에는 변화가 없습니다.


Normalization vs. Standardization

가장 널리 쓰이는 normalization 방법은 min-max normalization과 standardization입니다. 이 둘을 비교해보겠습니다.

R 코드 예제

위의 그래프에서 보이듯, min-max normalization은 수치들이 0과 1사이인 반면에 standardization의 수치들은 0-1 범위를 벗어납니다.


Normalization vs. Standardization을 KNN 알고리즘에 적용한다면?

이러한 normalization 방법들을 KNN과 같은 머신러닝 알고리즘에 적용해 보겠습니다.

KNN에 적용한 R 예제 코드

두 방법을 비교하기 위하여 평균 제곱근 오차(root mean square error; RMSE)를 각각 계산해보았습니다. RMSE가 낮을 수록, 모델이 더 잘 맞는다는 의미입니다. 아래의 표에서 보이듯, normalization을 거치지 않은 데이터는 아주 큰 RMSE를 가집니다. 또한, min-max normalization이 KNN 알고리즘에서는 더 나은 결과를 가져오는 것도 알 수 있습니다.

어떠한 Normalization 방법을 선택할 지는 어려운 질문입니다. 하지만, 이 질문에 정답은 없습니다. 아주 많은 경우에, 우리가 어떠한 질문을 던지느냐에 따라서 방법의 선택이 결정될 수 있습니다.


요약 및 정리:

1. 0-255 사이의 픽셀값을 가지는 이미지 처리와 같이 특정한 범위 내로 표준화를 해야한다면 min-max normalization을 사용합니다.

​2. 데이터가 평균을 중심으로 분포하길 원한다면, 그리고 표준편차가 1로 동일하길 원한다면, Z-score standardization을 사용합니다.

​3. 데이터의 분포를 모르고, 데이터가 가우시안 분포(Gaussian distribution)를 따르지 않는다면, min-max normalization을 사용합니다.

​4. 데이터가 가우시안 분포를 따른다면, standardization을 사용합니다.

728x90
반응형
Posted by Gun들지마
반응형

이 글은 Kaggle의 머신러닝 입문 (Intro to Machine Learning) 강의를 번역/정리한 글입니다. 원문은 여기서 찾아보실 수 있습니다.

이전 글은 아래에서 보실 수 있습니다.

파이썬 Pandas로 머신러닝 기초 배워보기 (4/5): https://ruins880.tistory.com/81

 

파이썬 Pandas로 머신러닝 기초 배워보기 (4/5)

이 글은 Kaggle의 머신러닝 입문 (Intro to Machine Learning) 강의를 번역/정리한 글입니다. 원문은 여기​서 찾아보실 수 있습니다. ​이전 글은 아래에서 보실 수 있습니다. 파이썬 Pandas로 머신러닝 기

ruins880.tistory.com


Introduction

Decision tree는 사용하면 어려운 결정을 내려야할 때가 있습니다. 잎사귀가 많은 깊은 tree는 과적합의 문제가 있을 수 있고, 너무 얕은 tree는 예측의 정확도가 아주 떨어집니다. 현대의 가장 복잡한 모델링 기술로도 이러한 과적합(overfitting)과 저적합(underfitting)의 문제를 직면할 수 밖에 없습니다. 하지만 많은 모델링 방법들은 이러한 문제를 해결하기 위해 여러 방법을 사용합니다. 이번에는 Random Forest라는 모델링 기법으로 이것을 어떻게 해결하는지 살펴보겠습니다.

​Random Forest는 많은 tree를 사용하여 그 tree들의 예측값의 평균을 구합니다. 그래서 단 하나의 tree를 사용할 때보다 대체로 더 나은 예측치를 보여주며, 기본 옵션으로도 훨씬 나은 성능을 보입니다. 앞으로 우리가 머신러닝과 모델링을 더 공부하면서, 여러 모델링 방법들을 배울텐데, 많은 경우에 적절한 옵션 및 매개변수를 사용하는 것이 필수입니다.

Example

다음 코드는 이미 몇번 보셨지만, 다시 로딩해보겠습니다. 끝에는 다음 4개의 변수가 나옵니다:

train_X, val_X, train_y, val_y

import pandas as pd
# 데이터를 불러오기
melbourne_file_path = '../input/melbourne-housing-snapshot/melb_data.csv'
melbourne_data = pd.read_csv(melbourne_file_path)
# 값이 없는 열을 제거합니다
melbourne_data = melbourne_data.dropna(axis=0)
# 타겟과 피쳐를 선택합니다
y = melbourne_data.Price
melbourne_features = ['Rooms', 'Bathroom', 'Landsize', 'BuildingArea', 'YearBuilt', 'Lattitude', 'Longtitude']
X = melbourne_data[melbourne_features]
from sklearn.model_selection import train_test_split
# 예측 목표와 변수들을 훈련 데이터와 확인 데이터로 나눕니다
# 나누는 것은 랜덤 숫자 생성기에 기반합니다
# random_state 옵션에 숫자를 지정하면 매번 같은 결과가 나오도록 합니다
train_X, val_X, train_y, val_y = train_test_split(X, y,random_state = 0)

scikit-learn을 사용해서 decision tree를 만든 것처럼 random forest 모델을 만들 수 있습니다. DicisionTreeRegressor 대신에 RandomForestRegressor를 사용해서 말이죠.

Conclusion (결론)

모델을 더 향상시킬 여지는 있겠지만, decision tree에서 나온 에러값인 250,000에 비하면 많은 발전입니다. decision tree의 깊이를 조정하는 등의 옵션으로 모델의 성능을 조절할 수도 있습니다. 하지만 random forest의 가장 큰 장점은 이러한 미세한 조정과정이 없어도 대체로 좋은 성능을 보여준다는 거죠.

이제 직접 Random forest model을 만들어 볼 차례입니다.


Kaggle은 따로 컴퓨터에 설치할 필요없이 웹상에서 파이썬 코드를 작성하고 실행시킬 수 있는 "notebook" 환경을 이용합니다. 예제는 아래의 링크에서 직접해보실 수 있습니다. Kaggle 계정을 생성하시면 더 도움이 될 수 있습니다.

https://www.kaggle.com/code/fork/1259186

 

Kaggle Code

 

www.kaggle.com

이전 예제에서 우리가 작성했던 코드입니다:

Exercieses

데이터사이언스는 항상 이렇게 쉽지많은 않습니다. 하지만 decision tree를 random forest로 바꾸는 건 아주 쉬운 방법이죠.

Step 1: Use a Random Forest

이제까지 모델링에 관해서 배워보았습니다. 정해진 예제와 절차에 따라 모델을 만들어 보았고, 우리는 처음 모델을 만드는 데 있어서 중요한 개념들을 배워보았습니다. 이제 스스로 만들어 볼 차례입니다. 머신러닝 대회는 자신의 아이디어를 시도해보고 스스로 머신러닝 프로젝트에 대해 탐구해 볼 좋은 기회입니다. 다음 링크에서 직접 머신러닝 아이디어를 테스트해보세요:

https://www.kaggle.com/c/home-data-for-ml-course

 

Housing Prices Competition for Kaggle Learn Users

 

www.kaggle.com

 

 

728x90
반응형
Posted by Gun들지마
반응형

이 글은 Kaggle의 머신러닝 입문 (Intro to Machine Learning) 강의를 번역/정리한 글입니다. 원문은 여기서 찾아보실 수 있습니다.

이전 글은 아래에서 보실 수 있습니다.

파이썬 Pandas로 머신러닝 기초 배워보기 (3/5) https://ruins880.tistory.com/80

 

파이썬 Pandas로 머신러닝 기초 배워보기 (3/5)

이 글은 Kaggle의 머신러닝 입문 (Intro to Machine Learning) 강의를 번역/정리한 글입니다. 원문은 여기서 찾아보실 수 있습니다. 이전 글은 아래에서 보실 수 있습니다. 파이썬 Pandas로 머신러닝 기초 배

ruins880.tistory.com


이전 강의에서는 모델을 만들고 그 품질을 평가해보았습니다. 이번에는 과적합(overfitting)과 저적합(underfitting)의 개념에 대해 배워보겠습니다.

Experimenting with Different Models (여러 모델로 실험해보기)

scitkit-learn 문서를 보면 알 수 있듯이 decision tree 모델에도 엄청나게 많은 옵션이 있습니다. 가장 중요한 옵션은 tree의 깊이를 결정하는 것입니다. 강의 시리즈의 맨 처음에서 기억하실 지 모르겠지만, tree의 깊이란 모델에서 예측을 하기 전에 나뭇가지가 몇 번이나 나눠지는 지입니다. 아래는 비교적 '얕은' tree입니다.

 

실제로는, 가지가 맨 위부터 맨 아래까지 10번 나눠져 있는 tree도 흔합니다. tree가 더 깊어질 수록, 제일 끝에 있는 잎에는 적은 수의 집들이 들어가죠. 만약 tree가 한번만 나눠진다면, 우리의 데이터는 절반으로 나눠져 두개의 그룹이 됩니다. 한번 더 나눠진다면, (위의 그림과 같이) 4개의 그룹이 되고요. 이런 식으로 계속 나눠간다면, 10번 나눠지고 나면 2^10 개의 그룹이 생길 것입니다. 이는 1024개의 잎을 의미합니다.

이렇게 여러 번 나누다 보면, 각 잎에는 아주 적은 수의 집들이 들어가게 될 것이고, 예측을 실제와 같이 정확하게 할 수 있을 것입니다. 하지만, 새로운 데이터가 주어졌을 때에는 예측이 아주 부정확해질 수도 있습니다 (각 그룹(잎)의 예측값은 아주 적은 수의 집값에만 기반하기 때문이죠).

이러한 현상을 과적합(overfitting)이라고 부릅니다. 훈련 데이터(training data)에는 모델이 거의 완벽하게 맞지만, 새로운 데이터에는 예측이 아주 부정확하죠.

반면에, 만약 tree를 아주 얕게 만든다면 그룹의 수가 적어서 각가의 집값의 특징이 잘 나타나지 않게 됩니다. 극단적인 예를 들어보면, 만약 tree가 모든 집들을 두 개 혹은 네 개의 그룹으로만 나눈다면, 그룹 안에서는 여전히 다양한 범위의 집값이 존재할 것입니다. 예측치는 실제 집값과는 거리가 멀 것이며, 이것은 훈련 데이터를 사용한 예측에도 동일합니다. 모델이 중요한 특징이나 패턴을 잡아내지 못하고 훈련 데이터에서조차 예측 정확도가 아주 낮다면 이것을 저적합(underfitting)이라고 부릅니다.

우리는 훈련 데이터로부터 생성해 낸 모델로 새로운 데이터 예측의 정확도를 높이고 싶으므로, 이 과적합과 저적합 사이의 알맞은 위치를 찾아내어야 합니다. 아래의 그래프에서, 빨간 선의 가장 낮은 부분을 의미하죠.


Example (예제)

Tree의 깊이를 조절하는 데에는 몇가지 방법이 있습니다. 그중에서 max_leaf_nodes 옵션이 과적합과 저적합을 조절하는 데에 아주 적절한 방법입니다. 더 많은 leaf node를 허락할 수록, 모델은 위의 그래프의 Overfitting 위치에서 Underfitting 쪽으로 이동합니다. 아래의 코드를 이용해서 MAE 점수를 내고 서로 다른 값을 max_leaf_nodes 에 넣어서 비교를 해볼 수 있습니다.

from sklearn.metrics import mean_absolute_error
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 변수에 저장됩니다.

# Data Loading Code Runs At This Point
import pandas as pd
# 데이터를 불러옵니다
melbourne_file_path = '../input/melbourne-housing-snapshot/melb_data.csv'
melbourne_data = pd.read_csv(melbourne_file_path)
# 값이 없는 행을 걸러냅니다
filtered_melbourne_data = melbourne_data.dropna(axis=0)
# 타겟과 feature를 선택합니다
y = filtered_melbourne_data.Price
melbourne_features = ['Rooms', 'Bathroom', 'Landsize', 'BuildingArea', 'YearBuilt', 'Lattitude',
'Longtitude']
X = filtered_melbourne_data[melbourne_features]
from sklearn.model_selection import train_test_split
# 데이터를 training data와 validation data로 나눕니다.
train_X, val_X, train_y, val_y = train_test_split(X, y,random_state = 0)

for 반복문을 이용하여, max_leaf_nodes 값의 변화에 따라 모델의 정확도를 비교해볼 수 있습니다.

위의 결과에서는 500개가 가장 최적의 값입니다.


Conclusion (결론)

모델은 두가지 문제점이 있을 수 있습니다

과적합(Overfitting): 앞으로는 절대 일어나지 않을 잘못된 패턴을 잡아내어서 예측을 부정확하게 만듭니다.

저적합(Underfitting): 관련이 있는 패턴을 잡아내지 못해 전반적인 정확도가 떨어집니다.

이제 직접 코드를 짜보겠습니다.


코드 예제 연습은 notebook 환경을 제공하는 Kaggle에서 직접해보시는 것을 추천합니다. 다음의 링크에서 찾으실 수 있습니다: https://www.kaggle.com/kernels/fork/1259126

 

Kaggle Code

 

www.kaggle.com

이번 예제에서는 더나은 예측을 위해 tree의 크기를 조절해볼텐데, 다음의 코드는 이전에 우리가 직접 만든 모델을 다시 만들어줍니다.

Exercises (예제)

MAE를 계산해주는 get_mae 펑션을 직접짤 수도 있지만, 일단 여기서는 미리 제공하겠습니다.

Step 1: Compare Different Tree Sizes

아래의 값들을 max_leaf_nodes로 실행하는 반복문을 만드세요. 각각의 max_leaf_nodes 값에 대응하는 get_mae 펑션을 호출하세요. 가장 정확한 예측을 하는 모델을 선택하기 위해 max_leaf_nodes 값을 저장하세요.

Step 2: Fit Model Using All Data (모든 데이터를 이용하여 모델을 적합시키기)

이제 가장 알맞은 tree의 크기를 알았으니, 모델을 더욱 정확하게 하기 위해 알아낸 크기와 우리가 가진 모든 데이터를 이용하여 모델의 정확도를 높여봅시다. 즉, validation data를 따로 떼어놓지 않아도 됩니다.

지금까지 모델을 만들어서 그 예측도를 향상시키는 방법을 배워보았습니다. 하지만 우리가 사용한 모델은 현대 머신러닝 기준으로 딱히 정확하지 않은 Decision Tree model 입니다. 다음 단계에서는 우리의 모델을 더욱더 향상시키기 위해 Random Forests 라는 기법을 써보도록 하겠습니다.

다음 글: 파이썬 Pandas로 머신러닝 기초 배워보기 (5/5): https://ruins880.tistory.com/82

 

파이썬 Pandas로 머신러닝 기초 배워보기 (5/5)

이 글은 Kaggle의 머신러닝 입문 (Intro to Machine Learning) 강의를 번역/정리한 글입니다. 원문은 여기서 찾아보실 수 있습니다. 이전 글은 아래에서 보실 수 있습니다. 파이썬 Pandas로 머신러닝 기초 배

ruins880.tistory.com

 

 

728x90
반응형
Posted by Gun들지마
반응형

이 글은 Kaggle의 머신러닝 입문 (Intro to Machine Learning) 강의를 번역/정리한 글입니다. 원문은 여기서 찾아보실 수 있습니다.

이전 글은 아래에서 보실 수 있습니다.

파이썬 Pandas로 머신러닝 기초 배워보기 (2/5): https://ruins880.tistory.com/79

 

파이썬 Pandas로 머신러닝 기초 배워보기 (2/5)

이 글은 Kaggle의 머신러닝 입문 (Intro to Machine Learning) 강의를 번역/정리한 글입니다. 원문은 여기서 찾아보실 수 있습니다. ​이전 글은 아래에서 보실 수 있습니다. 파이썬 Pandas로 머신러닝 기초

ruins880.tistory.com


이전 과제에서는 모델을 직접 만들어 보았습니다. 하지만, 우리가 만든 모델은 얼마나 정확할까요? 이번 시간에는 모델의 적합성 및 정확도를 측정하고 그것을 높이는 방법을 알아보겠습니다.

What is Model Validation (모델 확인이 뭐죠)

우리가 만드는 모델은 전부 평가가 필요합니다. 대부분의 경우에 이 평가의 척도는 모델이 예측하는 결과의 정확성에 달려있죠. 하지만 많은 사람들이 모델의 예측 정확도를 측정할 때에 모델을 만들 때 썼던 기존의 데이터를 이용하버리는 실수를 저지릅니다.

일단, 모델의 품질을 우리가 알아볼 수 있도록 정리해보겠습니다. 우리가 1만개의 집의 실제 가격과 예측된 가격을 비교하게 된다면, 정확한 예측가격과 그렇지 않은 것들이 섞여있을 것입니다. 1만개의 가격을 일일이 확인하는 것은 의미가 없을 것이므로, 우리는 이것을 하나의 수치로 종합할 방법이 필요합니다. 여기에는 여러가지 방법이 있지만, 지금은 절대오차평균(Mean Absolute Error; MAE)이라는 값을 이용하겠습니다. 이는 말 그대로, 각 오차의 절대치의 평균을 구한 값입니다. 각 모델의 오차는 error = actual - predicted 로 구할 수 있습니다. 그 오차들을 모두 양수로 전환해 평균을 낸 값입니다. 일단, MAE를 구하려면 모델이 있어야하니 모델부터 만들어 보겠습니다.

위의 코드로 모델을 만든 후, 절대오차평균은 다음과 같이 구합니다.

The Problem with "In-Sample" Scores ("샘플 내" 값을 사용하는 경우)

우리가 방금 계산한 값은 "샘플 내" 수치라고 부를 수 있습니다. 우리는 하나의 "샘플"을 모델을 만드는 데와 그것을 평가하는 데 둘 다 사용했죠. 하지만 이것은 좋지 않은 습관입니다.

예를 들어, 실제 부동산 시장에서는 현관문의 색깔이 집값에 영향을 미치지 않습니다. 하지만 모델을 만드는 샘플 데이터에서 초록색 문을 가진 집들이 전부 비싸다면, 그 결과 모델은 초록색 문이 있는 집의 가격을 항상 비싸게 예측할 것입니다. 이러한 패턴이 샘플 데이터에서 나왔기 때문에, 샘플 데이터로 모델의 정확도를 측정하면, 그 모델은 정확하게 보일 수 밖에 없습니다. 하지만, 샘플 데이터가 아닌 새로운 데이터를 모델에 대입했을 때에, 실제로 그 모델은 정확하지 않겠죠.

그러무로 우리는 모델의 정확도를 측정할 때에, 샘플 데이터가 아닌 새로운 데이터를 사용해야만 합니다. 이렇게 하기 위한 가장 쉬운 방법은 모델을 만들 때에 몇몇의 데이터를 제외하고, 그 제외된 데이터를 나중에 모델의 정확도를 테스트할 때에 쓰는 것입니다. 이렇게 제외된 데이터를 확인 데이터 (validation data)라고 부릅니다.

Coding It (코딩해보자)

scikit-learn 라이브러리에는 train_test_split 펑션이 있어서 데이터를 두 그룹으로 나눌 수 있습니다. 이 펑션을 이용하여 한 그룹은 모델을 만드는 데에 쓰고, 다른 그룹은 MAE를 계산하는 데 써보겠습니다.

 

위에서 샘플 내 값을 이용한 오차평균이 $434.72 였다면, 아래에 계산한 오차평균은 $261,425이 나왔습니다. 실제로 모델의 오차 평균이 $250,000 이상이라면 한참 문제가 있는 거겠죠. 참고로 데이터 내의 집값 평균은 $1,100,000이었으니, 오차가 집값의 거의 1/4 수준이 되는 것입니다.

다음은 직접 코딩 예제를 실행해 보겠습니다.


Kaggle은 따로 컴퓨터에 설치할 필요없이 웹상에서 파이썬 코드를 작성하고 실행시킬 수 있는 "notebook" 환경을 이용합니다. notebook 환경이 처음이신 분은 다음의 짧은 동영상을 보시면 됩니다: https://www.youtube.com/watch?v=4C2qMnaIKL4

지난 예제에서는 모델을 직접 만들어 보았죠. 거기에 이어서 하기 위해, 아래의 예제를 실행시켜 주세요.

Exercises

이번 예제에서는 지난 번에 직접 만든 모델의 정확도를 테스트해 보겠습니다. 예제는 아래의 링크에서 직접해보실 수 있습니다. Kaggle 계정을 생성하시면 더 도움이 될 수 있습니다. https://www.kaggle.com/kernels/fork/1259097

 

Kaggle Code

 

www.kaggle.com

Step 1: Split Your Data (데이터 반으로 나누기)

train_test_split 펑션을 사용해서 데이터를 나누세요.

Step 2: Specify and Fit the Model (모델을 지정하고 피팅하기)

DecisionTreeRegressor 모델을 만들고 알맞은 데이터를 피팅하세요. random_state는 1로 지정해주세요.

Step 3: Make Predictions with Validation Data (확인 데이터로 예측하기)

이제 실제 값과 예측 값을 살펴보겠습니다.

출력값의 첫줄은 모델이 예측한 값이며, 둘째 줄은 실제 집값입니다. 저 위에서 샘플 내 값으로 예측할 때랑 결과가 많이 달라졌나요? 이것은 아주 중요한 개념입니다.

Step 4: Calculate the Mean Absolute Error in Validation Data (절대오차평균 계산하기)

계산한 값이 괜찮은가요? 절대적으로 어떤 수치가 좋은 수치라는 것은 정해진 것이 아닙니다. 하지만 다음 단계를 계속해 나가면서 우리는 저 값을 줄일 것입니다.

이어지는 글: 파이썬 Pandas로 머신러닝 기초 배워보기 (4/5): https://ruins880.tistory.com/81

 

파이썬 Pandas로 머신러닝 기초 배워보기 (4/5)

이 글은 Kaggle의 머신러닝 입문 (Intro to Machine Learning) 강의를 번역/정리한 글입니다. 원문은 여기​서 찾아보실 수 있습니다. ​이전 글은 아래에서 보실 수 있습니다. 파이썬 Pandas로 머신러닝 기

ruins880.tistory.com

 

728x90
반응형
Posted by Gun들지마
반응형

이 글은 Kaggle의 머신러닝 입문 (Intro to Machine Learning) 강의를 번역/정리한 글입니다. 원문은 여기서 찾아보실 수 있습니다.

​이전 글은 아래에서 보실 수 있습니다.

파이썬 Pandas로 머신러닝 기초 배워보기 (1/5): https://ruins880.tistory.com/78

 

파이썬 Pandas로 머신러닝 기초 배워보기 (1/5)

이 글은 Kaggle의 머신러닝 입문 (Intro to Machine Learning) 강의를 번역/정리한 글입니다. 원문은 여기서 찾아보실 수 있습니다. Introduction 먼저, 머신러닝에서 모델이 어떻게 사용되는지 부터 시작하겠

ruins880.tistory.com


Selecting Data for Modeling

지금 우리가 가진 데이터는 너무 변수가 많습니다. 이렇게 많은 양의 데이터에서 이해가 가능한 정보를 빼내려면 어떻게 해야할까요? 일단, 느낌으로 변수를 몇 개 골라보겠습니다. 나중에는 통계적 방법으로 변수를 선택하는 것을 배우게 될 것입니다.

우리 데이터에서 변수를, 혹은 열을 고르려면 모든 열(column)들을 봐야겠죠. 다음의 코드로 DataFrame에서 모든 column을 볼 수 있습니다.

import pandas as pd
melbourne_file_path = '../input/melbourne-housing-snapshot/melb_data.csv'
melbourne_data = pd.read_csv(melbourne_file_path)
melbourne_data.columns
# 멜버른 데이터에는 비어있는 값들이 있습니다 (어떤 집들에는 몇몇 변수들이 기록이 되어있지 않죠).
# 나중에 이러한 빠진 값들을 다루는 방법을 배울 것입니다.
# 아이오와 데이터에서 우리가 사용하는 열에는 빠진 값들이 없습니다.
# 그러므로 지금은 가장 간단하게, 값이 없는 집들을 애초에 빼버리겠습니다.
# 지금은 너무 신경쓰지 않아도 되지만, 코드는 다음과 같습니다:
# dropna 명령어는 비어있는 줄을 빼버립니다 (na는 "not available"이라고 생각하세요)
melbourne_data = melbourne_data.dropna(axis=0)

데이터의 일부분을 선택하는 데에는 여러가지 방법이 있습니다. Pandas 강의에 더 자세히 나와있지만, 지금은 두가지 방법을 사용하겠습니다.

1. Dot notation: "Prediction target"을 선택하는 데에 이용

DataFrame에서는 dot-notation을 이용하여 변수를 선택할 수 있습니다. 선택된 하나의 열은 Series 형태로 저장됩니다. 우리가 예측하고 싶은 변수인 prediction target을 이 방법을 사용하여 선택하고 y 변수에 저장해보겠습니다. 집값을 저장하는 코드는 다음과 같습니다:

y = melbourne_data.Price

2. Selecting with a column list: "feature"를 선택하는 데에 이용

모델에 입력하여서 나중에 예측하는 데에 사용되는 변수열들은 "features"라고 부릅니다. 우리 예제의 경우에는 이러한 features를 사용하여 prediction target인 집값을 결정하는 데 쓸 것입니다. 종종 우리가 가진 모든 변수들을 예측모델에 쓰기도 하지만, 어떤 경우에는 몇몇의 변수들만 선택하는 것이 더 나을 때도 있습니다.

지금은 몇 개의 중요한 feature들만 선택해 보겠습니다. 여러개의 feature를 선택하는 방법은 대괄호를 쓰는 것입니다. 각각의 feature 이름은 아래의 예제처럼 큰따옴표를 이용하여야 합니다.

melbourne_features = ['Rooms', 'Bathroom', 'Landsize', 'Lattitude', 'Longtitude']
X = melbourne_data[melbourne_features]

X에 저장된 데이터를 describe와 head 명령어로 살펴보겠습니다.

X.describe()
X.head()

이렇게 시각적으로 데이터를 살펴보는 과정은 아주 중요합니다. 데이터에서 어떤 것을 발견할 지 모르거든요.


Building Your Model (모델 만들어 보기)

모델을 만들기 위해 scikit-learn 라이브러리를 사용하겠습니다. 예제 코드에 나와있듯이, 실제 코딩에서는 sklearn으로 씁니다. Scikit-learn 라이브러리는 DataFrame 유형의 자료를 가지고 모델을 만드는 데에 가장 널리 쓰이는 라이브러리 입니다. 모델을 만들고 이용하는 과정은 다음과 같습니다:

​* Define (정의하기): 어떤 유형의 모델을 만들 것인가요? 처음에 배운 Decision Tree, 혹은 다른 새로운 모델?

* Fit (적합시키기): 제공된 데이터에서 패턴을 찾습니다. 가장 핵심인 단계입니다.

* Predict (예측하기): 말 그대롭니다.

* Evaluate (평가하기): 모델이 예측한 결과가 얼마나 정확한지 알아봅니다.

다음은 scikit-learn 라이브러리를 이용하여 모델을 정의하고 우리의 데이터에 적합시키는 예제 코드입니다.

from sklearn.tree import DecisionTreeRegressor
# 모델을 정의합니다. 매번 똑같은 결과를 얻기 위해 random_state에 숫자를 지정합니다.
melbourne_model = DecisionTreeRegressor(random_state=1)
# 모델을 데이터에 적합시킵니다.
melbourne_model.fit(X, y)

머신러닝에 쓰이는 많은 모델들은 그 적합과정에서 어느정도 무작위성(randomness)을 포함합니다. random_state로 숫자를 지정하면, 실행할 때마다 같은 결과를 가지도록 해줍니다. 이것은 좋은 습관이죠. 하지만 어떤 수를 지정하든 모델 자체에는 의미있는 변화를 주지는 않습니다.

실제로는, 지금 이미 집값이 나와있는 집 말고, 앞으로 매물이 나오는 집의 집값을 예측하는 것이 우리의 목표입니다. 하지만 지금은, 우리가 가지고 있는 데이터에서 집값이 어떻게 계산되는지 처음 몇 줄의 결과를 보겠습니다.

print("Making predictions for the following 5 houses:")
print(X.head())
print("The predictions are")
print(melbourne_model.predict(X.head()))

다음은 직접 예제를 실행해 보겠습니다.


Kaggle은 따로 컴퓨터에 설치할 필요없이 웹상에서 파이썬 코드를 작성하고 실행시킬 수 있는 "notebook" 환경을 이용합니다. notebook 환경이 처음이신 분은 다음의 짧은 동영상을 보시면 됩니다: https://www.youtube.com/watch?v=4C2qMnaIKL4

지난 예제에서, 다음과 같이 데이터를 불러오고 확인하였습니다. 예제를 이어서 하기 위해 다음 코드를 실행시켜주세요.

Exercises

이번 예제는 직접 간단한 모델을 만들어 보겠습니다. 예제는 아래의 링크에서 직접해보실 수 있습니다. Kaggle 계정을 생성하시면 더 도움이 될 수 있습니다.

https://www.kaggle.com/kernels/fork/1404276

 

Step 1: Specify Prediction Target (예측할 타겟을 지정하기)

Step 2: Create X (X 변수 생성하기)

이제 이름이 X인 DataFrame을 생성하여 예측에 필요한 feature들을 저장할 것입니다.

원래의 데이터에서 일부분만 저장할 것이므로, 일단 X에 들어갈 열 이름들을 리스트로 만들어 보겠습니다. 다음의 변수 이름들을 사용해서 리스트를 만드세요.

* LotArea * YearBuilt * 1stFlrSF * 2ndFlrSF * FullBath * BedroomAbvGr * TotRmsAbvGrd

리스트를 만든 다음, 그것을 사용하여 DataFrame을 만들어 보세요.

Review Data(데이터 확인하기)

모델을 만들기 전, X를 출력하여 괜찮아 보이는지 확인해 봅시다.

Step 3: Specify and Fit Model (모델을 지정하고 적합화 시키기)

DecisionTreeRegressor를 생성하여 iowa_model을 저장하세요. sklearn 라이브러리를 불러오는 것도 잊지마세요. 그런 다음, X에 있는 데이터를 가지고, y에 저장한 모델을 적합화시키세요.

Step 4: Make Predictions (예측하기)

predict 명령어로 X를 사용하여 예측을 해봅시다. 결과는 predictions 변수에 저장하세요.

Think About Your Results (결과에 대하여 생각해보기)

head 명령으를 사용해 예측한 결과와 실제 집값을 비교해봅시다.

728x90
반응형
Posted by Gun들지마