캐글(Kaggle)/프로젝트

Kaggle(캐글) - 주택 가격 예측 초보자 튜토리얼[Hellfer](1)

Hellfer 2024. 7. 7. 22:27
728x90

https://www.kaggle.com/code/jimmyyeung/house-regression-beginner-catboost-top-2/notebook

 

🔥House Regression: Beginner Catboost (Top 2%)🚀

Explore and run machine learning code with Kaggle Notebooks | Using data from multiple data sources

www.kaggle.com

 

위의 글을 보고 참고하여 작성했습니다.

 

먼저 아래 링크에서 데이터셋을 업로드해 보겠습니다.

 

https://www.kaggle.com/datasets/shashanknecrothapa/ames-housing-dataset

 

Ames Housing Dataset

 

www.kaggle.com

 

'Ames Housing DataSet'은 기계 학습 및 데이터 분석 분야에서 잘 알려진 데이터세트입니다.

 

특히 회귀 작업, 주택 가격 예측에 자주 사용됩니다.

 

Number of Instances - 2,930개의 인스턴스 또는 관측값으로 구성됩니다.

 

Number of Features - 주거용 부동산의 다양한 측면을 설명하는 79개의 다양한 특징 또는 변수가 있습니다.

 

Target Variable - 데이터 세트의 대상 변수는 주택 판매 가격을 나타내는 'SalePrice'입니다.

 

Data Types - 수치형 및 범주형 변수가 모두 포함됩니다.

 

파일은 노트북에서 input칸에서 업로드를 누르고 해당 'Ames Housing DataSet'을 다운로드하여 직접 해도 되고 Add input을 통해 하셔도 됩니다.

 

기존의 COMPETITIONS파일의 House Prices - Advanced Regression Techniques의 train.csv를 사용해도 무관하지만 정확도를 높이기 위해서 위의 파일을 업로드했습니다.

 


 

전체 순서는 다음과 같습니다.

 

1. 라이브러리 임포트 : 데이터 분석, 전처리, 모델링에 필요한 라이브러리들을 임포트 합니다.

 

2. 데이터 로드

 

3. EDA(탐색적 데이터 분석)

- 데이터의 정보 확인, 결측치 확인, 기초 통계량 확인, 상관관계 히트맵 등

 

4. 데이터 전처리

- 훈련 데이터와 검증 데이터를 분리,  스케일링 수행, 결측치 처리

 

5. 모델링

 

6. 예측 및 제출

 

 


 

첫 번째 순서로 관련 모듈을 임포트 해보겠습니다.

 

# This Python 3 environment comes with many helpful analytics libraries installed
# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python
# For example, here's several helpful packages to load

import numpy as np # linear algebra
import pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)

# Input data files are available in the read-only "../input/" directory
# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory

import os
for dirname, _, filenames in os.walk('/kaggle/input'):
    for filename in filenames:
        print(os.path.join(dirname, filename))

# You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using "Save & Run All" 
# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session

 

/kaggle/input/ameshousing-csv/AmesHousing.csv
/kaggle/input/house-prices-advanced-regression-techniques/sample_submission.csv
/kaggle/input/house-prices-advanced-regression-techniques/data_description.txt
/kaggle/input/house-prices-advanced-regression-techniques/train.csv
/kaggle/input/house-prices-advanced-regression-techniques/test.csv

 

# 데이터 시각화를 위한 라이브러리
import seaborn as sns
import matplotlib.pyplot as plt

# 통계 분석을 위한 라이브러리
from scipy.stats import skew, norm
import scipy.stats as stats
import statsmodels.api as sm

# 머신러닝 모델 학습 및 평가를 위한 라이브러리
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
from sklearn.neighbors import KNeighborsRegressor

# XGBoost와 CatBoost 모델 
import xgboost as xgb
from catboost import Pool
from catboost import CatBoostRegressor

# 결측치 시각화를 위한 라이브러리
import missingno as msno

그래프를 인라인으로 출력하기 위한 명령어
%matplotlib inline

 

 

파일 이름을 찾기 어렵다면 오른쪽 파일 누르고 copy 해서 변수명 = pd.read_csv(' ')에 붙여 넣기 하면 됩니다.

 

 

train = pd.read_csv('/kaggle/input/ameshousing-csv/AmesHousing.csv')
test = pd.read_csv('/kaggle/input/house-prices-advanced-regression-techniques/test.csv')

 

 

train.info() 함수를 통해 AmesHousing의 데이터프레임 구조와 내용을 파악해 보겠습니다.

 

train.info()

 

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 2930 entries, 0 to 2929
Data columns (total 82 columns):
 #   Column           Non-Null Count  Dtype  
---  ------           --------------  -----  
 0   Order            2930 non-null   int64  
 1   PID              2930 non-null   int64  
 2   MS SubClass      2930 non-null   int64  
 3   MS Zoning        2930 non-null   object 
 4   Lot Frontage     2440 non-null   float64
 5   Lot Area         2930 non-null   int64  
 6   Street           2930 non-null   object 
 7   Alley            198 non-null    object 
 8   Lot Shape        2930 non-null   object 
 9   Land Contour     2930 non-null   object 
 10  Utilities        2930 non-null   object 
 11  Lot Config       2930 non-null   object 
 12  Land Slope       2930 non-null   object 
 13  Neighborhood     2930 non-null   object 
 14  Condition 1      2930 non-null   object 
 15  Condition 2      2930 non-null   object 
 16  Bldg Type        2930 non-null   object 
 17  House Style      2930 non-null   object 
 18  Overall Qual     2930 non-null   int64  
 19  Overall Cond     2930 non-null   int64  
 20  Year Built       2930 non-null   int64  
 21  Year Remod/Add   2930 non-null   int64  
 22  Roof Style       2930 non-null   object 
 23  Roof Matl        2930 non-null   object 
 24  Exterior 1st     2930 non-null   object 
 25  Exterior 2nd     2930 non-null   object 
 26  Mas Vnr Type     1155 non-null   object 
 27  Mas Vnr Area     2907 non-null   float64
 28  Exter Qual       2930 non-null   object 
 29  Exter Cond       2930 non-null   object 
 30  Foundation       2930 non-null   object 
 31  Bsmt Qual        2850 non-null   object 
 32  Bsmt Cond        2850 non-null   object 
 33  Bsmt Exposure    2847 non-null   object 
 34  BsmtFin Type 1   2850 non-null   object 
 35  BsmtFin SF 1     2929 non-null   float64
 36  BsmtFin Type 2   2849 non-null   object 
 37  BsmtFin SF 2     2929 non-null   float64
 38  Bsmt Unf SF      2929 non-null   float64
 39  Total Bsmt SF    2929 non-null   float64
 40  Heating          2930 non-null   object 
 41  Heating QC       2930 non-null   object 
 42  Central Air      2930 non-null   object 
 43  Electrical       2929 non-null   object 
 44  1st Flr SF       2930 non-null   int64  
 45  2nd Flr SF       2930 non-null   int64  
 46  Low Qual Fin SF  2930 non-null   int64  
 47  Gr Liv Area      2930 non-null   int64  
 48  Bsmt Full Bath   2928 non-null   float64
 49  Bsmt Half Bath   2928 non-null   float64
 50  Full Bath        2930 non-null   int64  
 51  Half Bath        2930 non-null   int64  
 52  Bedroom AbvGr    2930 non-null   int64  
 53  Kitchen AbvGr    2930 non-null   int64  
 54  Kitchen Qual     2930 non-null   object 
 55  TotRms AbvGrd    2930 non-null   int64  
 56  Functional       2930 non-null   object 
 57  Fireplaces       2930 non-null   int64  
 58  Fireplace Qu     1508 non-null   object 
 59  Garage Type      2773 non-null   object 
 60  Garage Yr Blt    2771 non-null   float64
 61  Garage Finish    2771 non-null   object 
 62  Garage Cars      2929 non-null   float64
 63  Garage Area      2929 non-null   float64
 64  Garage Qual      2771 non-null   object 
 65  Garage Cond      2771 non-null   object 
 66  Paved Drive      2930 non-null   object 
 67  Wood Deck SF     2930 non-null   int64  
 68  Open Porch SF    2930 non-null   int64  
 69  Enclosed Porch   2930 non-null   int64  
 70  3Ssn Porch       2930 non-null   int64  
 71  Screen Porch     2930 non-null   int64  
 72  Pool Area        2930 non-null   int64  
 73  Pool QC          13 non-null     object 
 74  Fence            572 non-null    object 
 75  Misc Feature     106 non-null    object 
 76  Misc Val         2930 non-null   int64  
 77  Mo Sold          2930 non-null   int64  
 78  Yr Sold          2930 non-null   int64  
 79  Sale Type        2930 non-null   object 
 80  Sale Condition   2930 non-null   object 
 81  SalePrice        2930 non-null   int64  
dtypes: float64(11), int64(28), object(43)
memory usage: 1.8+ MB

 

 

이름의 공백을 제거하고 'Order', 'PID' 열을 삭제해 보겠습니다.

 

#열 이름에서 공백을 제거
train.columns = train.columns.str.replace(' ', '')

# 'Order', 'PID' 열을 삭제
train = train.drop(['Order','PID'], axis = 1)

train

 

 

 

train.descibe() 함수를 통해 기술 통계 정보를 알아보겠습니다.

- count : 값의 개수, mean : 평균, std : 표준 편차, min : 최솟값, 25% : 1 사분위수, 50% : 중앙값, 75% : 3 사분위수, max : 최댓값

 

 

train.describe()

 

 

 


 

test.info()

 

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1459 entries, 0 to 1458
Data columns (total 80 columns):
 #   Column         Non-Null Count  Dtype  
---  ------         --------------  -----  
 0   Id             1459 non-null   int64  
 1   MSSubClass     1459 non-null   int64  
 2   MSZoning       1455 non-null   object 
 3   LotFrontage    1232 non-null   float64
 4   LotArea        1459 non-null   int64  
 5   Street         1459 non-null   object 
 6   Alley          107 non-null    object 
 7   LotShape       1459 non-null   object 
 8   LandContour    1459 non-null   object 
 9   Utilities      1457 non-null   object 
 10  LotConfig      1459 non-null   object 
 11  LandSlope      1459 non-null   object 
 12  Neighborhood   1459 non-null   object 
 13  Condition1     1459 non-null   object 
 14  Condition2     1459 non-null   object 
 15  BldgType       1459 non-null   object 
 16  HouseStyle     1459 non-null   object 
 17  OverallQual    1459 non-null   int64  
 18  OverallCond    1459 non-null   int64  
 19  YearBuilt      1459 non-null   int64  
 20  YearRemodAdd   1459 non-null   int64  
 21  RoofStyle      1459 non-null   object 
 22  RoofMatl       1459 non-null   object 
 23  Exterior1st    1458 non-null   object 
 24  Exterior2nd    1458 non-null   object 
 25  MasVnrType     565 non-null    object 
 26  MasVnrArea     1444 non-null   float64
 27  ExterQual      1459 non-null   object 
 28  ExterCond      1459 non-null   object 
 29  Foundation     1459 non-null   object 
 30  BsmtQual       1415 non-null   object 
 31  BsmtCond       1414 non-null   object 
 32  BsmtExposure   1415 non-null   object 
 33  BsmtFinType1   1417 non-null   object 
 34  BsmtFinSF1     1458 non-null   float64
 35  BsmtFinType2   1417 non-null   object 
 36  BsmtFinSF2     1458 non-null   float64
 37  BsmtUnfSF      1458 non-null   float64
 38  TotalBsmtSF    1458 non-null   float64
 39  Heating        1459 non-null   object 
 40  HeatingQC      1459 non-null   object 
 41  CentralAir     1459 non-null   object 
 42  Electrical     1459 non-null   object 
 43  1stFlrSF       1459 non-null   int64  
 44  2ndFlrSF       1459 non-null   int64  
 45  LowQualFinSF   1459 non-null   int64  
 46  GrLivArea      1459 non-null   int64  
 47  BsmtFullBath   1457 non-null   float64
 48  BsmtHalfBath   1457 non-null   float64
 49  FullBath       1459 non-null   int64  
 50  HalfBath       1459 non-null   int64  
 51  BedroomAbvGr   1459 non-null   int64  
 52  KitchenAbvGr   1459 non-null   int64  
 53  KitchenQual    1458 non-null   object 
 54  TotRmsAbvGrd   1459 non-null   int64  
 55  Functional     1457 non-null   object 
 56  Fireplaces     1459 non-null   int64  
 57  FireplaceQu    729 non-null    object 
 58  GarageType     1383 non-null   object 
 59  GarageYrBlt    1381 non-null   float64
 60  GarageFinish   1381 non-null   object 
 61  GarageCars     1458 non-null   float64
 62  GarageArea     1458 non-null   float64
 63  GarageQual     1381 non-null   object 
 64  GarageCond     1381 non-null   object 
 65  PavedDrive     1459 non-null   object 
 66  WoodDeckSF     1459 non-null   int64  
 67  OpenPorchSF    1459 non-null   int64  
 68  EnclosedPorch  1459 non-null   int64  
 69  3SsnPorch      1459 non-null   int64  
 70  ScreenPorch    1459 non-null   int64  
 71  PoolArea       1459 non-null   int64  
 72  PoolQC         3 non-null      object 
 73  Fence          290 non-null    object 
 74  MiscFeature    51 non-null     object 
 75  MiscVal        1459 non-null   int64  
 76  MoSold         1459 non-null   int64  
 77  YrSold         1459 non-null   int64  
 78  SaleType       1458 non-null   object 
 79  SaleCondition  1459 non-null   object 
dtypes: float64(11), int64(26), object(43)
memory usage: 912.0+ KB

 

 

test에서 'Id' 열을 삭제하고, axis = 1은 열을 삭제하겠다는 의미입니다.

 

test.drop(['Id'], axis=1, inplace=True)
test

 

 

 


 

 

두 개의 데이터프레임인 train과 test를 합쳐서 train_test로 만드는 명령어로, ignore_index는 원래의 인덱스를 무시하고 새로운 인덱스를 생성하겠다는 의미입니다.

 

train_test = pd.concat([train, test], axis=0, ignore_index=True)
train_test

 

 

 

 

msno.matrix() 함수는 결측값을 시각화하는 데 사용됩니다. 

이 함수는 데이터프레임에서 결측값의 패턴을 보여주는 매트릭스 플롯을 생성합니다.

이를 통해 결측값을 한눈에 파악할 수 있습니다.

 

msno.matrix(train_test)

 

 

 

 

 

train_test 데이터프레임에서 숫자형 및 범주형 features를 분리하여 리스트로 저장

 

 

numerical_features = train_test.select_dtypes(include = [int, float]).columns.tolist()
categorical_features = train_test.select_dtypes(include = 'object').columns.tolist()

 

 

 

728x90