반응형

이 글은 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) 강의를 번역/정리한 글입니다. 원문은 여기서 찾아보실 수 있습니다.


Introduction

먼저, 머신러닝에서 모델이 어떻게 사용되는지 부터 시작하겠습니다. 만약 당신이 통계 모델링이나 머신러닝을 공부한 적이 있다면, 처음에는 너무 쉬울 수도 있습니다.

이 강의에서는 다음과 같은 상황에서 모델링을 어떻게 하는지를 배워볼 것 입니다.:

당신의 사촌형은 부동산에 투자해서 많은 돈을 벌었습니다. 그는 당신이 데이터사이언스를 공부하는 것을 알고 사업제안을 하나 했습니다. 사업에 필요한 자본은 사촌형이 제공하고, 당신은 각각의 집이 얼마나 가치가 있는지 결정하는 모델을 만들어야 합니다. 당신은 사촌형에게 그동안은 어떻게 집의 가치를 정했냐고 물어봤지만, 사촌형은 그냥 감으로 결정했다고 합니다. 하지만 사촌형에게 더 자세히 물어보니, 사촌형은 과거에 자신이 본 집값들에 어떠한 패턴이 있고, 그 패턴을 이용해 새로운 주택의 가격을 결정하고 있었습니다.

머신러닝도 똑같은 방법으로 작동합니다. 먼저 Decision Tree라는 모델링 기법을 사용해 보겠습니다. 더 정확한 결과를 보여주는 복잡한 모델들이 있긴하지만, Decision tree는 이해하기 쉽고, 몇몇 다른 좋은 모델의 기반이 되기도 합니다.

​가장 간단한 Decision tree를 한번 보겠습니다.

위 모델은 집들을 침실이 두개 이상인지 아닌지의 두가지만으로 분류합니다. 여기서 결정된 가격 ($178000, $188000)은 그 분류항목에 속했던 모든 집들의 평균 가격으로 결정했습니다. 데이터를 이용해 집들을 두가지의 그룹으로 나누고, 그 다음 각각의 그룹에서 예상 가격을 결정합니다. 이렇게 데이터로부터 패턴을 잡아내는 것을 fitting 혹은 training이라고 합니다. 그리고 모델을 결정하기 위해 사용한 데이터는 training data라고 부릅니다. 모델이 어떻게 결정되는 지에 관한 자세한 사항들은 추후에 더 알아보기로 하고, 이제 우리는 새로운 데이터들을 이용해 다른 집들의 가격을 예측할 수 있습니다.

Improving the decision tree

다음 중 어느 Decision tree가 더 좋은 결과를 예측할 수 있을까요?

왼쪽의 Decision tree가 아마 더 말이 될 것입니다. 침실이 더 많은 집이 대체로 가격이 더 높기 때문이죠. 하지만 이 모델은 치명적인 단점이 있습니다. 그것은 침실 갯수 이외에 집값에 영향을 미치는 요인, 즉 화장실 갯수, 집 평수, 위치 등을 전혀 고려하지 않았기 때문입니다.

각 주택의 특징을 파악하여 Decision tree의 길을 따라가다보면 집값을 예측할 수 있습니다. 예측한 집의 가격은 트리의 가장 바닥에 있고, 예측을 가능하게 해주는 그 부분을 leaf라고 부릅니다.

다음은 실제 데이터를 관찰해 보겠습니다.


Using Pandas to Get Familiar With Your Data

(판다스를 이용하여 데이터에 익숙해지기)

모든 머신러닝 프로젝트의 첫 단계는 데이터에 익숙해지는 거십니다. 우리는 Pandas 라이브러리를 이용해보겠습니다. Pandas는 데이터 과학자들이 데이터를 조사하고 처리하는 데에 쓰는 도구입니다. 이 라이브러리를 다음과 같이 불러올 수 있습니다.

import pandas as pd

Pandas 라이브러리에서 가장 중요한 부분은 DataFrame입니다. 이 DataFrame에는 우리가 표로 알고있는 데이터를 저장할 수 있습니다. 엑셀의 시트나 SQL의 테이블과 비슷합니다. Pandas는 이러한 유형의 데이터로 우리가 원하는 대부분의 작업을 가능하게 만들어 줍니다. 예를 들어서 호주 멜버른의 주택 가격에 관한 데이터를 보겠습니다.

데이터를 읽어들여서 그 내용을 출력하는 명령어는 다음과 같습니다.

# 사용의 편의를 위해, 읽어들일 파일의 경로를 변수에 저장합니다.
melbourne_file_path = '../input/melbourne-housing-snapshot/melb_data.csv'
# 데이터를 읽어들여 melbourne_data 라는 변수에 DataFrame 형식으로 저장합니다.
melbourne_data = pd.read_csv(melbourne_file_path)
# 데이터의 개요를 출력합니다.
melbourne_data.describe()
 

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


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

https://www.youtube.com/watch?v=4C2qMnaIKL4


 

Exercise: Explore Your Data

이번 예제는 데이터를 DataFrame 형식으로 불러들여, 우리가 어떤한 데이터를 가지고 있는지 살펴보는 것입니다. 예제는 아래의 링크에서 직접해보실 수 있습니다. Kaggle 계정을 생성하시면 더 도움이 될 수 있습니다.

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

 

Kaggle Code

 

www.kaggle.com

STEP 1: 데이터 불러오기

STEP 2: 데이터 살펴보기

생각해 볼 점

예제에서 살펴봤듯이, 우리 데이터에서 가장 최근에 지은 집은 2010년에 지어졌습니다. 여기에는 두가지 가능성이 있습니다.

1. 2010년 이후로 새 집을 전혀 짓지 않았다.

2. 데이터가 작성된 일시가 아주 예전이라, 최근의 데이터는 반영이 되어있지 않다.

만약 그 이유가 1번이라면, 우리는 이 데이터를 신뢰할 수 있을까요? 만약 이유가 2번이라면 어떨까요? 데이터를 좀더 자세히 들여다보면 이유가 1번인지 2번인지 알 수 있을까요?

다음은 머신러닝 모델을 직접 만들어보겠습니다.

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

 

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

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

ruins880.tistory.com

 

728x90
반응형
Posted by Gun들지마