サッカー勝敗予測 – SVM

2022年2月11日

目的

ブンデスリーガの勝敗予測をするために、前回前々回いろいろな手法を試したが良い結果は出なかった。
Scikitlearnのチートシートに従って、今回は別種類のSVMを試してみる。

SVM

前々回使ったLinearSVMは線形なカーネル関数を使っていたが、今回使うSVMはカーネル関数を変えることができるので、いろいろ試してみる。
使用するカーネル関数によって、パラメタの種類も変わるようなので、そちらもいろいろ試してみる。

カーネル関数&パラメタ最適化

グリッドサーチでパラメタ探索する。
カーネル関数は、線形関数、放射基底関数、多項式関数、シグモイド関数を探索範囲とする。

from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from sklearn.svm import SVC
from sklearn.model_selection import GridSearchCV

# ブンデスリーガデータ読み込み
df = data_catalog.load('match_result')

# チーム名をダミー変数に変換
df_cat = None
for col in ['HomeTeam', 'AwayTeam']:
    tmp = pd.get_dummies(df[col], prefix=col)
    df_cat = pd.concat([df_cat, tmp], axis=1)
cat_col = df_cat.columns
df = pd.concat([df, df_cat], axis=1)

# 勝ち・負け・引き分けをコード値に変換
df['game_result'] = df['game_result'].astype('category')
df['game_result_cd'] = df['game_result'].cat.codes
display(dict(enumerate(df['game_result'].cat.categories)))

df_train, df_test = train_test_split(df, test_size=0.1, random_state=42)

X = df_train[cat_col]
y = df_train['game_result_cd']
X_test = df_test[cat_col]
y_test = df_test['game_result_cd']

tuned_parameters = [
    {'C': [1, 10, 100, 1000], 'kernel': ['linear']},
    {'C': [1, 10, 100, 1000], 'kernel': ['rbf'], 'gamma': [0.001, 0.0001]},
    {'C': [1, 10, 100, 1000], 'kernel': ['poly'], 'degree': [2, 3, 4], 'gamma': [0.001, 0.0001]},
    {'C': [1, 10, 100, 1000], 'kernel': ['sigmoid'], 'gamma': [0.001, 0.0001]}
    ]
clf = GridSearchCV(SVC(),
                   tuned_parameters,
                   cv=5,
                   scoring='accuracy')
clf.fit(X, y)

print(clf.best_params_)
"""{'C': 1, 'kernel': 'linear'}"""

print(f"train accuracy: {accuracy_score(y, clf.predict(X))}")
"""train accuracy: 0.49920116194625996"""

print(f"test accuracy: {accuracy_score(y_test, clf.predict(X_test))}")
"""test accuracy: 0.5084967320261438"""

グリッドサーチした結果として、線形カーネル関数が一番精度が良かった。
テストデータに対しての正解率は0.51で精度が良いとは言えない。

考察

前回前々回、今回といろいろな手法を試したが、予測精度が期待したほど良くならなかった。
精度改善のためには、手法の工夫よりも特徴量の工夫が必要なのかもしれない。
それを次回は特徴量の工夫を試してみる。