이번 프로젝트에서는 1~200위까지 순위를 예측했다. 사용된 test 데이터는 2020년 4월 19일이고, 그 외 데이터들이 train과 validation set이다.
원래 순위 예측과는 다르게 Classification이 아닌 Regression으로 순위를 예측하려고 한다. Regression을 통해 실제 순위와 얼마나 차이 나는지 파악했다. Classification의 경우 정확하게 예측하지 않는 이상 예측 평가에서 매우 떨어지기 때문에 실제값과 예측값간의 차이를 나타낼 수 있는 Regression으로 예측하기로 했다.
각 모델별로 Cross Validation을 통해 모델의 유효성을 검증했다. 모델의 성능 평가는 RMSE를 사용했다. \[
RMSE = \sqrt{\frac{1}{n}\Sigma(\hat{y}_i - y_i)^2}
\]
처음에는 순위를 10위 단위로 묶어서 Classification을 진행했다. 그러나 분석을 진행하면서 범주로 10위 단위로 묶었을 때 성능은 좋더라도 정확한 예측이라고는 판단하기 힘들었다. 특히 이전 순위를 그대로 따라가는 경향을 보였다. 왜냐하면 11위와 19위는 똑같은 범주 안에 묶여있고 주 단위로는 크게 변하지 않기 때문이다. 이러한 결과는 본 조에서 원하는 결과는 아니었다. 따라서 본 조는 Classification이 아닌 Regression을 통해서 1~200위를 예측하는 것이 타당하다고 생각했다.
Regression을 통해서 보려는 것은 다음과 같다.
from sklearn.linear_model import LinearRegression
LR_model = LinearRegression()
stf = StratifiedKFold(n_splits = 5, shuffle = True, random_state = 1)
score = -1 * cross_val_score(LR_model, X_train, y_train, cv = stf, scoring = 'neg_mean_squared_error')
LR_model.fit(X_train,y_train)
pred_y = LR_model.predict(X_test)
모델의 성능은 다음과 같이 나왔다.
f_model = RandomForestRegressor(random_state =1, n_estimators = 500)
stf = StratifiedKFold(n_splits = 5, shuffle = True, random_state = 1)
score = -1 * cross_val_score(f_model, X_train, y_train, cv = stf, scoring = 'neg_mean_squared_error')
f_model(X_train,y_train)
pred_y = f_model.predict(X_test)
변수 중요도는 다음과 같은 순서로 나왔다.
모델 성능은 다음과 같이 나왔다.
from catboost import CatBoostRegressor
cat_model = CatBoostRegressor(n_estimators= 5000, learning_rate = 0.001, border_count = 7, depth = 10, random_state= 1,cat_features = cat)
stf = StratifiedKFold(n_splits = 5, shuffle = True, random_state = 1)
score = cross_val_score(model, X_train, y_train, cv = stf, scoring = 'neg_mean_squared_error')
cat_model.fit(X_train,y_train)
pred_y = cat_model.predict(X_test)
변수 중요도는 다음과 같은 순서로 나왔다.
모델 성능은 다음과 같이 나왔다.
from xgboost import XGBRegressor
xg_model = XGBRegressor(n_estimators = 2000,learning_rate = 0.05, random_state = 1)
stf = StratifiedKFold(n_splits = 5, shuffle = True, random_state = 1)
score = cross_val_score(model, X_train, y_train, cv = stf, scoring = 'neg_mean_squared_error')
xg_model.fit(X_train, y_train)
pred_y = xg_model.predict(X_test)
변수 중요도는 다음과 같은 순서로 나왔다.
다른 모델과는 다르게 상대적으로 previous ranking이 덜 중요한 것을 확인할 수 있다. 다른 모델에 비해 이전 순위가 아닌 소셜 미디어와 관련된 변수들이 중요하게 작용했다.
모델 성능은 다음과 같이 나왔다.
최종적으로 다음과 같이 결과가 나왔다.
Model | Valid | Test |
---|---|---|
LinearRegression | 21.009 | 21.325 |
RandomForest | 18.771 | 21.330 |
CatBoost | 20.827 | 22.286 |
XGBoost | 18.640 | 21.16875 |