ABOUT ME

Today
-
Yesterday
-
Total
-
  • 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

    댓글

Designed by nanometre380.