#TIL
#실습
데이터셋 설명
이번 문제는 대만 타이베이 시의 신단 지역에서 수집된 주택 거래 관련 정보를 바탕으로 주택 가격(정확히는 주택의 평당 가격)을 예측하는 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가지는
이지만!
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}
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? 이였던것같은데 이정도면 선방했다고 자기합리화를 해봅니다. 사실 아무것도 안건드리고 그냥 데이터 있는거 그대로 사용한거라 데이터가 잘 되었어서 그런것같지만 ㅋㅋㅋ
다른 데이터가지고 사용해볼땐 전처리나 정규화나 신경써볼것들이 더 많을것 같습니다.
(타이타닉가지고 시도해봐도 좋겠구먼)