예제를 통해서 전체 과정에 골격을 공부 할 수 있다.
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
'Data Science > Examples' 카테고리의 다른 글
[LSTM] 시계열 데이터셋을 활용한 기온 예측 문제 (0) | 2020.07.29 |
---|
댓글