본문 바로가기
Project

[프로젝트] 고인물의 스팀 게임추천 #4 모델링

by nothing-error 2023. 1. 25.

1. 하이퍼파라미터 튜닝 및 평가

%pyspark
from pyspark.ml.evaluation import RegressionEvaluator
from pyspark.ml.recommendation import ALS
from pyspark.ml.tuning import CrossValidator, ParamGridBuilder

# Create a SparkSession
spark = SparkSession.builder.appName("ALS_steam").getOrCreate()

# Load the data into a DataFrame

# Prepare data
(trainingData, testData) = data.randomSplit([0.8, 0.2])



# Define the ALS model
als = ALS(userCol="steamid", itemCol="appid", ratingCol="playtime_at_review", coldStartStrategy="drop")

# Define the grid search
grid = ParamGridBuilder() \
    .addGrid(als.rank, [5,20]) \
    .addGrid(als.maxIter, [20]) \
    .addGrid(als.regParam, [0.1]) \
    .build()

# Define the evaluation metric
evaluator = RegressionEvaluator(metricName="rmse", labelCol="playtime_at_review", predictionCol="prediction")

# Define the cross validator
cv = CrossValidator(estimator=als, estimatorParamMaps=grid, evaluator=evaluator, numFolds=5)

# Fit the model
cvModel = cv.fit(trainingData)

# Make predictions
predictions = cvModel.transform(testData)

# Evaluate the model
rmse = evaluator.evaluate(predictions)
print("RMSE = " + str(rmse))

# Get the best model
bestModel = cvModel.bestModel
print("Best rank: ", bestModel._java_obj.parent().getRank())
print("Best maxIter: ", bestModel._java_obj.parent().getMaxIter())
print("Best regParam: ", bestModel._java_obj.parent().getRegParam())
# RMSE = 1777.9669450736412
# Best rank:  20
# Best maxIter:  20
# Best regParam:  0.1

train, test 가장 무난한 8:2 로 세팅하였고 하이퍼파라미터 튜닝은 그리드서치를 사용하였다.

많은 파라미터 값들을 넣고 테스트해보고 싶었으나 memory 에 대한 이슈가 계속 발생하여 최소한의 파라미터만 설정해놓았다.  k-fold  는 5로 세팅해서 훈련을 진행했다.

평가 방법은 RMSE로 오류가 가장 적게 나오도록 수차례 테스트 했을 때 1700~1800 대 정도의 값이 나왔다. 

bestmodel이긴 한데... 일단 추천을 해보았다.

 

 

2. steamid : 70440392 유저의 게임 리뷰

 

3. 학습된 모델로 게임 추천

%pyspark 

user_subset=data.where(data.steamid == 0)
num_items=1

user_subset_recs = bestModel.recommendForUserSubset(user_subset, num_items)
user_subset_recs.printSchema()
user_subset_recs.show(truncate=False)

 

 

4. steamid : 0 에게 추천하는 게임

recommend_game=user_subset_recs.take(1)[0][1][0][0]
app_ids.filter(col("appid") == recommend_game).show()

5. 느낌 점

  • 리뷰데이터를 수집하는 과정에서 시간적인 제한이 있다보니 완벽한 데이터수집에 어려움이 있었고, 한국어 리뷰 뿐만이 아니라 전체 리뷰를 대상으로 수집해서 train 해보고 싶은 욕심이 있다. kaggle에 steam reiview 데이터 전체를 올려주신 분이 계시지만 8GB 가 넘어가긴 하지만 null 값을 제거하면 상당히 많이 줄어들어서 아쉬움이 조금 있었다.
  • spark로 수집한 데이터를 확인하고 모델링을 하는 과정에서 컴퓨터 자원이 상당히 많이 부족함을 느꼈다. (클러스터 :2코어 8기가의 서버 4대로 구성)
  • 빅데이터가 아닌 스몰데이터의 경우 spark이 아닌 pandas 만으로도 충분한것 같다.

 

 

 

 

댓글