Related to: Deep Learning

Kaggle - Intro to Machine Learning

Introduction

기계 학습 모델의 작동 방식과 사용 방법에 대한 개요부터 시작하겠습니다. 이전에 통계 모델링이나 머신 러닝을 해본 적이 있다면 기본적으로 느껴질 수 있습니다. 걱정하지 마십시오. 곧 강력한 모델을 구축할 것입니다.

이 과정에서는 다음 시나리오를 진행하면서 모델을 구축하게 됩니다.

당신의 사촌은 부동산 투기로 수백만 달러를 벌었습니다. 데이터 과학에 대한 귀하의 관심 때문에 그는 귀하와 비즈니스 파트너가 되겠다는 제안을 받았습니다. 그는 돈을 공급할 것이고 당신은 다양한 주택의 가치를 예측하는 모델을 제공할 것입니다.

당신은 당신의 사촌에게 그가 과거에 부동산 가치를 어떻게 예측했는지 물었고 그는 단지 직감일 뿐이라고 말했습니다. 그러나 더 많은 질문은 그가 과거에 본 주택에서 가격 패턴을 식별했으며 이러한 패턴을 사용하여 그가 고려 중인 새 주택에 대한 예측을 한다는 것을 보여줍니다.

기계 학습은 동일한 방식으로 작동합니다. 의사 결정 트리라는 모델로 시작하겠습니다. 더 정확한 예측을 제공하는 더 멋진 모델이 있습니다. 그러나 의사 결정 트리는 이해하기 쉽고 데이터 과학에서 일부 최고의 모델을 위한 기본 빌딩 블록입니다.

단순화를 위해 가능한 가장 간단한 의사 결정 트리부터 시작하겠습니다.

주택을 두 가지 범주로만 나눕니다. 고려 중인 모든 주택의 예상 가격은 같은 범주에 있는 주택의 과거 평균 가격입니다.

우리는 데이터를 사용하여 주택을 두 그룹으로 나누는 방법을 결정한 다음 다시 각 그룹의 예상 가격을 결정합니다. 데이터에서 패턴을 캡처하는 이 단계를 피팅 또는 훈련 모델이라고 합니다. 모델을 적합하는 데 사용되는 데이터를 학습 데이터라고 합니다.

모델이 어떻게 적합했는지에 대한 세부 사항(예: 데이터 분할 방법)은 나중에 저장하기 위해 충분히 복잡합니다. 모델이 적합해지면 새로운 데이터에 적용하여 추가 주택의 예측 가격을 산출할 수 있습니다.

Improving the Decision Tree

다음 두 의사결정 트리 중 어느 것이 부동산 교육 데이터를 피팅한 결과일 가능성이 더 높습니까?

왼쪽의 결정 트리(결정 트리 1)는 침실이 더 많은 주택이 침실이 더 적은 주택보다 더 높은 가격에 판매되는 경향이 있다는 현실을 포착하기 때문에 아마도 더 의미가 있을 것입니다. 이 모델의 가장 큰 단점은 욕실 수, 부지 크기, 위치 등과 같이 주택 가격에 영향을 미치는 대부분의 요소를 포착하지 못한다는 것입니다.

더 많은 “분할”이 있는 트리를 사용하여 더 많은 요인을 캡처할 수 있습니다. 이를 “더 깊은” 트리라고 합니다. 각 주택 부지의 전체 크기도 고려하는 의사 결정 트리는 다음과 같습니다.

의사 결정 트리를 추적하고 항상 해당 주택의 특성에 해당하는 경로를 선택하여 주택 가격을 예측합니다. 집의 예상 가격은 트리 맨 아래에 있습니다. 하단에서 예측을 수행하는 지점을 리프라고 합니다.

리프의 분할 및 값은 데이터에 의해 결정되므로 작업할 데이터를 확인해야 합니다.

Using Pandas to Get Familiar With Your Data

기계 학습 프로젝트의 첫 번째 단계는 데이터에 익숙해지는 것입니다. 이를 위해 Pandas 라이브러리를 사용합니다. Pandas는 데이터 과학자가 데이터를 탐색하고 조작하는 데 사용하는 기본 도구입니다. 대부분의 사람들은 코드에서 팬더를 pd로 축약합니다. 우리는 명령으로 이것을합니다.

import pandas as pd

Pandas 라이브러리의 가장 중요한 부분은 DataFrame입니다. DataFrame은 테이블로 생각할 수 있는 데이터 유형을 보유합니다. 이는 Excel의 시트나 SQL 데이터베이스의 테이블과 비슷합니다.

Pandas에는 이러한 유형의 데이터로 수행하려는 대부분의 작업에 대한 강력한 방법이 있습니다.

예를 들어 호주 멜버른의 주택 가격에 대한 데이터를 살펴보겠습니다. 실습에서는 아이오와의 주택 가격이 있는 새 데이터 세트에 동일한 프로세스를 적용합니다.

예제(멜버른) 데이터는 **../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()

Out[2]:

RoomsPriceDistancePostcodeBedroom2BathroomCarLandsizeBuildingAreaYearBuiltLattitudeLongtitudePropertycount
count13580.0000001.358000e+0413580.00000013580.00000013580.00000013580.00000013518.00000013580.0000007130.0000008205.00000013580.00000013580.00000013580.000000
mean2.9379971.075684e+0610.1377763105.3019152.9147281.5342421.610075558.416127151.9676501964.684217-37.809203144.9952167454.417378
std0.9557486.393107e+055.86872590.6769640.9659210.6917120.9626343990.669241541.01453837.2737620.0792600.1039164378.581772
min1.0000008.500000e+040.0000003000.0000000.0000000.0000000.0000000.0000000.0000001196.000000-38.182550144.431810249.000000
25%2.0000006.500000e+056.1000003044.0000002.0000001.0000001.000000177.00000093.0000001940.000000-37.856822144.9296004380.000000
50%3.0000009.030000e+059.2000003084.0000003.0000001.0000002.000000440.000000126.0000001970.000000-37.802355145.0001006555.000000
75%3.0000001.330000e+0613.0000003148.0000003.0000002.0000002.000000651.000000174.0000001999.000000-37.756400145.05830510331.000000
max10.0000009.000000e+0648.1000003977.00000020.0000008.00000010.000000433014.00000044515.0000002018.000000-37.408530145.52635021650.000000

Interpreting Data Description

결과에는 원본 데이터 세트의 각 열에 대해 8개의 숫자가 표시됩니다. 첫 번째 숫자인 개수는 누락되지 않은 값이 있는 행 수를 보여줍니다.

누락된 값은 여러 가지 이유로 발생합니다. 예를 들어 침실이 1개인 집을 측량할 때 침실 2의 크기는 수집되지 않습니다. 누락된 데이터 주제로 다시 돌아오겠습니다.

두 번째 값은 평균인 평균입니다. 그 아래 std는 값이 수치적으로 얼마나 퍼져 있는지를 측정하는 표준 편차입니다.

min, 25%, 50%, 75%max 값을 해석하려면 각 열을 최저값에서 최고값으로 정렬한다고 상상해 보세요. 첫 번째(가장 작은) 값은 최소값입니다. 목록을 4분의 1로 이동하면 값의 25%보다 크고 값의 75%보다 작은 숫자를 찾을 수 있습니다. 이것이 25% 값(‘25번째 백분위수’라고 발음함)입니다. 50번째 및 75번째 백분위수는 유사하게 정의되며 최대는 가장 큰 숫자입니다.

(Exercise: Explore Your Data)

Selecting Data for Modeling

데이터 세트에 변수가 너무 많아 머리를 감싸거나 멋지게 인쇄할 수 없었습니다. 이 엄청난 양의 데이터를 이해할 수 있는 것으로 어떻게 줄일 수 있습니까?

직관을 사용하여 몇 가지 변수를 선택하여 시작하겠습니다. 이후 과정에서는 변수의 우선 순위를 자동으로 지정하는 통계 기술을 보여줍니다.

변수/열을 선택하려면 데이터 세트의 모든 열 목록을 확인해야 합니다. 이는 DataFrame의 columns 속성으로 수행됩니다(아래 코드의 맨 아래 줄).

In [1]:

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

Out[1]:

`Index(['Suburb', 'Address', 'Rooms', 'Type', 'Price', 'Method', 'SellerG',
       'Date', 'Distance', 'Postcode', 'Bedroom2', 'Bathroom', 'Car',
       'Landsize', 'BuildingArea', 'YearBuilt', 'CouncilArea', 'Lattitude',
       'Longtitude', 'Regionname', 'Propertycount'],
      dtype='object')`

In [2]:

# 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. “예측 대상”을 선택하는 데 사용하는 점 표기법
  2. “기능”을 선택하는 데 사용하는 열 목록으로 선택

Selecting The Prediction Target

점 표기법으로 변수를 꺼낼 수 있습니다. 이 단일 열은 시리즈에 저장되며, 이는 단일 데이터 열만 있는 DataFrame과 대체로 유사합니다.

점 표기법을 사용하여 예측 대상이라고 하는 예측하려는 열을 선택합니다. 규칙에 따라 예측 대상은 y라고 합니다.

멜버른 데이터에 집값을 저장하는 데 필요한 코드는 다음과 같습니다.

In [3]:

y = melbourne_data.Price

Choosing “Features”

모델에 입력되고 나중에 예측에 사용되는 열을 “특성”이라고 합니다. 이 경우에는 주택 가격을 결정하는 데 사용되는 열이 됩니다. 경우에 따라 대상을 제외한 모든 열을 기능으로 사용합니다. 다른 경우에는 더 적은 기능으로 더 나을 것입니다.

지금은 몇 가지 기능만 있는 모델을 빌드합니다. 나중에 다른 기능으로 빌드된 모델을 반복하고 비교하는 방법을 볼 수 있습니다.

대괄호 안에 열 이름 목록을 제공하여 여러 기능을 선택합니다. 해당 목록의 각 항목은 문자열(따옴표 포함)이어야 합니다.

다음은 예입니다.

In [4]:

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

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

In [5]:

X = melbourne_data[melbourne_features]

상위 몇 행을 표시하는 describe 방법과 head 방법을 사용하여 주택 가격을 예측하는 데 사용할 데이터를 빠르게 검토해 보겠습니다.

In [6]:

X.describe()

Out[6]:

RoomsBathroomLandsizeLattitudeLongtitude
count6196.0000006196.0000006196.0000006196.0000006196.000000
mean2.9314071.576340471.006940-37.807904144.990201
std0.9710790.711362897.4498810.0758500.099165
min1.0000001.0000000.000000-38.164920144.542370
25%2.0000001.000000152.000000-37.855438144.926198
50%3.0000001.000000373.000000-37.802250144.995800
75%4.0000002.000000628.000000-37.758200145.052700
max8.0000008.00000037000.000000-37.457090145.526350

In [7]:

X.head()

Out[7]:

RoomsBathroomLandsizeLattitudeLongtitude
121.0156.0-37.8079144.9934
232.0134.0-37.8093144.9944
441.0120.0-37.8072144.9941
632.0245.0-37.8024144.9993
721.0256.0-37.8060144.9954

이러한 명령으로 데이터를 시각적으로 확인하는 것은 데이터 과학자의 업무에서 중요한 부분입니다. 데이터 세트에서 추가 검사가 필요한 놀라움을 자주 발견하게 될 것입니다.


Building Your Model

scikit-learn 라이브러리를 사용하여 모델을 생성합니다. 코딩 시 이 라이브러리는 샘플 코드에서 볼 수 있듯이 sklearn으로 작성됩니다. Scikit-learn은 일반적으로 DataFrames에 저장되는 데이터 유형을 모델링하기 위한 가장 인기 있는 라이브러리입니다.

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

  • 정의: 어떤 유형의 모델이 될까요? 의사 결정 트리? 다른 유형의 모델? 모델 유형의 일부 다른 매개변수도 지정됩니다.
  • Fit: 제공된 데이터에서 패턴을 캡처합니다. 이것이 모델링의 핵심입니다.
  • 예측: 소리 그대로
  • 평가: 모델의 예측이 얼마나 정확한지 확인합니다.

다음은 scikit-learn으로 의사 결정 트리 모델을 정의하고 기능 및 대상 변수에 피팅하는 예입니다.

In [8]:

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)

Out[8]:

DecisionTreeRegressor(random_state=1)

많은 기계 학습 모델은 모델 교육에서 임의성을 허용합니다. ‘random_state’에 숫자를 지정하면 각 실행에서 동일한 결과를 얻을 수 있습니다. 이것은 좋은 습관으로 간주됩니다. 임의의 숫자를 사용하면 선택한 값에 따라 모델 품질이 크게 달라지지 않습니다.

이제 예측에 사용할 수 있는 적합한 모델이 있습니다.

실제로는 이미 가격이 책정된 주택이 아니라 시장에 출시되는 새 주택에 대한 예측을 원할 것입니다. 하지만 학습 데이터의 처음 몇 행에 대해 예측을 수행하여 예측 기능이 어떻게 작동하는지 확인합니다.

In [9]:

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.]

모델을 만들었습니다. 하지만 얼마나 좋은가요?

이 단원에서는 모델 검증을 사용하여 모델의 품질을 측정하는 방법을 배웁니다. 모델 품질을 측정하는 것은 모델을 반복적으로 개선하는 핵심입니다.

What is Model Validation

구축한 거의 모든 모델을 평가하고 싶을 것입니다. 전부는 아니지만 대부분의 애플리케이션에서 모델 품질의 관련 척도는 예측 정확도입니다. 즉, 모델의 예측이 실제로 발생하는 것과 비슷할 것입니다.

많은 사람들이 예측 정확도를 측정할 때 큰 실수를 합니다. 그들은 _학습 데이터_로 예측을 하고 이러한 예측을 _학습 데이터_의 목표 값과 비교합니다. 이 접근 방식의 문제와 해결 방법을 잠시 후에 볼 수 있지만 먼저 이 작업을 수행하는 방법에 대해 생각해 봅시다.

먼저 모델 품질을 이해할 수 있는 방식으로 요약해야 합니다. 10,000채의 주택에 대한 예상 주택 가격과 실제 주택 가격을 비교하면 좋은 예측과 나쁜 예측이 혼합되어 있음을 알 수 있습니다. 10,000개의 예측 및 실제 값 목록을 살펴보는 것은 무의미합니다. 우리는 이것을 하나의 지표로 요약해야 합니다.

모델 품질을 요약하는 많은 측정항목이 있지만 Mean Absolute Error(MAE라고도 함)라는 항목부터 시작하겠습니다. 마지막 단어인 오류부터 시작하여 이 메트릭을 분석해 보겠습니다.

각 주택의 예측 오차는 다음과 같습니다.

error = actual−predicted

따라서 집값이 150,000달러이고 100,000달러가 될 것이라고 예측한 경우 오류는 50,000달러입니다.

MAE 메트릭을 사용하여 각 오류의 절대값을 취합니다. 이렇게 하면 각 오류가 양수로 변환됩니다. 그런 다음 이러한 절대 오류의 평균을 취합니다. 이것은 모델 품질의 척도입니다. 평이한 영어로는 다음과 같이 말할 수 있습니다.

평균적으로, X에 대한 우리의 예측은 조금씩 빗나갑니다.

MAE를 계산하려면 먼저 모델이 필요합니다. 그것은 아래의 숨겨진 셀에 내장되어 있으며 코드 버튼을 클릭하여 검토할 수 있습니다.

In [1]:

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

Out[1]:

DecisionTreeRegressor()

모델이 있으면 평균 절대 오차를 계산하는 방법은 다음과 같습니다.

In [2]:

from sklearn.metrics import mean_absolute_error
predicted_home_prices = melbourne_model.predict(X)
mean_absolute_error(y, predicted_home_prices)

Out[2]:

434.71594577146544

The Problem with “In-Sample” Scores

방금 계산한 측정값을 “샘플 내” 점수라고 합니다. 우리는 모델을 구축하고 평가하기 위해 주택의 단일 “샘플”을 사용했습니다. 이것이 나쁜 이유가 여기에 있습니다.

대규모 부동산 시장에서 문 색상이 주택 가격과 관련이 없다고 상상해 보십시오.

그러나 모델을 구축하는 데 사용한 데이터 샘플에서 녹색 문이 있는 모든 집은 매우 비쌌습니다. 모델의 임무는 주택 가격을 예측하는 패턴을 찾는 것이므로 이 패턴을 확인하고 항상 녹색 문이 있는 주택의 높은 가격을 예측합니다.

이 패턴은 교육 데이터에서 파생되었으므로 모델은 교육 데이터에서 정확하게 나타납니다.

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

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

Coding It

scikit-learn 라이브러리에는 데이터를 두 부분으로 나누는 ‘train_test_split’ 함수가 있습니다. 이 데이터 중 일부는 모델에 맞는 학습 데이터로 사용하고 다른 데이터는 검증 데이터로 사용하여 ‘mean_absolute_error’를 계산합니다.

코드는 다음과 같습니다.

In [3]:

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

258930.03550677857

Wow!

샘플 내 데이터에 대한 평균 절대 오차는 약 500달러였습니다. 아웃 오브 샘플은 250,000 달러 이상입니다.

이것은 거의 정확히 맞는 모델과 대부분의 실용적인 목적에 사용할 수 없는 모델의 차이입니다. 참고로 검증 데이터의 평균 집값은 110만 달러다. 따라서 새 데이터의 오류는 평균 집값의 약 4분의 1입니다.

더 나은 기능이나 다른 모델 유형을 찾기 위한 실험과 같이 이 모델을 개선하는 방법은 많습니다.

(Exercise: Model Validation)

At the end of this step, you will understand the concepts of underfitting and overfitting, and you will be able to apply these ideas to make your models more accurate.

Experimenting With Different Models

이 단계가 끝나면 과소적합 및 과적합의 개념을 이해하고 이러한 아이디어를 적용하여 모델을 더 정확하게 만들 수 있습니다.

scikit-learn의 문서에서 결정 트리 모델에 많은 옵션(오랫동안 원하거나 필요로 하는 것 이상)이 있음을 확인할 수 있습니다. 가장 중요한 옵션은 트리의 깊이를 결정합니다. 이 과정의 첫 번째 강의에서 나무의 깊이는 예측에 도달하기 전에 만드는 분할 수의 척도임을 기억하세요. 이것은 비교적 얕은 나무입니다

실제로 나무가 최상위 수준(모든 집)과 잎사귀 사이에 10개의 분할을 갖는 것은 드문 일이 아닙니다. 트리가 깊어질수록 데이터 세트는 더 적은 수의 집이 있는 리프로 분할됩니다. 트리가 1개만 분할된 경우 데이터를 2개의 그룹으로 나눕니다. 각 그룹이 다시 분할되면 4개의 하우스 그룹이 생성됩니다. 다시 각각을 나누면 8개의 그룹이 생성됩니다. 각 수준에서 더 많은 분할을 추가하여 그룹 수를 계속 두 배로 늘리면 10단계에 도달할 때까지 210210개의 집 그룹이 생깁니다. 1024개의 잎사귀입니다.

우리가 많은 잎사귀 사이에서 집을 나눌 때, 각 잎사귀에는 더 적은 수의 집이 있습니다. 집이 거의 없는 잎사귀는 해당 집의 실제 가치에 매우 가까운 예측을 하지만 새 데이터에 대해서는 매우 신뢰할 수 없는 예측을 할 수 있습니다(각 예측은 몇 개의 집에만 기반하기 때문).

모델이 학습 데이터와 거의 완벽하게 일치하지만 검증 및 기타 새로운 데이터에서는 제대로 작동하지 않는 과적합이라고 하는 현상입니다. 반대로 나무를 매우 얕게 만들면 집을 매우 뚜렷한 그룹으로 나누지 않습니다.

극단적으로 나무가 집을 2~4개로 나누더라도 각 그룹에는 여전히 다양한 집이 있습니다. 결과 예측은 훈련 데이터에서도 대부분의 주택에서 멀리 떨어져 있을 수 있습니다(동일한 이유로 유효성 검사에서도 나쁠 것입니다). 모델이 데이터에서 중요한 차이점과 패턴을 포착하지 못해 학습 데이터에서도 성능이 떨어지는 경우를 과소적합이라고 합니다.

검증 데이터에서 추정한 새 데이터의 정확도에 관심이 있기 때문에 과소적합과 과적합 사이의 적절한 지점을 찾고자 합니다. 시각적으로 우리는 아래 그림에서 (빨간색) 검증 곡선의 낮은 지점을 원합니다.

Example

트리 깊이를 제어하기 위한 몇 가지 대안이 있으며 많은 경우 트리를 통과하는 일부 경로가 다른 경로보다 더 깊은 깊이를 가질 수 있습니다. 그러나 max_leaf_nodes 인수는 과적합과 과소적합을 제어하는 매우 합리적인 방법을 제공합니다. 모델이 만들 수 있는 잎이 많을수록 위 그래프의 과소적합 영역에서 과적합 영역으로 더 많이 이동합니다.

유틸리티 함수를 사용하여 max_leaf_nodes에 대한 다양한 값의 MAE 점수를 비교할 수 있습니다.

In [1]:

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에 로드됩니다.

In [2]:

# Data Loading Code Runs At This Point
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 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.model_selection import train_test_split
 
# split data into training and validation data, for both features and target
train_X, val_X, train_y, val_y = train_test_split(X, y,random_state = 0)

for-loop를 사용하여 max_leaf_nodes에 대해 다른 값으로 빌드된 모델의 정확도를 비교할 수 있습니다.

In [3]:

# 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

요점은 다음과 같습니다. 모델은 다음과 같은 문제를 겪을 수 있습니다.

  • 과적합: 미래에 반복되지 않는 가짜 패턴을 캡처하여 덜 정확한 예측으로 이어짐
  • 과소적합: 관련 패턴을 캡처하지 못하여 예측 정확도가 떨어집니다.

후보 모델의 정확도를 측정하기 위해 모델 학습에 사용되지 않는 검증 데이터를 사용합니다. 이를 통해 많은 후보 모델을 시도하고 최상의 모델을 유지할 수 있습니다.

(Exercise: Underfitting and Overfitting)

Introduction

결정 트리는 어려운 결정을 내리게 합니다. 잎이 많은 깊은 나무는 각 예측이 잎에 있는 몇 채의 집의 과거 데이터에서 나오기 때문에 과대적합됩니다. 그러나 리프가 적은 얕은 트리는 원시 데이터에서 많은 차이를 캡처하지 못하기 때문에 성능이 좋지 않습니다.

오늘날의 가장 정교한 모델링 기술조차도 과소적합과 과적합 사이의 긴장에 직면해 있습니다. 그러나 많은 모델에는 더 나은 성능으로 이어질 수 있는 영리한 아이디어가 있습니다. 랜덤 포레스트를 예로 들어 보겠습니다.

랜덤 포레스트는 많은 트리를 사용하며 각 컴포넌트 트리의 예측을 평균하여 예측합니다. 일반적으로 단일 의사 결정 트리보다 예측 정확도가 훨씬 뛰어나며 기본 매개변수와 잘 작동합니다. 모델링을 계속하면 더 나은 성능으로 더 많은 모델을 학습할 수 있지만 많은 모델이 올바른 매개변수를 얻는 데 민감합니다.

Example

이미 몇 번 데이터를 로드하는 코드를 보았습니다. 데이터 로딩이 끝나면 다음과 같은 변수가 있습니다.

  • train_X
  • val_X
  • train_y
  • val_y

In [1]:

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 values
melbourne_data = melbourne_data.dropna(axis=0)
# Choose target and features
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
 
# 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)

scikit-learn에서 결정 트리를 구축한 방법과 유사하게 랜덤 포레스트 모델을 구축합니다. 이번에는 DecisionTreeRegressor 대신 RandomForestRegressor 클래스를 사용합니다.

In [2]:

from sklearn.ensemble import 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))

191669.7536453626

Conclusion

추가 개선의 여지가 있을 수 있지만 이는 250,000의 최상의 의사 결정 트리 오류에 비해 크게 개선된 것입니다. 단일 결정 트리의 최대 깊이를 변경한 만큼 Random Forest의 성능을 변경할 수 있는 매개 변수가 있습니다. 그러나 Random Forest 모델의 가장 좋은 기능 중 하나는 이러한 튜닝 없이도 일반적으로 합리적으로 작동한다는 것입니다.

(Exercise: Random Forests)

(Exercise: Machine Learning Competitions)

참조

https://www.kaggle.com/code/dansbecker/how-models-work

https://www.kaggle.com/code/dansbecker/basic-data-explorationhttps://www.kaggle.com/code/dansbecker/your-first-machine-learning-model

https://www.kaggle.com/code/dansbecker/model-validation

https://www.kaggle.com/code/dansbecker/underfitting-and-overfitting

https://www.kaggle.com/code/dansbecker/random-forests