[TIL] day39

Hyebin·2022년 3월 16일
0

TIL

목록 보기
40/47

#TIL
#실습

PySpark로 ㅌ타이베이시 주택가격 예측하기

데이터셋 설명

이번 문제는 대만 타이베이 시의 신단 지역에서 수집된 주택 거래 관련 정보를 바탕으로 주택 가격(정확히는 주택의 평당 가격)을 예측하는 Regression 모델을 만들어보는 것이다. 총 6개의 피쳐와 주택의 평당 가격에 해당하는 레이블 정보가 훈련 데이터로 제공된다. 레이블의 경우에는 주택의 최종 가격이 아니라 평당 가격이란 점을 다시 한번 강조한다.

각 컬럼에 대한 설명은 아래와 같으며 모든 필드는 X4를 제외하고는 실수 타입이다.

X1: 주택 거래 날짜를 실수로 제공한다. 소수점 부분은 달을 나타낸다. 예를 들어 2013.250이라면 2013년 3월임을 나타낸다 (0.250 = 3/12)
X2: 주택 나이 (년수)
X3: 가장 가까운 지하철역까지의 거리 (미터)
X4: 주택 근방 걸어갈 수 있는 거리내 편의점 수
X5: 주택 위치의 위도 (latitude)
X6: 주택 위치의 경도 (longitude)
Y: 주택 평당 가격

데이터를 불러옵니다!

data = spark.read.csv('./Taipei_sindan_housing.csv', header=True, inferSchema=True)
data.printSchema()

[out]
root
 |-- X1: double (nullable = true)
 |-- X2: double (nullable = true)
 |-- X3: double (nullable = true)
 |-- X4: integer (nullable = true)
 |-- X5: double (nullable = true)
 |-- X6: double (nullable = true)
 |-- Y: double (nullable = true)

data.show()를 통해서 데이터 한번 확인해주고
describe로 특이점이 있나 확인해보기

데이터 클리닝..?

데이터 클리닝을 시도할때 고려해야할 4가지는

  1. categorical한 데이터
  2. 필요없는 데이터
  3. outlier
  4. nul

이지만!
categorical한 데이터 없고, 필요없는 데이터 없고, outlier도 보이지 않으니 null값만 확인해주었습니다.
그치만 다른 팀원분들이 하신걸보니 데이터 전처리로 다른 feature들을 따로 만들어보셨던데 나도.. 해볼걸...

# null count
def countNull(df,var):
  return df.where(df[var].isNull()).count()

missing = {c: countNull(data,c) for c in ['X1','X2','X3','X4','X5','X6']}

print(missing)

일단 null값 개수 세어보기!

[out]
{'X1': 0, 'X2': 0, 'X3': 0, 'X4': 0, 'X5': 0, 'X6': 0}

feature vector 만들기

VectorAssembler를 사용해서 새로운 feature값을 만들어 옆에 붙여주기
feature_columns['X1', 'X2', 'X3', 'X4', 'X5', 'X6']
그리고 transform

from pyspark.ml.feature import VectorAssembler

feature_columns = data.columns[:-1]
assembler = VectorAssembler(inputCols=feature_columns, outputCol="features")
data_2 = assembler.transform(data)

그다음에는 훈련데이터와 테스트데이터를 나누기 (7:3비율)
(요리하는것 같네)

train, test = data_2.randomSplit([0.7, 0.3])

모델 만들기

사용할건 LinearRegression

from pyspark.ml.regression import LinearRegression

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

모델 성능 측정

(원래 예측값도 한번 출력해서 살펴봤지만, 여기선 바로 성능측정으로 넘어가기

evaluation_summary = model.evaluate(test)
evaluation_summary.meanAbsoluteError
[out]
6.6091972821462015

예측값과 실제값의 차이는 약 6.61정도의 오차를 나타내고 있는것 같습니다.

f"RMSE: {evaluation_summary.rootMeanSquaredError:.3f}"
[out]
RMSE: 8.948
f"r2: {evaluation_summary.r2:.3f}"
[out]
r2: 0.555

RMSE: 9.948
r2: 0.555
가 나왔는데 이게 잘나온건지 아닌지 애매하니까 다른 팀원분들 결과와 비교해보니 일단 50% 넘게 나오면 그럭저럭 반은 간것같습니다..!

최고로 잘나오신분이 62? 63? 이였던것같은데 이정도면 선방했다고 자기합리화를 해봅니다. 사실 아무것도 안건드리고 그냥 데이터 있는거 그대로 사용한거라 데이터가 잘 되었어서 그런것같지만 ㅋㅋㅋ

다른 데이터가지고 사용해볼땐 전처리나 정규화나 신경써볼것들이 더 많을것 같습니다.
(타이타닉가지고 시도해봐도 좋겠구먼)

profile
공부중입니다 :D

0개의 댓글

관련 채용 정보