미국 주택 가격 예측

Migug Jutaeg Gagyeog Yecheug



집을 짓는 것은 우리 삶의 어려운 요소 중 하나입니다. 건축 전, 이전 주택 가격을 기준으로 주택 가격을 추정할 수 있습니다. 주택 가격에 큰 영향을 미치는 요인으로는 총 방 수(침대, 욕실 등)와 토지 면적 등이 있습니다. 이를 통해 우리는 집을 짓는 데 필요한 예산을 추정할 수 있습니다.

이 가이드에서는 Python을 통한 머신러닝을 사용하여 미국 주택 가격을 예측하는 방법을 알아봅니다. 먼저 우리가 사용하는 데이터 세트에 대해 논의한 다음 데이터를 전처리합니다. 그런 다음 데이터세트에 존재하는 속성을 시각화하고 훈련 데이터세트에 다양한 머신러닝 알고리즘을 적용합니다(2022년 8월 워싱턴주 시애틀 – 2022년 12월). 마지막으로 테스트 데이터 세트에 있는 일부 주택의 가격을 예측하여 이 가이드를 마무리합니다. 이 프로젝트를 구현하기 전에 이 프로젝트에서 사용되는 기계 학습 용어를 이해해야 합니다.







회귀

기계 학습에서 숫자 데이터로 작업하는 경우 회귀를 이해해야 합니다. 회귀는 독립 속성과 종속 속성(클래스 레이블/대상) 간의 관계를 이해하는 데 사용되는 기계 학습의 지도 학습 기술입니다. 기계는 데이터 세트에 존재하는 각 레코드를 학습하여 주택 가격을 예측합니다. 그러므로 지도학습이다.



예를 들어, 우리 시나리오에서 독립 속성은 침대 수, 욕실 수, 토지 크기, 우편번호 등입니다. 이를 기반으로 우리는 주택 가격을 예측할 수 있습니다. 따라서 이것은 어떤 것에도 의존하지 않는 독립적인 속성입니다. 가격은 이러한 속성에 따라 달라지는 대상 속성 또는 클래스 레이블입니다.



1. 선형 회귀

선형 회귀 알고리즘은 종속 속성(Y)과 독립 속성(X) 변수 간의 선형 관계를 보여줍니다. 수학적으로 다음과 같이 평가할 수 있습니다.





그리고 = aX+b

여기서 'a'와 'b'는 선형 계수입니다.

Python에서는 'sklearn.linear_model' 모듈에서 LinearRegression()을 사용할 수 있습니다. 프로젝트를 구현하면서 이를 지정하는 방법을 살펴보겠습니다. 다음은 매개변수가 있는 모델입니다.



2. 의사결정나무

기본적으로 의사결정나무는 노드를 사용하여 제공되는 조건을 기반으로 문제에 대한 가능한 모든 솔루션을 얻기 위한 그래픽 표현입니다. Decision 노드는 결정을 내리는 데 사용되며 Leaf 노드는 특정 결정의 출력을 참조합니다. Decision Tree Regressor를 사용하여 우리 집 가격을 예측할 수 있습니다.

Python에서는 DecisionTreeRegressor를 'sklearn.tree' 모듈에서 사용할 수 있습니다. 프로젝트를 구현하면서 이를 지정하는 방법을 살펴보겠습니다. 다음은 매개변수가 있는 모델입니다.

3. 랜덤 포레스트

Random Forest는 의사결정나무와 유사한 동일한 기능을 수행합니다. 그러나 이는 포레스트(의사결정 트리 모음)를 사용하고 의사결정 트리의 모든 출력을 결합(평균값)합니다. 예를 들어 Random Forest 크기는 3입니다. 따라서 내부적으로 3개의 결정 트리가 생성되고 첫 번째 결정 트리의 주택 가격 결과는 20000입니다. 두 번째 결정 트리의 주택 가격 결과는 20000입니다. 그리고 주택 가격 결과는 마지막 결정 트리는 10000입니다. 16,666.666은 최종 결과((20000+20000+10000)/3)입니다.

Python에서는 RandomForestRegressor를 'sklearn.ensemble' 모듈에서 사용할 수 있습니다. 다음은 매개변수가 있는 모델입니다. 'n_estimators' 매개변수에 트리 수를 지정할 수 있습니다. 기본적으로 100입니다.

구현

미국 주택 가격 예측과 관련된 단계를 빠르게 확인하세요. 2016년 기록이 포함된 homes_train(CSV 파일) 데이터세트(기계 학습 모델을 훈련하는 데 사용됨)를 고려합니다. 그런 다음 house_test 파일에 있는 주택 가격(505) 레코드를 예측합니다.

1. 학습 및 테스트 데이터 세트 로드

Pandas는 Python에서 데이터 분석에 사용되는 모듈입니다. 이 모듈을 활용하여 데이터 세트를 Python 환경에 로드합니다. 여기서는 구글 주식회사 코드 환경으로. 이는 무료로 제공됩니다. Google 계정만 있으면 됩니다.

먼저 로컬 PC에서 Colab Env로 파일을 로드해야 합니다. 다음에서 데이터세트를 다운로드하세요. 여기 .

# house_train.csv 및 house_test.csv 파일을 Google Colab에 업로드하세요.

# 차례로.

~에서 Google. 수입 파일

파일. 업로드 ( )

read_csv()는 CSV 데이터를 변수에 로드하는 데 사용되는 함수입니다. 파일 이름을 매개변수로 사용합니다.

수입 팬더

# house_train.csv를 train_data 변수에 로드합니다.

기차_데이터 = 팬더. read_csv ( 'houses_train.csv' )

# house_test.csv를 test_data 변수에 로드합니다.

테스트_데이터 = 팬더. read_csv ( 'house_test.csv' )

# test_data를 test_data1 변수에 저장합니다.

테스트_데이터1 = 테스트_데이터

각 열의 열과 Null이 아닌 레코드 수를 살펴보겠습니다. Pandas.DataFrame.info()는 이 정보를 얻는 데 사용됩니다.

인쇄 ( 기차_데이터. 정보 ( ) )

인쇄 ( 테스트_데이터1. 정보 ( ) )

산출:

2. 데이터 전처리

두 데이터세트 모두에서 'lot_size' 열에는 sqft 및 acre 값이 포함됩니다('lot_size_unit's' 열의 행을 보면 차이를 찾을 수 있습니다). 하지만 형식은 sqft 단위여야 합니다. 따라서 'lot_size' 열의 값을 에이커에서 제곱피트로 변환해야 합니다. 마찬가지로 'test_data1'에 대해서도 이 작업이 수행됩니다.

여기에서는 DataFrame.loc[]를 사용하여 'acre'로 'lot_size_units'를 찾고 'lot_size'에 있는 값에 43560을 곱합니다.

# train_data에서 lot_size 에이커 값을 평방 피트로 변환합니다.

기차_데이터. 장소 [ ( 기차_데이터 [ 'lot_size_units' ] == '에이커' ) , '로트_크기' ] = 기차_데이터 [ '로트_크기' ] * 43560

# test_data1에서 lot_size 에이커 값을 평방 피트로 변환합니다.

테스트_데이터1. 장소 [ ( 테스트_데이터1 [ 'lot_size_units' ] == '에이커' ) , '로트_크기' ] = 테스트_데이터1 [ '로트_크기' ] * 43560

인쇄 ( 기차_데이터. 머리 ( ) )

인쇄 ( 테스트_데이터1. 머리 ( ) )

산출:

이제 'lot_size' 열의 모든 값이 sqft 값임을 알 수 있습니다.

이 열에 일부 누락된 값이 있습니다. 열에 있는 NaN 값을 두 데이터 세트의 동일한 열의 평균으로 바꾸겠습니다.

DataFrame['column_name'].fillna()는 평균() 함수를 사용하여 누락된 값을 평균으로 채우는 데 사용됩니다. DataFrame['column_name'].mean()은 finna() 함수에 매개변수로 전달됩니다. 이제 평균을 표시하고 개수를 살펴보겠습니다.

# lot_size 열에 있는 누락된 값을 기존 값의 평균으로 채웁니다.

기차_데이터 [ '로트_크기' ] = 기차_데이터 [ '로트_크기' ] . 느끼다 ( 기차_데이터 [ '로트_크기' ] . 평균 ( ) )

# 표시 평균

인쇄 ( '훈련 데이터 평균값: ' , 기차_데이터 [ '로트_크기' ] . 평균 ( ) )

인쇄 ( 오직 ( 기차_데이터 [ '로트_크기' ] ) )

# lot_size 열에 있는 누락된 값을 기존 값의 평균으로 채웁니다.

테스트_데이터1 [ '로트_크기' ] = 테스트_데이터1 [ '로트_크기' ] . 느끼다 ( 테스트_데이터1 [ '로트_크기' ] . 평균 ( ) )

# 표시 평균

인쇄 ( '테스트 데이터 평균값: ' , 테스트_데이터1 [ '로트_크기' ] . 평균 ( ) )

인쇄 ( 오직 ( 테스트_데이터1 [ '로트_크기' ] ) )

산출:

Train Dataset의 'lot_size' 열에 있는 결측값은 평균값 18789.95194로 대체되고, Test Dataset의 'lot_size' 열에 있는 결측값은 평균값 8961.0으로 대체됩니다.

3. 데이터 정리

모델을 훈련하는 동안 결과를 예측하는 데 필요하지 않은 불필요한 속성이 있습니다. 우리의 경우 두 데이터 세트에서 제거할 'lot_size_units', 'zip_code' 및 'size_units'의 세 가지 속성이 있습니다. pandas.DataFrame.drop()은 두 데이터세트에서 이 세 개의 열을 제거하는 데 사용됩니다.

기차_데이터 = 기차_데이터. 떨어지다 ( [ 'lot_size_units' , '우편 번호' , '크기_단위' ] , 중심선 = 1 )

테스트_데이터1 = 테스트_데이터1. 떨어지다 ( [ 'lot_size_units' , '우편 번호' , '크기_단위' ] , 중심선 = 1 )

인쇄 ( 기차_데이터. 정보 ( ) )

인쇄 ( 테스트_데이터1. 정보 ( ) )

산출:

이제 데이터세트의 상태는 양호합니다. 불필요한 열은 제거되고 누락된 값은 존재하지 않습니다.

4. 데이터 시각화

Train 데이터 열에 대한 히스토그램을 만들어 보겠습니다. pandas.DataFrame.hist() 함수는 모든 속성에 대한 히스토그램을 생성하는 데 사용됩니다.

기차_데이터. 역사 ( 무화과 크기 = ( 4 , 9 ) )

산출:

Train 데이터의 침대, 욕실, 크기, lot_size 및 가격 열에 대한 히스토그램이 생성됩니다.

모든 필드에 대해 서로에 대한 상관 관계를 만들어 보겠습니다. Plotly.express 모듈은 상관 값을 표시하는 데 사용됩니다.

수입 음모적으로. 표현하다

코르 = 기차_데이터. 코르 ( )

# 상관된 데이터를 플롯합니다.

view_fig = 음모적으로. 표현하다 . 임쇼 ( 코르 , text_auto = 진실 )

# 표시하다

view_fig. 보여주다 ( )

산출:

  1. 침대는 가격과 상관관계가 0.2935, lot_size와 상관관계가 -0.059, 크기와 상관관계가 0.77, 욕조와 상관관계가 0.65입니다.
  2. 욕조는 가격과 상관관계가 0.3173, lot_size와 상관관계가 -0.054, 욕조와 상관관계가 0.667, 침대와 상관관계가 0.771입니다.
  3. 크기는 가격과 상관관계가 0.444, lot_size와 상관관계가 -0.044, 크기와 상관관계가 0.667, 침대와 상관관계가 0.652입니다.

5. 모델 준비

train_data에서 가격을 제거하여 가격을 목표로 설정해야 합니다. 이 단계에서는 학습 및 테스트 데이터에 있는 속성이 동일해야 합니다.

표적 = 기차_데이터 [ '가격' ]

기차_데이터 = 기차_데이터. 떨어지다 ( [ '가격' ] , 중심선 = 1 )

인쇄 ( 기차_데이터. 정보 ( ) )

인쇄 ( 테스트_데이터1. 정보 ( ) )

산출:

이제 4개의 독립적인 속성(침대, 욕실, 크기 및 lot_size)이 있으며 가격은 이러한 4가지 속성에 따라 달라지는 종속 속성입니다.

6. 모델 훈련

먼저 RandomForestRegressor 알고리즘을 적용합니다. 'sklearn.ensemble' 패키지에서 가져옵니다. 앙상블 기법이다.

  1. RandomForestRegressor()에서 모델을 만듭니다. 우리는 이 모델에 어떤 매개변수도 전달하지 않습니다. 따라서 의사결정나무의 수는 기본적으로 100개입니다.
  2. 모델을 피팅하려면 fit() 메서드를 사용하세요. 두 개의 매개변수가 필요합니다. 첫 번째 매개변수는 종속 속성이고 두 번째 매개변수는 클래스 레이블/대상입니다.
  3. 모델 정확도를 보려면 점수() 메서드를 사용하세요. 또한 fit() 메소드와 유사한 동일한 매개변수를 사용합니다.
~에서 배운 앙상블 수입 RandomForestRegressor

# 모델 정의

모델1 = RandomForestRegressor ( )

# 모델에 맞게

모델1. 맞다 ( 기차_데이터 , 표적 )

# 모델 정확도

인쇄 ( 모델1. 점수 ( 기차_데이터 , 표적 ) * 100 )

산출:

86.08400889419033

7. 모델 테스트 및 결과 저장

이는 결과를 예측하고 저장해야 하는 마지막 단계입니다.

  1. 예측() 메서드는 테스트 데이터를 예측하는 데 사용됩니다. 모델과 함께 사용되며 중첩된 값 목록/DataFrame을 사용합니다.
  2. to_csv() 메서드를 사용하여 결과를 CSV 파일에 저장합니다.
  3. Python 환경(Google Colab)에서 파일을 다운로드합니다.
# model1을 사용하여 test_data1을 예측합니다.

테스트_데이터 [ '가격' ] = 모델1. 예측하다 ( 테스트_데이터1 )

# test_data를 test_results.csv에 저장합니다.

테스트_데이터. to_csv ( '테스트_결과.csv' )

# Colab에서 이 파일을 다운로드합니다.

파일. 다운로드 ( '테스트_결과.csv' )

산출:

505개의 레코드 중 20개의 레코드를 보여드리겠습니다. 가격 열에 각 주택의 예측 값이 포함되어 있음을 알 수 있습니다.

기타 모델

DecisionTreeRegressor를 사용하여 주택을 예측해 보겠습니다. 'sklearn.tree' 모듈에서 가져올 수 있습니다.

~에서 배운 나무 수입 결정트리회귀자

# 모델 정의

모델2 = 결정트리회귀자 ( )

# 모델에 맞게

모델2. 맞다 ( 기차_데이터 , 표적 )

# 모델 정확도

인쇄 ( 모델2. 점수 ( 기차_데이터 , 표적 ) * 100 )

# model1을 사용하여 test_data1을 예측합니다.

테스트_데이터 [ '가격' ] = 모델2. 예측하다 ( 테스트_데이터1 )

# test_data를 test_results.csv에 저장합니다.

테스트_데이터. to_csv ( '테스트_결과.csv' )

# Colab에서 이 파일을 다운로드합니다.

파일. 다운로드 ( '테스트_결과.csv' )

산출:

99.94183165335028

여기에서 예측 결과를 볼 수 있습니다.

LinearrEgression을 사용하여 주택을 예측해 보겠습니다. 'sklearn.linear_model' 모듈에서 모델을 가져옵니다.

~에서 배운 선형_모델 수입 선형 회귀

# 모델 정의

모델3 = 선형 회귀 ( )

# 모델에 맞게

모델3. 맞다 ( 기차_데이터 , 표적 )

# model1을 사용하여 test_data1을 예측합니다.

테스트_데이터 [ '가격' ] = 모델3. 예측하다 ( 테스트_데이터1 )

# test_data를 test_results.csv에 저장합니다.

테스트_데이터. to_csv ( '테스트_결과.csv' )

# Colab에서 이 파일을 다운로드합니다.

파일. 다운로드 ( '테스트_결과.csv' )

여기에서 예측 결과를 볼 수 있습니다.

결론

이제 방 수, 토지 면적 등과 같은 속성을 기반으로 주택 가격을 예측할 수 있습니다. 이 가이드에서는 워싱턴 주 시애틀의 실제 주택 데이터를 고려했습니다. 선형 회귀, 의사결정 트리, 랜덤 포레스트와 같은 회귀 기법을 사용하여 505채의 주택 가격을 예측했습니다. 모델을 훈련하기 전에 수행해야 하는 모든 단계(데이터 전처리, 데이터 정리 및 데이터 시각화)가 코드 조각 및 출력을 통해 단계별로 설명됩니다.