logistic=LogisticRegression(solver='sag')
param_logistic={'C': [0,0.001, 0.01, 0.1, 1, 10, 100], 'penalty' : ['l2','l1','none']}
grid_logistic=GridSearchCV(logistic,param_grid=param_logistic, cv=5, refit=True)
grid_logistic.fit(X_train,y_train)
print("best_param:",grid_logistic.best_params_)
print("mean cv of best parameter:",grid_logistic.best_score_)
best_param: {'C': 0.001, 'penalty': 'l2'}
mean cv of best parameter: 0.5545893719806763
hyper parameter를 사용한 Logistic Regression 모델에서 예측한 test data에 대한 2Q 종료 후 기대 승률은 다음과 같습니다.
estimator_logistic=LogisticRegression(C=0.001,penalty='l2',solver='sag')
estimator_logistic.fit(X_train,y_train)
probability=estimator_logistic.predict_proba(X_test)
probability
estimator_logistic.classes_
array([0, 1])
이를 이용하여 각 test data에 대한 홈팀의 2Q 종료 후 기대 승률을 다음과 같이 구할 수 있습니다. (이미지에는 일부만 포함)
probability[:,1]
LogisticRegression Classifier의 예측 확률(predict_proba)을 사용한 승부 예측 결과입니다.
preds_logistic=estimator_logistic.predict(X_test)
preds_logistic
accuracy_list=[]
precision_list=[]
recall_list=[]
f1_list=[]
for i in range(3):
estimator_logistic=LogisticRegression(C=0.001,penalty='l2',solver='sag')
estimator_logistic.fit(X_train,y_train)
print("\n",estimator_logistic.coef_,"\n")
preds_logistic=estimator_logistic.predict(X_test)
test_accuracy_logistic=accuracy_score(preds_logistic,y_test)
accuracy_list.append(test_accuracy_logistic)
precision_list.append(precision_score(preds_logistic, y_test))
recall_list.append(recall_score(preds_logistic, y_test))
f1_list.append(f1_score(preds_logistic, y_test))
print(i+1," test accuracy of logistic : ",test_accuracy_logistic)
confusion_matrix(y_test, preds_logistic)
print("accuracy list : ",accuracy_list)
print("mean of test accuracy : ",np.mean(accuracy_list))
print("variance of test accuracy : ", np.var(accuracy_list))
train data를 fit할 때마다 coefficient가 아주 약간씩 달라지지만 예측 결과는 변하지 않습니다. 이에 따라 predict accuracy가 계속 같은 값이 나오는 것을 볼 수 있습니다.
모델의 평균 test accuracy는 0.5426917510853835 이고 variance는 0입니다.
모델의 예측 정확도가 그리 높지 않습니다.
print("precision list : ",precision_list)
print("mean of test precision : ",np.mean(precision_list))
print("recall list : ",recall_list)
print("mean of test recall : ",np.mean(recall_list))
print("f1 list : ",f1_list)
print("mean of test f1 : ",np.mean(f1_list))
어떤 한 경기에 대한 기대승률 및 승부를 예측하고 싶다면 다음과 같은 과정을 거치면 됩니다. 아래 예시는 2015년 2월 11일에 치러진 Golden State Warriors (Home) 과 Minnesota Timberwolves (Away)의 경기의 전반전 세부 스탯 데이터에 대한 기대 승률 및 승부 예측과정입니다.
# 1. 데이터 입력
test_match_stat=pd.DataFrame(columns=['Team_H','Team_A',
'MP_H','FG_H','FGA_H','FG%_H','3P_H','3PA_H','3P%_H','FT_H','FTA_H','FT%_H','ORB_H','DRB_H','TRB_H','AST_H','STL_H','BLK_H','TOV_H','PF_H','PTS_H',
'MP_A','FG_A','FGA_A','FG%_A','3P_A','3PA_A','3P%_A','FT_A','FTA_A','FT%_A','ORB_A','DRB_A','TRB_A','AST_A','STL_A','BLK_A','TOV_A','PF_A','PTS_A'])
test_match_stat.loc[0]=['GSW','MIN',120,24,46,.522,4,14,.286,4,5,.800,7,21,28,15,4,3,11,7,56, 120,18,46,.391,4,10,.400,6,8,.750,6,14,20,11,5,0,8,7,46]
test_match_stat
#2. data Preprocessing
#1) NA imputation
if(test_match_stat['FT%_H'].empty):
test_match_stat['FT%_H']= -1.0
if(test_match_stat['FT%_A'].empty):
test_match_stat['FT%_A']= -1.0
#2) MP 변수 삭제
test_match_stat=test_match_stat.drop(['MP_H','MP_A'],axis=1)
#3) 2점 야투에 대한 변수 생성 및 전체 야투 변수 삭제
test_match_stat['2P_H']=test_match_stat['FG_H']-test_match_stat['3P_H']
test_match_stat['2P_A']=test_match_stat['FG_A']-test_match_stat['3P_A']
test_match_stat['2PA_H']=test_match_stat['FGA_H']-test_match_stat['3PA_H']
test_match_stat['2PA_A']=test_match_stat['FGA_A']-test_match_stat['3PA_A']
test_match_stat['2P%_H']=test_match_stat['2P_H']/test_match_stat['2PA_H']
test_match_stat['2P%_A']=test_match_stat['2P_A']-test_match_stat['2PA_A']
test_match_stat=test_match_stat.drop(['FG_H','FG_A','FGA_H','FGA_A','FG%_H','FG%_A'],axis=1)
#4) ORB,DRB, Team feature 삭제
test_match_stat=test_match_stat.drop(['ORB_H','ORB_A','DRB_H','DRB_A','Team_H','Team_A'],axis=1)
#4) Log Transformation, Square Transformation
test_match_stat["BLK_H"] = np.log1p(test_match_stat["BLK_H"][0])
test_match_stat["BLK_A"] = np.log1p(test_match_stat["BLK_A"][0])
test_match_stat['FT%_H']=(test_match_stat['FT%_H'])**2
test_match_stat['FT%_A']=(test_match_stat['FT%_A'])**2
#3. Fit 되어 있는 모델 사용하여 Predict
probability_of_victory=estimator_logistic.predict_proba(test_match_stat)
print("홈팀의 2Q 종료 후 기대 승률 : ",probability_of_victory[0][1])
predict_of_victory=estimator_logistic.predict(test_match_stat)
if(predict_of_victory==1):
print("승부 예측 - Home Team 승리 ")
else:
print("승부 예측 - Away Team 승리")