본문 바로가기

AI

[Kaggle] Melbourne 집값 예측하기 - 1

캐글 사이트에 있는 course를 바탕으로 집값 예측을 해 보았다

데이터를 처리해서 모델을 생성하는 게 익숙하지 않아 코스 내용과 공부 내용을 기록해보고자 한다

 

1
2
3
4
5
6
# 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()
cs

 

먼저 캐글에서 제공하는 멜버른 집값 데이터를 가져와서 DataFrame으로 만들었다

간략하게 각 feature들이 어떤 값을 가지고 있는지 살펴 보았다

 

 

여기서 예측하고자 하는 column은 Price! 

모델을 만들 때는 어떤 column들을 feature로 사용해야할까 생각해보았다

아직 missing value를 채워놓고 numeric하지 않은 value들을 encoding하는 것은 어렵다고 생각이 들었다

 

 

다음과 같이 비어있는 값이 있는 row의 개수를 확인해보았다

Building Area와 Car, YearBuilt 모두 집값에 충분히 영향이 있을만한 feature들이지만 지금은 모델을 만들어보고 error를 계산해보는 것을 연습하는 과정이라 제외하고 진행해보았다

그렇게 해서 선정된 feature들을 따로 DataFrame으로 만들어보았다

 

1
2
3
= melbourne_data.Price
melbourne_features = ['Rooms''Bathroom''Landsize''Lattitude''Longtitude']
= melbourne_data[melbourne_features]
cs

 

많이 허술하기는 하지만 이제 사용할 수 있는 데이터가 준비가 되었으니 모델을 만들어 볼 차례!

 

1
2
3
4
5
6
7
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)
cs

 

코스에서 Decision Tree를 사용하길래 따라서 사용해보았다

어느정도 구현이 익숙해지면 상황별로 어떤 모델을 쓸지 잘 알수 있었으면 좋겠다

DecisionTreeRegressor는 인자로 다양한 값들을 가질 수 있는데 익숙한 부분만 조금 살펴보자면

 

- max_depth : tree의 최장 길이를 지정해 줄 수 있다, 디폴트는 None

- random_state : randomness를 조절한다, random generator의 seed가 되는 값, 지정해주지 않는다면 코드를 돌릴때마다 새로운 랜덤값이 생겨 결과가 매번 바뀔 수 있다

- max_leaf_nodes : leaf node의 최대 개수를 지정해주는 인자, 디폴트는 무한대~

 

random state로는 0,1,42를 자주 쓴다는데 뜬금없이 42가 나와서 너무 궁금해서 42의 의미를 열심히 찾아 보았다

데이터 사이언티스트 들은 컴퓨터와 관련된 숫자를 좋아한다는데 은하수를 여행하는 히치하이커를 위한 안내서 책에 

 

" 삶과 우주, 그리고 모든 것에 대한 답은 42 입니다" 

 

라는 문장이 있어서 사용하게 되었다고 한다

이 문장은 밈처럼 시리나 구글에서도 사용되고 있었다

언젠가 꼭 읽어봐야겠다

 

아무튼...! random_state를 1로 해서 DecisionTreeRegressor를 만들어주었다

그리고 준비해놓은 데이터를 fit 함수를 이용해서 모델에 적용시켜주었다

predict를 통해 결과를 확인해보고 잘 나오는 것을 확인해보았다

 

이제 실제로 데이터를 train 데이터와 test 데이터를 나누어 error를 측정해보았다

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_absolute_error
 
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))
cs

 

train_test_split 함수는 인자로 test_size나 train_size를 float값으로 지정해 줄 수 있는데 이렇게 따로 지정해주지 않는다면 test size가 25퍼센트 정도 된다

크기를 뽑아 봤더니 test size가 정말 25퍼센트였다

mean_absolute_error 함수를 이용해 error가 얼마나 나왔는지 확인해 볼 수도 있었다

 

다음은 모델에게 다양한 인자를 주고 어떤 모델이 가장 좋은지 알아보기로 했다

기준으로 삼은 인자는 max_leaf_node이다

max_leaf_node의 개수에 따라 mae가 어떻게 바뀌는지 알아보자

 

매번 모델을 새로 만들고 에러를 계산하고 하기에는 너무 복잡한지 코스에서는 다음과 같은 함수를 만들어 사용했다

 

1
2
3
4
5
6
7
8
9
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)
cs

 

이 함수는 데이터와 max leaf node의 개수를 넘겨주면 모델 생성 후 train, predict, error 계산까지 끝낸 값을 return 해준다

이 함수를 이용해 max leaf node의 개수를 5,50,500,5000개로 지정 후 mae를 구해보았다

많으면 많을 수록 좋을것 같았는데 의외로 500개일때가 가장 낮은 mae를 가졌다

max leaf node가 너무 크면 overfitting이 되었기 때문이었다

max leaf node가 커질 수록 underfitting  될 확률은 줄어들지만 overfitting 될 확률이 늘어난다

위 예처럼 적당한 크기들을 테스트 해 본 후 max leaf node의 적정값을 찾는 것이 중요하다

 

마지막으로 다른 부분은 똑같지만 DecisionTree 대신 RandomForest를 사용해보았다

 

1
2
3
4
5
6
7
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))
cs

 

DecisionTree보다 훨씬 작은 mae가 나왔다

모델 선정이 중요하다는 것을 느꼈다!!

실제 데이터로 모델을 만들고 비교해보는 과정을 많이 연습해서 어떤 상황에서 어떤 모델을 쓰는 게 좋을지 잘 알 수 있도록 해야겠다