야구 분석/Python

메이저리그 선수들의 WAR 예측하기 4

sam_j_s 2024. 7. 10. 23:43
728x90
반응형

메이저리그 선수들의 WAR 예측하기 3

2024.07.03 - [취미] - 메이저리그 선수들의 WAR 예측하기 2 메이저리그 선수들의 WAR 예측하기 22024.06.30 - [취미] - 메이저리그 선수들의 WAR 예측하기 1 메이저리그 선수들의 WAR 예측하기 1주제메이저

bbdiary03.tistory.com

저번에 메이저리그 선수들의 WAR을 머신러닝으로 예측을 해보았습니다. 이번에는 모델의 성능을 향상하기 위한 몇 가지 방법을 시도해 보겠습니다.
 

정확도 향상시키기

def player_history(df):
    df = df.sort_values("Season")
        
    df["player_season"] = range(0, df.shape[0])
    df["war_corr"] = list(df[["player_season", "WAR"]].expanding().corr().loc[(slice(None), "player_season"),"WAR"])
    df["war_corr"].fillna(0, inplace=True)
    
    df["war_diff"] = df["WAR"] / df["WAR"].shift(1)
    df["war_diff"].fillna(1, inplace=True)
    df["war_diff"][df["war_diff"] == np.inf] = 1
    
    return df

batting = batting.groupby("IDfg", group_keys=False).apply(player_history)

 
우선 'player_history'라는 함수를 만들겠습니다. 이 함수는 선수의 과거 성적을 고려한 예측 변수를 생성함으로써 알고리즘이 보다 정확한 예측을 할 수 있도록 돕습니다.
 
'war_corr'은 시즌별 WAR과 플레이어 시즌 간의 상관 계수를 나타냅니다. 'expanding(). corr()'를 사용하여 점진적으로 계산된 상관 계수를 얻습니다. NaN 값을 0으로 채워 넣어 초기 값이 누락되지 않도록 합니다.
 
'war_diff'은 현재 시즌 WAR과 이전 시즌 WAR의 비율을 나타냅니다. shift(1)를 사용하여 이전 시즌의 WAR 값을 가져와 현재 시즌의 WAR 값과 나눕니다. NaN 값을 1로 채워 넣고, 무한대 값도 1로 설정하여 데이터의 일관성을 유지합니다.
 
그다음 데이터프레임을 그룹별로 적용하여 각 플레이어에 대한 데이터를 전처리하는 함수를 만듭니다. 'IDfg'별로 데이터를 그룹화합니다. 각 그룹에 대해 player_history 함수를 적용하여 새로운 예측 변수를 생성합니다. group_keys=False를 사용하여 그룹화된 인덱스를 유지하지 않고, 원래 데이터프레임의 형태를 유지합니다.

def group_averages(df):
    return df["WAR"] / df["WAR"].mean()

 
그 다음 'group_averages'라는 함수를 만들겠습니다. 평균은 전체 시즌의 평균을 찾고 그 평균을 플레이어의 행동과 비교하는데 도움이 됩니다. 플레이어의 WAR을 해당 시즌의 WAR로 나누어서 주어진 시즌에 대해 알려준다는 것입니다. 해당 시즌에 플레이어의 성적이 평균 선수보다 좋거나 나빴는지 알 수 있습니다.
 
코로나로 인해 단축시즌이었던 2020년에는 플레이어들이 더 적은 수의 게임을 뛰어서 WAR이 낮을 수밖에 없습니다. 데이터에서 보면 WAR이 확 떨어지지만 이는 플레이어가 못한 것이 아니라 더 적은 수의 게임을 뛰었기 때문에 이를 수정하는데 도움이 됩니다. 

batting["war_season"] = batting.groupby("Season", group_keys=False).apply(group_averages)

 
이번에는 "war_season'이라는 열을 만들고 이번에는 시즌별로 그룹화하므로 각 시즌마다 하나의 그룹이 생성되어 데이터가 분할됩니다. 시즌별로 프레임을 구성하고 인덱스를 어지럽히는 것을 피하기 위해 다시 'group_keys=False'를 해줍니다. 만들어둔 'group_averages'를 적용하여 각 플레이어가 수행한 방식 사이의 평균을 구합니다. 그 시즌에 일반 플레이어가 어떻게 했는지 계속해서 실행해 줍니다.

new_predictors = predictors + ["player_season", "war_corr", "war_season", "war_diff"]

 
예측 변수에 플레이어 시즌을 더한 새로운 예측 변수라는 목록을 만들어 주었습니다.

predictions = backtest(batting, rr, new_predictors)

 
새로운 예측 변수로 함수를 다시 돌려보았습니다.

mean_squared_error(predictions["actual"], predictions["prediction"])

평균 제곱 오차를 구해보면 2.627이 나오는 것을 알 수 있습니다. 이전의 나온 2.667보다 약간 나아졌습니다. 따라서 새로운 예측 변수로 개선되었다는 것을 알 수 있습니다.

728x90
반응형

'야구 분석/Python'의 다른글

  • 현재글 메이저리그 선수들의 WAR 예측하기 4

관련글