반응형

오늘은 Day9 차례다. 
오늘 해볼 내용은, Machine_learning model을 만들고, Model Validation(모델검증)에 관한 것이다.

Today's Assignment - day 9

오늘도 Keep going!

Selecting Data for Modeling

Data set에 너무 많은 변수가 있어서 곤란했을 수 있다.
이 엄청난 양의 데이터를 이해할 수 있는 수준으로 줄일 수 있는 방법은 없을까?

우리의 직관력으로 몇 가지 변수부터 골로보자. 이후 과정에서는 변수의 우선순위를 자동으로 지정하는 통계기법(기술)을 보여줄 것이다.

변수(variables)/열(columns) 을 선택하려면 데이터 셋의 모든 column목록을 확인해야 한다. 
이 작업은 DataFrame의 columns 속성으로 수행된다. (아래 코드의 맨 아래줄)

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

# 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)

데이터의 부분 집합을 선택하는 방법은 여러거 가지가 있다. Pandas 코스에서는 이러한 사항을 좀 더 심도 있게 다루지만, 지금은 두 가지 접근 방식에 초점을 맞출 것이다.

  1. "prediction target"(예측대상)을 선택하는 데 사용하는 dot-notation(점 표기법)
  2. "feature" 을 선택하는데 사용하는 column list로 선택

 

Selecting The Prediction Target

점 표기법으로 변수를 꺼낼 수 있다. 이 단일 열은 하나의 데이터 열만 있는 DataFrame과  대체로 유사한 Series에 저장된다. 
점 표기법을 사용하여 예측할 열을 선택한다. 이를 prediction target(예측 대상)이라고 한다. 
일반적으로 예측 대상을 y라고 한다. 그래서 Melbourne data 에있는 집값을 저장하는데 필요한 코드는 아래와 같다.

y = melbourne_data.Price

 

Choosing "Features"

모델에 입력되고 나중에 예측하는데 사용되는 column을 "feature"라고 한다. 
우리 모델의 경우, 주택 가격을 결정하는데 사용되는 열이다.
때로는 대상을 제외한 모든 열을 feature로  사용한다. 다른 경우에는 더 적은 feature 을 사용하는 것이 좋을 수도 있다.

지금은 몇가지 feature으로만 모델을 제작하겠다. 
나중에 다양한 feature로 제작된 모델을 반복하고 비교하는 방법에 대해 알아보겠다.

대괄호 안에 column 이름 리스트를 제공하여 여러 feature를 선택한다.
해당 리스트의 각 항목은 따옴표가 있는 문자열이어야 한다.

다음은 예이다.

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

관례적으로 이 데이터를 X라고 한다.

X = melbourne_data[melbourne_features]

상위 몇개의 rows를 표시하는 describe 메서드와 head메서드를 사용하여 주택 가격을 예측하는데 사용할 데이터를 빠르게 검토해 보겠다.

X.describe()

X.head()

이러한 명령을 사용해서 데이터를 시각적으로 확인하는 것은 데이터 사이언티스트의 업무에서 중요한 부분이다.
추가 검사가 필요한 데이터셋에서 종종 놀라운 발견을 할 수 있다.

Building Your Model

scikit-learn 라이브러리를 사용하여 모델을 생성한다. 
코딩을 할 때 이 라이브러리는 샘플 코드에서 볼 수 있듯이 sklern으로 작성된다.
scikit-lean은 일반적으로 DataFrame에 저장되는 데이터 유형을 모델링하는데에 가장 널리 사용되는 라이브러리이다.

모델을 구축하고 사용하는 단계는 다음과 같다.

  • Define(정의): 어떤 유형의 모델이 될까? 의사결정나무? 다른 유형의 모델? 모델 유형의 일부 다른 일부 매개변수도 지정된다.
  • Fit: 제공된 데이터에서 패턴을 캡쳐한다. 이것이 모델링의 핵심이다.
  • Predict: 단어의 뜻 그대로 예측 하는 것.
  • Evaluate: 모델의 예측이 얼마나 정확한지 확인한다.

다음은 scikit-learn으로 의사결정 나무 모델을 정의하고 feature 및 target variable를 사용해서 fit(적합) 시키는 예이다.

from sklearn.tree import DecisionTreeRegressor

# 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)

많은 machine_learning 모델은 모델 학습에서 어느정도 랜덤성을 허용한다.
random_state에 대한 숫자를 지정하며 각 run에서 동일한 결과를 얻을 수 있다.
이것은 good practice로 간주된다.
만약, 아무 숫자나 사용하면 모델 성능은 너가 어떤 값을 선택하느냐에 따라 의미있게 달라지지 않는다. 

이제 예측에 사용할 수 있는 적합모델을 가지게 되었다.

실제로, 우리가 이미 가격을 책정한 주택이 아니라, 시장에 나올 새 주택에 대한 예측을 하고 싶을 것이다.
그러나 우리는 예측 기능이 어떻게 작동하는지 보기 위해 훈련 데이터의 처음 몇 행에 대해 예측을 수행할 것이다.

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

관련된 exercise를 수행해보자. 
위의 내용과 관련된 exercise를 정리한 코드를 공유한다!https://github.com/mgkim-developer/30-Days-of-ML-with-Kaggle/blob/main/30-days-of-ml-day-9-decisiontreeregressor.ipynb

 

GitHub - mgkim-developer/30-Days-of-ML-with-Kaggle: 30 Days of ML with Kaggle

30 Days of ML with Kaggle. Contribute to mgkim-developer/30-Days-of-ML-with-Kaggle development by creating an account on GitHub.

github.com


이번에는 모델 검증을 사용하여 모델의 품질을 측정하는 방법에 대해 배운다.
모델 품질을 측정하는 것은 모델을 반복적으로 개선하는 데 있어 핵심이다.

What is Model Validation

모델을 만들면, 대부분 모델을 평가해야한다.
대부분의 애플리케이션에서 모델 품질의 관련 척도는 예측 정확도 이다.  
다시말해서, 모델의 예측이 실제와 얼마나 가까운지가 모델 품질의 중요한 척도가 된다.

많은 사람들이 예측 정확도(predictive accuracy)를 측정할 때 큰 실수를 한다.
이들은 train_data로 예측을 하고 이러한 예측을 train_data의 target_value와 비교한다.
이 접근 방식의 문제와 해결 방법을 알아보자.

먼저 모델 품질을 이해할 수 있는 방식으로 요약해야 한다.
1만채의 주택에 대한 주택의 예상 가치와 실제 주탁의 가치를 비교하면 좋은 예측과 나쁜 예측이 혼합되어 있음을 알 수 있다. 1만개의 예측값과 실제값 리스트를 살펴보는 것은 무의미 하다. 이것을 하나의 측정지표로 요약해야 한다.

모델의 품질을 요약하기 위한 많은 메트릭이 있지만 Mean Absolute Error(MAE)라고 하는 것 부터 시작해보자.
마지막 단어인 error부터 시작해서 이 측정항목을 분석해보겠다.

각주택에 대한 예측 오차는 다음과 같다.

error=actual−predicted

그러니까, 만약 실제 집값이 15만 달러인데, 10만달러가 될 것이라고 예측했다면,  오류는 5만달러이다.

MAE메트릭을 사용하여 각 오류의 절대값을 취한다. 이렇게 하면 각  오류가 양수로 변환된다.
그런 다음 오류값의 절대값들에 평균을 취한다.
이것이 모델 품질에 대한 측정치이다. 쉽게 한문장으로 말하면, 다음과 같다.

On average, our predictions are off by about X.

"평균적으로 우리의 예측은 약 X만큼 빗나간다." 라고 말할 수 있다.

MAE를 계산하기 위해서는 우선 모델이 필요하다.
예제 모델을 보자.

# Data Loading Code Hidden Here
import pandas as pd

# Load data
melbourne_file_path = '../input/melbourne-housing-snapshot/melb_data.csv'
melbourne_data = pd.read_csv(melbourne_file_path) 
# Filter rows with missing price values
filtered_melbourne_data = melbourne_data.dropna(axis=0)
# Choose target and features
y = filtered_melbourne_data.Price
melbourne_features = ['Rooms', 'Bathroom', 'Landsize', 'BuildingArea', 
                        'YearBuilt', 'Lattitude', 'Longtitude']
X = filtered_melbourne_data[melbourne_features]

from sklearn.tree import DecisionTreeRegressor
# Define model
melbourne_model = DecisionTreeRegressor()
# Fit model
melbourne_model.fit(X, y)

모델을 만들고 나면 오차 절댓값의 평균을 계산하는 방법은 다음과 같다.

from sklearn.metrics import mean_absolute_error

predicted_home_prices = melbourne_model.predict(X)
mean_absolute_error(y, predicted_home_prices)

 

The Problem with "In-Sample" Scores

방금 계산한 측정값을 "표본 내" 점수 라고 할 수 있다. 우리는 모델을 구축하고 평가하기 위해 주택의 단일 "sample"을 사용했다. 이러한 방법이 좋지 않은 이유는 다음과 같다.

대형 부동산 시장에서 문의 색상은 집값과 관련이 없다고 상상해 보자.
그러나 모델을 구축하는데 사용한 data sample에는 녹색문이 있는 모든 집이 매우 비쌋다.
모델의 역할은 주택 가격을 예측하는 패턴을 찾는 것이므로 이 패턴을 확인하고 항상 녹색문이 있는 주택의 높은 가격을 예측한다.

이 패턴은 train_data에서 파생되었기 때문에 모델은 test_data에서 정확하게 나타난다.

그러나 모델이 새 데이터를 볼 때 이 패턴이 유지되지 않으면 실제로 사용할 때 모델이 매우 부정확해 진다.

모델의 실질적인 가치는 새로운 데이터에 대한 예측에서 나오므로 모델을 구축하는 데 사용되지 않은 데이터에 대한 성능을 측정한다. 이를 수행하는 가장 간단한 방법은 모델 구축 프로세스에서 일부 데이터를 제외시킨 다음에,  제외시킨 데이터를 사용하여 이전에 본 적이 없는 데이터에 대한 모델의 정확도를 테스트 하는 것이다. 
이 데이터를 "validation data"라고 한다.

Coding It

scikit-learn 라이브러리에서는 데이터를 두 부분으로 나누는 train_test_split 함수가 있다.
해당 데이터 중 일부를 모델에 fit(적합)하도록 train_data로 사용하고 다른 데이터를 validation_data로 사용하여 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))

Wow!

표본 내 데이터의 오차의 절댓값 평균은 약 500달러였다. 샘플에서 벗어난 금액은 25만 달러가 넘는다.

이것이 거의 정확하게 예측을 하는 모델과 대부분의 실제적인 용도로 사용할 수 없는 모델의 차이이다.
참고로 validation_data의 평균 주택 가치는 110만 달러이다. 
따라서 새 데이터의 오류는 평균 주택 가치의 약 4분의 1이다.

더 나은 기능이나 다른 모델 유형을 찾기 위한 실험과 같이 이 모델을 개선할 수 있는 여러 가지 방법이 있다.
다음시간에 이어서 알아보도록 하겠다.

오늘 공부한 내용에 대한 exercise를 정리한 코드를 공유한다!
https://github.com/mgkim-developer/30-Days-of-ML-with-Kaggle/blob/main/30-days-of-ml-day-9-model-validation.ipynb

 

GitHub - mgkim-developer/30-Days-of-ML-with-Kaggle: 30 Days of ML with Kaggle

30 Days of ML with Kaggle. Contribute to mgkim-developer/30-Days-of-ML-with-Kaggle development by creating an account on GitHub.

github.com






반응형