Spark & Hadoop/SparkML

[SparkML/Regression] 보스턴 주택가격 예측 예시 (Linear Regression)

YSY^ 2023. 10. 8. 23:03

보스턴 주택가격 예측

  • 1970년대 미국 인구조사 서비스 (US Census Service)에서 보스턴 지역의 주택 가격 데이터를 수집한 데이터를 기반으로 모델 빌딩
  • 해당 링크에서 다운로드 : https://www.kaggle.com/datasets/vikrishnan/boston-house-prices
  • 개별 주택가격의 예측이 아니라 지역별 중간 주택가격 예측임
  • Regression 알고리즘 사용 예정
  • 연속적인 주택가격을 예측이기에 Classification 알고리즘은 사용불가
  • 총 506개의 레코드로 구성되며 13개의 피쳐와 레이블 필드(주택가격) 로 구성
    • 506개 동네의 주택 중간값 데이터임 (개별 주택이 아님에 유의)
    • 14번째 필드가 바로 예측해야하는 중간 주택 가격
  • Python OLS 회귀분석은 아래 링크 참고
 

[회귀분석] 회귀분석 실습(1) - OLS 회귀분석 결과 해석 및 범주형 변수 처리 (Statsmodel)

Statsmodel을 활용한 회귀분석 statsmodels 패키지에서는 OLS 클래스를 사용하여 선형 회귀분석을 실시한다 독립변수와 종속변수가 모두 포함된 데이터프레임이 생성되며, 상수항 결합은 하지 않아도

ysyblog.tistory.com

 

모델링 

1. SparkSession 생성 및 데이터 읽어오기

from pyspark.sql import SparkSession

spark = SparkSession \
    .builder \
    .appName("Boston Housing Linear Regression example") \
    .getOrCreate()
    
    
data = spark.read.csv('./boston_housing.csv', header=True, inferSchema=True)
data.printSchema()

2. 피쳐 추출과 변환 (Feature Vector 만들기)

from pyspark.ml.feature import VectorAssembler

feature_columns = data.columns[:-1]
assembler = VectorAssembler(inputCols=feature_columns, outputCol="features")
data_2 = assembler.transform(data)
data_2.show()
  • VectorAssembler : input이 되는 컬럼들을 하나로 묶음
    • inputCols는 target 컬럼을 제외한 독립변수들을 묶으며, 이를 묶은 컬럼이 outputcol 이다.
    • assembler는 위 역할을 진행할 object 이다.
  • Transform : 하나의 input을 받아서 새로운 컬럼을 생성

features라는 새로운 컬럼이 추가되었다.

3. Train / Test Set 분리 및 Linear Regression Modeling

  • 2번에서 만든 features 컬럼을 featuresCol을 지정하고, lableCol은 예측해야하는 label값을 넣는다.(종속변수)
train, test = data_2.randomSplit([0.7, 0.3])
from pyspark.ml.regression import LinearRegression

algo = LinearRegression(featuresCol="features", labelCol="medv")
model = algo.fit(train)

4. 모델 성능을 측정한다.

  • Test 데이터로 측정
  • evaluate라는 함수를 사용한다.
  • MAE, RMSE, R2값등을 확인할 수 있다.
evaluation_summary = model.evaluate(test)

print(evaluation_summary.meanAbsoluteError) # 3.078919367841893
print(evaluation_summary.rootMeanSquaredError) #3.934134704246837
print(evaluation_summary.r2) # 0.7596516870936096

5. 모델 예측값과 실제값 비교

predictions = model.transform(test)
predictions.select(predictions.columns[13:]).show()

6. 모델 저장

model.save("boston_housing_model")
model.save(path) #path를 지정하여 저장할 수 있다.

7. 모델 load 및 재사용

from pyspark.ml.regression import LinearRegressionModel

loaded_model = LinearRegressionModel.load(path)  # "boston_housing_model"

위 포스팅은 [파이썬으로 해보는 Spark 프로그래밍 with 프로그래머스] 강의를 듣고 정리한 내용입니다

728x90
반응형