본문 바로가기
Data Science/Examples

[딥러닝 기초] Kaggle 연습 문제 Melbourne house pricing

by titaniumm 2020. 8. 4.

예제를 통해서 전체 과정에 골격을 공부 할 수 있다. 

1. 데이터 로딩

# Path of the file to read
iowa_file_path = '../input/home-data-for-ml-course/train.csv'

# Fill in the line below to read the file into a variable home_data
home_data = pd.read_csv(iowa_file_path)

pd.read_csv와 path 설정하는 것에 익숙해지자

 

2. 데이터 살펴보는 방법

home_data.describe()
home_data.info()
home_data.head()
home_data.columns

#columns OUTPUT
Index(['Id', 'MSSubClass', 'MSZoning', 'LotFrontage', 'LotArea', 'Street',
       'Alley', 'LotShape', 'LandContour', 'Utilities', 'LotConfig',
       'LandSlope', 'Neighborhood', 'Condition1', 'Condition2', 'BldgType',
       'HouseStyle', 'OverallQual', 'OverallCond', 'YearBuilt', 'YearRemodAdd',
       'RoofStyle', 'RoofMatl', 'Exterior1st', 'Exterior2nd', 'MasVnrType',
       'MasVnrArea', 'ExterQual', 'ExterCond', 'Foundation', 'BsmtQual',
       'BsmtCond', 'BsmtExposure', 'BsmtFinType1', 'BsmtFinSF1',
       'BsmtFinType2', 'BsmtFinSF2', 'BsmtUnfSF', 'TotalBsmtSF', 'Heating',
       'HeatingQC', 'CentralAir', 'Electrical', '1stFlrSF', '2ndFlrSF',
       'LowQualFinSF', 'GrLivArea', 'BsmtFullBath', 'BsmtHalfBath', 'FullBath',
       'HalfBath', 'BedroomAbvGr', 'KitchenAbvGr', 'KitchenQual',
       'TotRmsAbvGrd', 'Functional', 'Fireplaces', 'FireplaceQu', 'GarageType',
       'GarageYrBlt', 'GarageFinish', 'GarageCars', 'GarageArea', 'GarageQual',
       'GarageCond', 'PavedDrive', 'WoodDeckSF', 'OpenPorchSF',
       'EnclosedPorch', '3SsnPorch', 'ScreenPorch', 'PoolArea', 'PoolQC',
       'Fence', 'MiscFeature', 'MiscVal', 'MoSold', 'YrSold', 'SaleType',
       'SaleCondition', 'SalePrice'],
      dtype='object')

3가지를 하면 대략적으로 DataFrame에서 어떤 구조와 형태를 가지고 있는지 파악 할 수 있다.

나머지는 생략하고, columns를 보면 정말 많은 열들이 있는것을 파악 할 수 있다.

 

3. 데이터 전처리 

# Create the list of features below
feature_names = ['LotArea','YearBuilt','1stFlrSF','2ndFlrSF','FullBath','BedroomAbvGr','TotRmsAbvGrd']

# Select data corresponding to features in feature_names
X = home_data[feature_names]
y = home_data['SalePrice']
#이후에 fillna 나 apply 혹은 map을 이용하여 결측치를 채워준다.

직관적으로 연관성 있어보이는, 7가지 정도만 선택했다. 

X는 Feature들 (우리가 설정한 7가지정도) 를 넣고 예측을 하려고 하는 y에 집값을 넣는다. 

사실 이 부분이 여기서는 굉장히 간단하지만, 실제 데이터 분석에 있어서는 생각을 많이 해야하는 분야인거 같다.

-어떤 데이터들을 사용할 것인가?

-결측 값들은 어떻게 해결할 것인가?

-데이터들의 상관관계는 어떻게 되는가?

 

4. 모델 설정 및 FIT -> Predict -> Evaluate

# from _ import _
#specify the model. 
from sklearn.tree import DecisionTreeRegressor
#For model reproducibility, set a numeric value for random_state when specifying the model
iowa_model = DecisionTreeRegressor(random_state=1)

# Fit the model
iowa_model.fit(X,y)

predictions = iowa_model.predict(X)
print(predictions)

사이킷런을 통해서 DecisionTreeRegressor 모델을 설정한다.

Fit = 학습의 과정 (옷을 피팅한다 와 비슷한 느낌)

Predict - FIT한  모델로 X를 통해서 새로운 Y를 생성해 본다

Evaluate - 진짜 값과 Predict 한 값을 비교하여 평가한다.

 

5. Validation 

train data , test data 이외에 Validation을 또 쓴다. 왜그럴까? 

만약에 train과 test만으로 실험을 반복적으로 하고 test결과가 잘나오도록 계속해서 train 파라미터들을 바꿔준다면

test에만 적합한 파라미터가 생겨버릴수도 있다. 이를 방지하기 위해서 validation으로 모델의 파라미터들을 변경시켜주고 마지막에 테스트를 하는 것이다.

#먼저 데이터를 나눠주고
# Import the train_test_split function and uncomment
from sklearn.model_selection import train_test_split

# fill in and uncomment
train_X, val_X, train_y, val_y = train_test_split(X,y,random_state=1)

#이전 과정에서 했던거 처럼 train데이터로 FIT, PREDICT를 해준다. 그결과를 MAE로 확인한다.
# Specify the model
iowa_model = DecisionTreeRegressor(random_state=1)

# Fit iowa_model with the training data.
iowa_model.fit(train_X,train_y)
# Predict with all validation observations
val_predictions = iowa_model.predict(val_X)
from sklearn.metrics import mean_absolute_error
val_mae = mean_absolute_error(val_predictions, val_y)

train과 valid를 나누고 FIT, Predict 하는 과정을 동일하다. 하지만 여기서 정확하게 예측했는가? 를 확인하기 위해서

MAE로 확인한다. evaluate은 아마 테스트 데이터를 사용할떄 활용할 것 같다.

 

6. Overshooting , Underfitting

CNN RNN 을 다룰때, 오버슈팅 언더피팅은 learning rate에 의해 결정되었다. 하지만 Decision tree에서는 

결정나무들의 depth가 오버슈팅 언더피팅을 결정하는 중요한 요소 인거 같다.

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)
    
candidate_max_leaf_nodes = [5, 25, 50, 100, 250, 500]
# Write loop to find the ideal tree size from candidate_max_leaf_nodes
for i in candidate_max_leaf_nodes:
    print(get_mae(i, train_X, val_X, train_y, val_y))

# Store the best value of max_leaf_nodes (it will be either 5, 25, 50, 100, 250 or 500)
best_tree_size = 100


35044.51299744237
29016.41319191076
27405.930473214907
27282.50803885739
27893.822225701646
29454.18598068598

# Fit the model with best_tree_size. Fill in argument to make optimal size
final_model = DecisionTreeRegressor(max_leaf_nodes=best_tree_size, random_state=1)

# fit the final model
final_model.fit(X, y)

이런식으로 함수를 만들어서 모델 생성 predict, fit를 한번에 처리 할 수 있고

여러 숫자를 넣어 MAE가 작은 SIZE를 선택하면 된다.

 

 

 

https://www.kaggle.com/learn/intro-to-machine-learning

 

Learn Intro to Machine Learning Tutorials

Learn the core ideas in machine learning, and build your first models.

www.kaggle.com

 

댓글