-
Kaggle - House Price공부/머신러닝 2021. 4. 5. 02:21
www.kaggle.com/c/house-prices-advanced-regression-techniques
아이오와 주 에임스에 있는 (거의) 모든 거주용 주택을 설명하는 79개의 변수를 통해 각 집의 최종 가격을 예측
※ feature별 영향을 고려하지 않은 쉬운 방법
Data Description
File description
- train.csv - the training set
- test.csv - the test set
- data_dscription.txt - 각 칼럼에 대한 설명
- sample_submission.csv - 판매 월 및 연도, 부지 면적 및 침실 수에 대한 선형 회귀 벤치마크 서브미션
Data description
- MSSubClass : 매매와 관련된 주거 타입 식별
- MSZoning : 매매의 일반적인 지역 분류
- LotFrontage : 부동산과 연결된 도로의 선형 피트
- LotArea : 평방피트 단위의 부지 크기
- Street : 부동산으로의 도로(street) 접근 유형
- Alley : 부동산으로의 골목(alley) 접근 유형
- LotShape : 부동산의 일반적인 모양
- LandContour : 부동산의 평탄도
- Utilities : 사용 가능한 유틸리티(수도전기가스) 유형
- LotConfig : 지역 구성
- LandSlope : 부동산의 경사
- Neighborhood : 에임스 시 경계 내의 물리적인 위치
- Condition1 : 주요 도로 및 철도와의 근접성
- Condition2 : 주요 도로 및 철도와의 근접성 (두 개 이상 존재하는 경우)
- BldgType : 주거 유형
- HouseStyle : 주거 스타일
- OverallQual : 전체적인 재료 및 마감 등급
- OverallCond : 집의 전체적인 상태 등급
- YearBuilt : 원래 공사일
- YearRemodAdd : 리모델링 날짜 (리모델링 혹은 추가가 없었던 경우 공사일과 동일)
- RoofStyle : 지붕 유형
- RoofMatl : 지붕 재료
- Exterior 1st : 주택 외장재
- Exterior 2nd : 주택 외장재 (두 개 이상 존재하는 경우)
- MasVnrType : 벽돌 베니어 유형
- MasVnrArea : 벽돌 베니어 면적 (평방피트)
- ExterQual : 외장재 품질
- ExterCond : 외장재 현재 상태
- Foundation : 토대 유형
- BsmtQual : 지하의 높이 평가
- BsmtCond : 지하실 일반적인 상태 평가
- BsmtExposure : 워크아웃 혹은 정원 수준의 벽
- BsmtFinType1 : 지하 마감면의 품질
- BsmtSF1 : 유형 1 마감 평방피트
- BsmtFinType2 : 지하 마감면의 품질 (있는 경우)
- BsmtSF2 : 유형 2 마감 평방피트
- BsmtUnfSF : 마감되지 않은 지하실 면적
- TotalBsmtSF : 지하 총 평방피트
- Heating : 난방 유형
- HeatingQC : 난방 품질 및 상태
- CentralAir : 중앙 에어컨 여부
- Electrial : 전기 시스템
- 1stFlrSF : 1층 평방피트
- 2ndFlrSF : 2층 평방피트
- LowQualFinSF : 저품질 마감 평방 피트 (모든 층)
- GrLivArea : 지상 거실 면적 평방 피트
- BsmtFullBath : 지하 전체 욕실
- BsmtHalfBath : 지하 반 욕실
- FullBath : 지하층 위의 전체 욕실
- HalfBath : 지하층 위의 반 욕실
- Bedroom : 지하층 위의 침실 수 (지하 침실은 포함하지 않음)
- Kitchen : 지하층 위의 주방 수
- KitchenQual : 주방 품질
- TotRmsAbvGra : 지하층 위의 모든 방 (욕실 제외)
- Functional : 집 기능 (공제가 보장되지 않는 한 일반적인 경우 가정)
- FirePlace : 벽난로 수
- FireplaceQu : 벽난로 품질
- GarageType : 차고 위치
- GarageYrBlt : 차고 건설 연도
- GarageFinish : 차고 내부 마감
- GarageCars : 차량 수용 가능 차고 크기
- GarageArea : 차고 평방피트
- GarageQual : 차고 품질
- GarageCond : 차고 상태
- PavedDrive : 포장된 진입로
- WoodDeckSF : 평방피트 단위의 목재 데크 면적
- OpenPochSF : 평방피트 단위의 개방 현관 면적
- EnclosedPorch : 평방피트 단위의 닫힌 현관 면적
- 3SnPorch : 평방 피트의 세 계절 현관 면적
- ScreenPorch : 평방피트 단위의 스크린 현관 면적
- PoolArea : 평방피트 단위의 수영장 면적
- PoolQC : 수영장 품질
- Fence : 울타리 품질
- MiscFeature : 다른 항목에서 다루지 않는 기타 특징
- MiscVal : 기타 특징의 가치
- MoSold : 월 판매
- YrSold : 연 판매
- SaleType : 판매 유형
- SaleCondition : 판매 상태
구글 드라이브 마운트하여 드라이브에 있는 파일에 접근 가능하도록 함
from google.colab import drive drive.mount('/content/drive')
필요한 모듈 불러오기
import pandas as pd import numpy as np import warnings warnings.filterwarings('ignore') #경고 메시지 숨기기
데이터 가져오기
train_df = pd.read_csv('/content/drive/My Drive/E-pro/house_price/train.csv') test_df = pd.read_csv('/content/drive/My Drive/E-pro/house_price/test.csv')
데이터 확인
train_df.head()
train_df.shape, test_df.shape
데이터 전처리
처리를 용이하게 하기 위해 train, test 데이터셋을 합치기
new_train_df = train_df.drop(['SalePrice'], axis = 1) new_test_df = test_df.copy() df = pd.concat([new_train_df, test_df], axis=0, ignore_index = True)
df.shape
데이터 확인
df.info()
missing data를 더 용이하게 확인할 수 있도록 퍼센트로 표시하기
def missingdata(df) : total = df.isnull().sum().sort_values(ascending=False) percent = round(df.isnull().sum().sort_values(ascending = False)/len(df)*100, 2) temp = pd.concat([total, percent], axis = 1, keys = ['Total', 'Percent']) return temp.loc[(temp['Total'] > 0)] missingdata(df)
대부분의 칼럼이 NULL인 데이터는 지워주기 (50%를 기준으로)
percent = df.isnull().sum() / len(df) remove_col = percent[percent >= 0.5].keys() df = df.drop(remove_col, axis = 1) missingdata(df)
수치형 데이터와 범주형 데이터 분리
df = df.drop(columns=['Id'], axis = 1) df_obj = df.select_dtypes(include = 'object') df_num = df.select_dtypes(exclude = 'object') print('Obj type : ',df_obj.columns) print('*******************************') print('Num type : ', df_num.columns)
범주형 데이터 처리
one-hot encoding 적용 -> pd.get_dummies()
#categorical data dummy_df = pd.get_dummies(df_obj) dummy_df.index = df.index dummy_df.head()
수치형 데이터 처리
중간값으로 대체
for i in df_num.columns : df_num[i].fillna(df_num[i].mean(), inplace=True) df_num.head()
다른 missing data 있는지 확인
print(dummy_df.isnull().sum().sum()) print(df_num.isnull().sum().sum())
분리했던 데이터 합쳐주기
merge시에 index 신경써 주어야 함 -> left_index = True, right_index = True
df = pd.merge(dummy_df, df_num, left_index=True, right_index=True) df.head()
df.shape
train_data와 test_data 분리
train_y = train_df['SalePrice'] train_df = df[:len(train_df)] test_df = df[len(train_df):] train_df['SalePrice'] = train_y print(train_df.shape, test_df.shape)
모델 학습
RidgeCV와 XGBboost 사용 -> Average
from sklearn.linear_model import RidgeCV ridge_cv = RidgeCV(alphas=(0.01, 0.05, 0.1, 0.3, 1, 3, 5, 10)) ridge_cv.fit(x_train, y_train) ridge_cv_pred = ridge_cv.predict(test_df)
import xgboost as xgb model_xgb = xgb.XGBRegressor(n_estimator=340, max_depth=2, learning_rate=0.2) model_xgb.fit(x_train, y_train) xgb_pred = model_xgb.predict(test_df)
predictions = (ridge_cv_pred + xgb_pred)/2
제출 파일 만들기
submission = pd.DataFrame({ "Id" : new_test_df["Id"], 'SalePrice' : predictions }) submission.to_csv('House_price.csv', index=False)
개선 방향 :
- 예측 정확도를 높이기 위해 SalePrice의 feature별 상관관계를 고려
- 최적의 hyper parameter 설정을 위해 GridSearch 도입 고려
- 등등...
- -> 나중에 재도전 해보기
'공부 > 머신러닝' 카테고리의 다른 글
Kaggle - Titanic (0) 2021.03.30 모두를 위한 딥러닝 - 정리 (7~12) (0) 2021.03.22 모두를 위한 딥러닝 - 정리 (1~6) (0) 2021.03.13