サッカー勝敗予測 – SVM
目的
ブンデスリーガの勝敗予測をするために、前回、前々回いろいろな手法を試したが良い結果は出なかった。
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で精度が良いとは言えない。
考察
前回、前々回、今回といろいろな手法を試したが、予測精度が期待したほど良くならなかった。
精度改善のためには、手法の工夫よりも特徴量の工夫が必要なのかもしれない。
それを次回は特徴量の工夫を試してみる。
ディスカッション
コメント一覧
まだ、コメントがありません