슬코생

[kaggle] Bike Sharing Demand 공공자전거 수요 예측 모델 #3 본문

Data/Project

[kaggle] Bike Sharing Demand 공공자전거 수요 예측 모델 #3

ashbeen 2020. 1. 29. 21:51

Score RMSLE

from sklearn.metrics import make_scorer

def rmsle(predicted_values, actual_values):
    # 넘파이로 배열 형태로 바꿔준다.
    predicted_values = np.array(predicted_values)
    actual_values = np.array(actual_values)
    
    # 예측값과 실제 값에 1을 더하고 로그를 씌워준다.
    log_predict = np.log(predicted_values + 1)
    log_actual = np.log(actual_values + 1)
    
    # 위에서 계산한 예측값에서 실제값을 빼주고 제곱을 해준다.
    difference = log_predict - log_actual
    # difference = (log_predict - log_actual) ** 2
    difference = np.square(difference)
    
    # 평균을 낸다.
    mean_difference = difference.mean()
    
    # 다시 루트를 씌운다.
    score = np.sqrt(mean_difference)
    
    return score

rmsle_scorer = make_scorer(rmsle)
rmsle_scorer
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score

k_fold = KFold(n_splits=10, shuffle=True, random_state=0)

RandomForest

from sklearn.ensemble import RandomForestRegressor
max_depth_list = []
model = RandomForestRegressor(n_estimators=100,
                              n_jobs=-1,
                              random_state=0)
model

n_estimators 값을 높이면 시간이 오래걸리기 때문에 100으로 초기화하고 진행한다. 

%time score = cross_val_score(model, X_train, y_train, cv=k_fold, scoring=rmsle_scorer)
score = score.mean()

print("Score= {0:.5f}".format(score))

0에 근접할수록 좋은 데이터!

train data

model.fit(X_train, y_train)

모델을 학습시키기 위해 피팅이 필요하다. 피쳐와 레이블을 넣어주면 알아서 학습을 해야 한다.

예측

predictions = model.predict(X_test)

print(predictions.shape)
predictions[0:10]
# 예측한 데이터를 시각화 해본다. 
fig,(ax1,ax2)= plt.subplots(ncols=2)
fig.set_size_inches(12,5)
sns.distplot(y_train,ax=ax1,bins=50)
ax1.set(title="train")
sns.distplot(predictions,ax=ax2,bins=50)
ax2.set(title="test")

0에 굉장히 몰려 있음을 볼 수 있다.

submit

submission = pd.read_csv("../input/bike-sharing-demand/sampleSubmission.csv")
submission
submission["count"] = predictions
print(submission.shape)
submission.head()
submission.to_csv("Score_{0:.5f}_sampleSubmission.csv".format(score), index=False)

제출 끝!

Comments