{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Example usage\n", "\n", "Here we will demonstrate how to use the `stepsel` package for stepwise selection of variables in a regression model and how to prepare categorical data for such a model." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "# Importing the packages\n", "import stepsel\n", "import numpy as np\n", "import statsmodels.api as sm" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Load the data\n", "First we load the data and take a look at the first few rows. It is soccer data from Czech First League." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(518, 24) Index(['match_id', 'match_datetime', 'team', 'hga', 'team_opp', 'goals',\n", " 'goals_opp', 'yellow', 'yellow_opp', 'red', 'red_opp', 'penalty',\n", " 'penalty_opp', 'fouls', 'fouls_opp', 'attacks', 'attacks_opp',\n", " 'dangerous_attacks', 'dangerous_attacks_opp', 'ref_interv',\n", " 'ref_interv_opp', 'ref_interv_per_attack', 'ref_interv_per_attack_opp',\n", " 'ref_interv_per_attack_diff'],\n", " dtype='object')\n" ] } ], "source": [ "dt = stepsel.datasets.load_soccer_data()\n", "print(dt.shape, dt.columns)" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
match_idmatch_datetimeteamhgateam_oppgoalsgoals_oppyellowyellow_oppred...fouls_oppattacksattacks_oppdangerous_attacksdangerous_attacks_oppref_intervref_interv_oppref_interv_per_attackref_interv_per_attack_oppref_interv_per_attack_diff
012023-05-14 18:00:00BohemiansHSlovácko0.00.0220...12.0117.0142.071.088.020.018.00.1408450.153846-0.013001
122023-05-14 15:00:00JablonecHBaník Ostrava1.01.0110...11.090.0116.074.058.014.022.00.1206900.244444-0.123755
232023-05-14 15:00:00TepliceHZlín2.01.0440...14.0118.0134.054.062.030.026.00.2238810.2203390.003542
342023-05-14 15:00:00Zbrojovka BrnoHPardubice0.02.0120...14.099.0126.057.076.017.036.00.1349210.363636-0.228716
452023-05-13 18:00:00Sparta PrahaHSlavia Praha3.02.0120...15.087.0145.047.094.015.029.00.1034480.333333-0.229885
\n", "

5 rows × 24 columns

\n", "
" ], "text/plain": [ " match_id match_datetime team hga team_opp goals \\\n", "0 1 2023-05-14 18:00:00 Bohemians H Slovácko 0.0 \n", "1 2 2023-05-14 15:00:00 Jablonec H Baník Ostrava 1.0 \n", "2 3 2023-05-14 15:00:00 Teplice H Zlín 2.0 \n", "3 4 2023-05-14 15:00:00 Zbrojovka Brno H Pardubice 0.0 \n", "4 5 2023-05-13 18:00:00 Sparta Praha H Slavia Praha 3.0 \n", "\n", " goals_opp yellow yellow_opp red ... fouls_opp attacks attacks_opp \\\n", "0 0.0 2 2 0 ... 12.0 117.0 142.0 \n", "1 1.0 1 1 0 ... 11.0 90.0 116.0 \n", "2 1.0 4 4 0 ... 14.0 118.0 134.0 \n", "3 2.0 1 2 0 ... 14.0 99.0 126.0 \n", "4 2.0 1 2 0 ... 15.0 87.0 145.0 \n", "\n", " dangerous_attacks dangerous_attacks_opp ref_interv ref_interv_opp \\\n", "0 71.0 88.0 20.0 18.0 \n", "1 74.0 58.0 14.0 22.0 \n", "2 54.0 62.0 30.0 26.0 \n", "3 57.0 76.0 17.0 36.0 \n", "4 47.0 94.0 15.0 29.0 \n", "\n", " ref_interv_per_attack ref_interv_per_attack_opp \\\n", "0 0.140845 0.153846 \n", "1 0.120690 0.244444 \n", "2 0.223881 0.220339 \n", "3 0.134921 0.363636 \n", "4 0.103448 0.333333 \n", "\n", " ref_interv_per_attack_diff \n", "0 -0.013001 \n", "1 -0.123755 \n", "2 0.003542 \n", "3 -0.228716 \n", "4 -0.229885 \n", "\n", "[5 rows x 24 columns]" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dt.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Binning the data\n", "There are two ways to bin data in `stepsel` package: by specifying the cut points or optimal binning. We will demonstrate both." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### By specifying the cut points" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "fouls_opp_cat1\n", "(8, 12] 195\n", "(12, 16] 167\n", "(-Inf, 8] 84\n", "(16, 20] 58\n", "(20, Inf) 14\n", "Name: count, dtype: int64" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dt[\"fouls_opp_cat1\"] = stepsel.binning.bin_values(dt[\"fouls_opp\"], [8, 12, 16, 20])\n", "dt[\"fouls_opp_cat1\"].value_counts()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Optimal binning\n", "Optimal binning can be time consuming, so when the data is large, and there are many cp values, they are grouped using K-means clustering and only the best clusters are used. This process is controlled by the Flow Parameters (see the docstring).\n", "Other parameters are used to control the scikit-learn's `DecisionTreeRegressor`, `KMeans` and `GridSearchCV`." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "Starting cross-validation for 58 cp values at 15:20:32.\n", "Estimated runtime: 0.015105549494425457 minutes.\n" ] }, { "data": { "image/png": "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AAAAhiB4AgAAAAAAgCEIngAAAAAAAGAIgicAAAAAAAAYguAJAAAAAAAAhiB4AgAAAAAAgCEIngAAAAAAAGAIgicAAAAAAAAYguAJAAAAAAAAhiB4AgAAAAAAgCEIngAAAAAAAGAIgicAAAAAAAAYguAJAAAAAAAAhiB4AgAAAAAAgCEIngAAAAAAAGAIgicAAAAAAAAYguAJAAAAAAAAhiB4AgAAAAAAgCEIngAAAAAAAGAIgicAAAAAAAAYguAJAAAAAAAAhiB4AgAAAAAAgCEIngAAAAAAAGAIgicAAAAAAAAYguAJAAAAAAAAhiB4AgAAAAAAgCEIngAAAAAAAGAIgicAAAAAAAAYguAJAAAAAAAAhiB4AgAAAAAAgCEIngAAAAAAAGAIgicAAAAAAAAYguAJAAAAAAAAhiB4AgAAAAAAgCEIngAAAAAAAGAIgicAAAAAAAAYguAJAAAAAAAAhiB4AgAAAAAAgCEIngAAAAAAAGAIgicAAAAAAAAYguAJAAAAAAAAhiB4AgAAAAAAgCEIngAAAAAAAGAIgicAAAAAAAAYguAJAAAAAAAAhiB4AgAAAAAAgCEIngAAAAAAAGAIgicAAAAAAAAYguAJAAAAAAAAhiB4AgAAAAAAgCEIngAAAAAAAGAIgicAAAAAAAAYguAJAAAAAAAAhiB4AgAAAAAAgCEIngAAAAAAAGAIgicAAAAAAAAYguAJAAAAAAAAhiB4AgAAAAAAgCEIngAAAAAAAGAIgicAAAAAAAAYguAJAAAAAAAAhiB4AgAAAAAAgCEIngAAAAAAAGAIgicAAAAAAAAYguAJAAAAAAAAhiB4AgAAAAAAgCEIngAAAAAAAGAIgicAAAAAAAAYguAJAAAAAAAAhiB4AgAAAAAAgCEIngAAAAAAAGAIgicAAAAAAAAYguAJAAAAAAAAhiB4AgAAAAAAgCEIngAAAAAAAGAIgicAAAAAAAAYguAJAAAAAAAAhiB4AgAAAAAAgCEIngAAAAAAAGAIgicAAAAAAAAYguAJAAAAAAAAhiB4AgAAAAAAgCEIngAAAAAAAGAIgicAAAAAAAAYguAJAAAAAAAAhiB4AgAAAAAAgCEIngAAAAAAAGAIgicAAAAAAAAYguAJAAAAAAAAhiB4AgAAAAAAgCEIngAAAAAAAGAIgicAAAAAAAAYguAJAAAAAAAAhiB4AgAAAAAAgCEIngAAAAAAAGAIgicAAAAAAAAYguAJAAAAAAAAhiB4AgAAAAAAgCEIngAAAAAAAGAIgicAAAAAAAAYguAJAAAAAAAAhiB4AgAAAAAAgCEIngAAAAAAAGAIgicAAAAAAAAYguAJAAAAAAAAhiB4AgAAAAAAgCEIngAAAAAAAGAIgicAAAAAAAAYguAJAAAAAAAAhiB4AgAAAAAAgCEIngAAAAAAAGAIgicAAAAAAAAYguAJAAAAAAAAhiB4AgAAAAAAgCEIngAAAAAAAGAIgicAAAAAAAAYguAJAAAAAAAAhiB4AgAAAAAAgCEIngAAAAAAAGAIgicAAAAAAAAYguAJAAAAAAAAhiB4AgAAAAAAgCEIngAAAAAAAGAIgicAAAAAAAAYguAJAAAAAAAAhiB4AgAAAAAAgCEIngAAAAAAAGAIgicAAAAAAAAYguAJAAAAAAAAhiB4AgAAAAAAgCEIngAAAAAAAGAIgicAAAAAAAAYguAJAAAAAAAAhiB4AgAAAAAAgCEIngAAAAAAAGAIgicAAAAAAAAYguAJAAAAAAAAhiB4AgAAAAAAgCEIngAAAAAAAGAIgicAAAAAAAAYguAJAAAAAAAAhiB4AgAAAAAAgCEIngAAAAAAAGCI/weGNr50UP2a2wAAAABJRU5ErkJggg==", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "X = np.array(dt.loc[:, [\"fouls_opp\"]])\n", "y = np.array(dt.loc[:, \"goals\"])\n", "\n", "clf = stepsel.binning.optimal.OptimalBinningUsingDecisionTreeRegressor(\n", " criterion = 'poisson',\n", " scoring = \"neg_mean_poisson_deviance\",\n", " refit = \"neg_mean_poisson_deviance\",\n", " max_depth = 3\n", ")\n", "clf.fit(X, y) # Fit the model\n", "clf.set_feature_names([\"fouls_opp\"]) # Set the feature names for the plot\n", "clf.plot_tree((15,10)) # Plot the tree" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "fouls_opp_cat2\n", "1.551570 446\n", "1.152778 72\n", "Name: count, dtype: int64" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Predicting the values\n", "dt[\"fouls_opp_cat2\"] = clf.predict(X)\n", "dt[\"fouls_opp_cat2\"].value_counts()" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "# Creating the bins\n", "dt[\"fouls_opp_cat2\"] = clf.bin_values(dt[\"fouls_opp\"])\n", "dt[\"fouls_opp_cat2\"] = dt[\"fouls_opp_cat2\"].astype(\"category\")" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'fouls_opp': array([16.5])}" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Function to get the cut points can be used for any scikit-learn tree based model\n", "# The final tree can be obtained from the cv_fit attribute of the model Log object\n", "stepsel.binning.helper.get_tree_cut_points(clf.Log.fit_log[\"cv_fit\"].best_estimator_, feature_names=[\"fouls_opp\"])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Setting the reference category\n", "You can order any number of teams, the first one will be the reference category" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Series is not categorical, converting to categorical.\n", "Series is not categorical, converting to categorical.\n", "Series is not categorical, converting to categorical.\n", "Series is not categorical, converting to categorical.\n" ] } ], "source": [ "dt[\"hga\"] = stepsel.modeling.prep.relevel_categorical_variable(dt[\"hga\"], [\"H\"])\n", "dt[\"team\"] = stepsel.modeling.prep.relevel_categorical_variable(dt[\"team\"], [\"Bohemians\", \"Jablonec\"])\n", "dt[\"team_opp\"] = stepsel.modeling.prep.relevel_categorical_variable(dt[\"team_opp\"], [\"Bohemians\", \"Jablonec\", \"Teplice\"])\n", "dt[\"fouls_opp_cat1\"] = stepsel.modeling.prep.relevel_categorical_variable(dt[\"fouls_opp_cat1\"], [\"(-Inf, 8]\"])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Stepwise selection\n", "The most important parameters for the selection are `formula`, `include`, `slentry` and `slstay`. Specifying the formula in R-style format, the variables to always include in the model, and the significance levels of the likelihood ratio test for entering and staying in the model." ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "# Parameters for the model\n", "formula = \"goals ~ team + hga + red_opp + fouls_opp_cat1 + fouls_opp_cat2\"\n", "include = ['ref_interv_per_attack * ref_interv_per_attack_opp', \"penalty\"]\n", "slentry = 0.05\n", "slstay = 0.10\n", "family = sm.families.Poisson()" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Best entry candidates:\n", " feature p_value\n", "0 team 0.000002\n", "1 hga 0.000609\n", "2 red_opp 0.005159\n", "3 fouls_opp_cat2 0.013067\n", "4 fouls_opp_cat1 0.060894\n", ">> team entered the model.\n", "\n", "Best removal candidates:\n", " feature p_value\n", "0 team 0.000002\n", ">> No feature removed from the model.\n", "\n", "Best entry candidates:\n", " feature p_value\n", "0 hga 0.000608\n", "1 red_opp 0.004282\n", "2 fouls_opp_cat2 0.045388\n", "3 fouls_opp_cat1 0.160092\n", ">> hga entered the model.\n", "\n", "Best removal candidates:\n", " feature p_value\n", "0 hga 0.000608\n", "1 team 0.000002\n", ">> No feature removed from the model.\n", "\n", "Best entry candidates:\n", " feature p_value\n", "0 red_opp 0.003997\n", "1 fouls_opp_cat2 0.022037\n", "2 fouls_opp_cat1 0.052854\n", ">> red_opp entered the model.\n", "\n", "Best removal candidates:\n", " feature p_value\n", "0 red_opp 0.003997\n", "1 hga 0.000569\n", "2 team 0.000002\n", ">> No feature removed from the model.\n", "\n", "Best entry candidates:\n", " feature p_value\n", "0 fouls_opp_cat2 0.037692\n", "1 fouls_opp_cat1 0.108477\n", ">> fouls_opp_cat2 entered the model.\n", "\n", "Best removal candidates:\n", " feature p_value\n", "0 fouls_opp_cat2 0.037692\n", "1 red_opp 0.006665\n", "2 hga 0.000305\n", "3 team 0.000004\n", ">> No feature removed from the model.\n", "\n", "Best entry candidates:\n", " feature p_value\n", "0 fouls_opp_cat1 0.353892\n", ">> No feature entered the model.\n", "\n", "Best removal candidates:\n", " feature p_value\n", "0 fouls_opp_cat2 0.037692\n", "1 red_opp 0.006665\n", "2 hga 0.000305\n", "3 team 0.000004\n", ">> No feature removed from the model.\n", "\n", "\n", "Selection stopped because all candidates for removal are significant at the 0.1 level and no candidate for entry is significant at the 0.05 level.\n", "\n", " Generalized Linear Model Regression Results \n", "==============================================================================\n", "Dep. Variable: goals No. Observations: 518\n", "Model: GLM Df Residuals: 497\n", "Model Family: Poisson Df Model: 20\n", "Link Function: Log Scale: 1.0000\n", "Method: IRLS Log-Likelihood: -754.52\n", "Date: Tue, 03 Sep 2024 Deviance: 521.53\n", "Time: 15:20:35 Pearson chi2: 442.\n", "No. Iterations: 5 Pseudo R-squ. (CS): 0.1771\n", "Covariance Type: nonrobust \n", "=====================================================================================================================\n", " coef std err z P>|z| [0.025 0.975]\n", "---------------------------------------------------------------------------------------------------------------------\n", "Intercept 0.6056 0.148 4.103 0.000 0.316 0.895\n", "red_opp 0.3259 0.116 2.814 0.005 0.099 0.553\n", "penalty 0.3239 0.084 3.867 0.000 0.160 0.488\n", "team: Jablonec -0.0641 0.199 -0.323 0.747 -0.453 0.325\n", "team: Slovácko -0.2592 0.210 -1.235 0.217 -0.670 0.152\n", "team: Hradec Králové -0.2959 0.216 -1.367 0.172 -0.720 0.128\n", "team: Sparta Praha 0.2930 0.179 1.639 0.101 -0.057 0.643\n", "team: Teplice -0.3210 0.208 -1.545 0.122 -0.728 0.086\n", "team: Sigma Olomouc -0.0832 0.197 -0.423 0.672 -0.469 0.302\n", "team: Slavia Praha 0.5141 0.172 2.992 0.003 0.177 0.851\n", "team: České Budějovice -0.2703 0.213 -1.269 0.204 -0.688 0.147\n", "team: Zbrojovka Brno -0.2573 0.209 -1.231 0.218 -0.667 0.152\n", "team: Zlín -0.2405 0.211 -1.141 0.254 -0.654 0.173\n", "team: Mladá Boleslav -0.3061 0.211 -1.453 0.146 -0.719 0.107\n", "team: Viktoria Plzeň 0.0649 0.189 0.343 0.732 -0.306 0.436\n", "team: Baník Ostrava -0.0717 0.199 -0.360 0.719 -0.462 0.318\n", "team: Slovan Liberec -0.1045 0.203 -0.515 0.607 -0.502 0.293\n", "team: Pardubice -0.4425 0.226 -1.955 0.051 -0.886 0.001\n", "hga: A -0.2616 0.073 -3.597 0.000 -0.404 -0.119\n", "fouls_opp_cat2: (16.5, Inf) -0.2456 0.121 -2.024 0.043 -0.483 -0.008\n", "ref_interv_per_attack * ref_interv_per_attack_opp -1.5845 1.311 -1.208 0.227 -4.154 0.985\n", "=====================================================================================================================\n" ] }, { "data": { "text/plain": [ "" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Fitting the model\n", "model1 = stepsel.modeling.stepwise_glm.StepwiseGLM(\n", " formula = formula,\n", " data = dt,\n", " include = include,\n", " slentry = slentry,\n", " slstay = slstay,\n", " family = family\n", ")\n", "model1.fit()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Refitting the model\n", "After the selection it is possible to specify different model formula and use the Log of the previously fitted model to speed up the selection. This is useful when the data is large and the selection is time consuming. The same partial models during the selection won't be fitted again.\n", "**Only use this functionality when the data has not changed!**" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Best entry candidates:\n", " feature p_value\n", "0 team 0.000002\n", "1 team_opp 0.000284\n", "2 hga 0.000609\n", "3 red_opp 0.005159\n", "4 fouls_opp_cat2 0.013067\n", ">> team entered the model.\n", "\n", "Best removal candidates:\n", " feature p_value\n", "0 team 0.000002\n", ">> No feature removed from the model.\n", "\n", "Best entry candidates:\n", " feature p_value\n", "0 team_opp 0.000392\n", "1 hga 0.000608\n", "2 red_opp 0.004282\n", "3 fouls_opp_cat2 0.045388\n", "4 fouls_opp_cat1 0.160092\n", ">> team_opp entered the model.\n", "\n", "Best removal candidates:\n", " feature p_value\n", "0 team_opp 0.000392\n", "1 team 0.000003\n", ">> No feature removed from the model.\n", "\n", "Best entry candidates:\n", " feature p_value\n", "0 hga 0.000621\n", "1 red_opp 0.005264\n", "2 fouls_opp_cat2 0.078540\n", "3 fouls_opp_cat1 0.131029\n", ">> hga entered the model.\n", "\n", "Best removal candidates:\n", " feature p_value\n", "0 hga 0.000621\n", "1 team_opp 0.000397\n", "2 team 0.000003\n", ">> No feature removed from the model.\n", "\n", "Best entry candidates:\n", " feature p_value\n", "0 red_opp 0.005355\n", "1 fouls_opp_cat1 0.044937\n", "2 fouls_opp_cat2 0.049454\n", ">> red_opp entered the model.\n", "\n", "Best removal candidates:\n", " feature p_value\n", "0 red_opp 0.005355\n", "1 hga 0.000632\n", "2 team_opp 0.000478\n", "3 team 0.000003\n", ">> No feature removed from the model.\n", "\n", "Best entry candidates:\n", " feature p_value\n", "0 fouls_opp_cat2 0.096376\n", "1 fouls_opp_cat1 0.097127\n", ">> No feature entered the model.\n", "\n", "Best removal candidates:\n", " feature p_value\n", "0 red_opp 0.005355\n", "1 hga 0.000632\n", "2 team_opp 0.000478\n", "3 team 0.000003\n", ">> No feature removed from the model.\n", "\n", "\n", "Selection stopped because all candidates for removal are significant at the 0.1 level and no candidate for entry is significant at the 0.05 level.\n", "\n", " Generalized Linear Model Regression Results \n", "==============================================================================\n", "Dep. Variable: goals No. Observations: 518\n", "Model: GLM Df Residuals: 483\n", "Model Family: Poisson Df Model: 34\n", "Link Function: Log Scale: 1.0000\n", "Method: IRLS Log-Likelihood: -736.76\n", "Date: Tue, 03 Sep 2024 Deviance: 486.00\n", "Time: 15:20:35 Pearson chi2: 405.\n", "No. Iterations: 5 Pseudo R-squ. (CS): 0.2316\n", "Covariance Type: nonrobust \n", "=====================================================================================================================\n", " coef std err z P>|z| [0.025 0.975]\n", "---------------------------------------------------------------------------------------------------------------------\n", "Intercept 0.6859 0.204 3.367 0.001 0.287 1.085\n", "red_opp 0.3446 0.120 2.880 0.004 0.110 0.579\n", "penalty 0.3079 0.085 3.633 0.000 0.142 0.474\n", "team: Jablonec -0.1051 0.200 -0.526 0.599 -0.496 0.286\n", "team: Slovácko -0.3340 0.211 -1.585 0.113 -0.747 0.079\n", "team: Hradec Králové -0.3747 0.217 -1.727 0.084 -0.800 0.051\n", "team: Sparta Praha 0.2698 0.180 1.501 0.133 -0.082 0.622\n", "team: Teplice -0.3210 0.208 -1.541 0.123 -0.729 0.087\n", "team: Sigma Olomouc -0.1164 0.197 -0.590 0.556 -0.503 0.271\n", "team: Slavia Praha 0.4651 0.173 2.691 0.007 0.126 0.804\n", "team: České Budějovice -0.2836 0.214 -1.326 0.185 -0.703 0.136\n", "team: Zbrojovka Brno -0.2716 0.210 -1.294 0.196 -0.683 0.140\n", "team: Zlín -0.2897 0.212 -1.369 0.171 -0.704 0.125\n", "team: Mladá Boleslav -0.3335 0.212 -1.576 0.115 -0.748 0.081\n", "team: Viktoria Plzeň 0.0574 0.190 0.302 0.763 -0.315 0.430\n", "team: Baník Ostrava -0.1165 0.200 -0.584 0.559 -0.508 0.275\n", "team: Slovan Liberec -0.1739 0.204 -0.853 0.393 -0.573 0.226\n", "team: Pardubice -0.4832 0.227 -2.129 0.033 -0.928 -0.038\n", "hga: A -0.2470 0.073 -3.404 0.001 -0.389 -0.105\n", "team_opp: Jablonec 0.1064 0.187 0.570 0.569 -0.260 0.472\n", "team_opp: Teplice 0.1953 0.184 1.064 0.287 -0.165 0.555\n", "team_opp: Slovácko -0.2684 0.205 -1.310 0.190 -0.670 0.133\n", "team_opp: Hradec Králové -0.3510 0.208 -1.685 0.092 -0.759 0.057\n", "team_opp: Sparta Praha -0.4883 0.223 -2.192 0.028 -0.925 -0.052\n", "team_opp: Sigma Olomouc -0.1868 0.202 -0.925 0.355 -0.583 0.209\n", "team_opp: Slavia Praha -0.6235 0.229 -2.718 0.007 -1.073 -0.174\n", "team_opp: České Budějovice 0.0914 0.188 0.485 0.627 -0.278 0.461\n", "team_opp: Zbrojovka Brno 0.1574 0.185 0.849 0.396 -0.206 0.521\n", "team_opp: Zlín 0.1161 0.188 0.619 0.536 -0.252 0.484\n", "team_opp: Mladá Boleslav -0.1597 0.202 -0.791 0.429 -0.556 0.236\n", "team_opp: Viktoria Plzeň -0.3707 0.214 -1.732 0.083 -0.790 0.049\n", "team_opp: Baník Ostrava -0.1468 0.204 -0.720 0.471 -0.546 0.253\n", "team_opp: Slovan Liberec -0.1634 0.199 -0.820 0.412 -0.554 0.227\n", "team_opp: Pardubice 0.0812 0.188 0.432 0.666 -0.287 0.449\n", "ref_interv_per_attack * ref_interv_per_attack_opp -1.1145 1.309 -0.852 0.394 -3.679 1.450\n", "=====================================================================================================================\n" ] }, { "data": { "text/plain": [ "" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# The new formula including the team_opp variable\n", "formula_new = \"goals ~ team + hga + red_opp + fouls_opp_cat1 + fouls_opp_cat2 + team_opp\"\n", "model2 = stepsel.modeling.stepwise_glm.StepwiseGLM(\n", " formula = formula_new,\n", " data = dt,\n", " include = include,\n", " slentry = slentry,\n", " slstay = slstay,\n", " model_fit_log = model1.model_fit_log, # Use the previous model fit Log object\n", " family = sm.families.Poisson()\n", ")\n", "model2.fit()" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " Generalized Linear Model Regression Results \n", "==============================================================================\n", "Dep. Variable: goals No. Observations: 518\n", "Model: GLM Df Residuals: 483\n", "Model Family: Poisson Df Model: 34\n", "Link Function: Log Scale: 1.0000\n", "Method: IRLS Log-Likelihood: -736.76\n", "Date: Tue, 03 Sep 2024 Deviance: 486.00\n", "Time: 15:20:35 Pearson chi2: 405.\n", "No. Iterations: 5 Pseudo R-squ. (CS): 0.2316\n", "Covariance Type: nonrobust \n", "=====================================================================================================================\n", " coef std err z P>|z| [0.025 0.975]\n", "---------------------------------------------------------------------------------------------------------------------\n", "Intercept 0.6859 0.204 3.367 0.001 0.287 1.085\n", "red_opp 0.3446 0.120 2.880 0.004 0.110 0.579\n", "penalty 0.3079 0.085 3.633 0.000 0.142 0.474\n", "team: Jablonec -0.1051 0.200 -0.526 0.599 -0.496 0.286\n", "team: Slovácko -0.3340 0.211 -1.585 0.113 -0.747 0.079\n", "team: Hradec Králové -0.3747 0.217 -1.727 0.084 -0.800 0.051\n", "team: Sparta Praha 0.2698 0.180 1.501 0.133 -0.082 0.622\n", "team: Teplice -0.3210 0.208 -1.541 0.123 -0.729 0.087\n", "team: Sigma Olomouc -0.1164 0.197 -0.590 0.556 -0.503 0.271\n", "team: Slavia Praha 0.4651 0.173 2.691 0.007 0.126 0.804\n", "team: České Budějovice -0.2836 0.214 -1.326 0.185 -0.703 0.136\n", "team: Zbrojovka Brno -0.2716 0.210 -1.294 0.196 -0.683 0.140\n", "team: Zlín -0.2897 0.212 -1.369 0.171 -0.704 0.125\n", "team: Mladá Boleslav -0.3335 0.212 -1.576 0.115 -0.748 0.081\n", "team: Viktoria Plzeň 0.0574 0.190 0.302 0.763 -0.315 0.430\n", "team: Baník Ostrava -0.1165 0.200 -0.584 0.559 -0.508 0.275\n", "team: Slovan Liberec -0.1739 0.204 -0.853 0.393 -0.573 0.226\n", "team: Pardubice -0.4832 0.227 -2.129 0.033 -0.928 -0.038\n", "hga: A -0.2470 0.073 -3.404 0.001 -0.389 -0.105\n", "team_opp: Jablonec 0.1064 0.187 0.570 0.569 -0.260 0.472\n", "team_opp: Teplice 0.1953 0.184 1.064 0.287 -0.165 0.555\n", "team_opp: Slovácko -0.2684 0.205 -1.310 0.190 -0.670 0.133\n", "team_opp: Hradec Králové -0.3510 0.208 -1.685 0.092 -0.759 0.057\n", "team_opp: Sparta Praha -0.4883 0.223 -2.192 0.028 -0.925 -0.052\n", "team_opp: Sigma Olomouc -0.1868 0.202 -0.925 0.355 -0.583 0.209\n", "team_opp: Slavia Praha -0.6235 0.229 -2.718 0.007 -1.073 -0.174\n", "team_opp: České Budějovice 0.0914 0.188 0.485 0.627 -0.278 0.461\n", "team_opp: Zbrojovka Brno 0.1574 0.185 0.849 0.396 -0.206 0.521\n", "team_opp: Zlín 0.1161 0.188 0.619 0.536 -0.252 0.484\n", "team_opp: Mladá Boleslav -0.1597 0.202 -0.791 0.429 -0.556 0.236\n", "team_opp: Viktoria Plzeň -0.3707 0.214 -1.732 0.083 -0.790 0.049\n", "team_opp: Baník Ostrava -0.1468 0.204 -0.720 0.471 -0.546 0.253\n", "team_opp: Slovan Liberec -0.1634 0.199 -0.820 0.412 -0.554 0.227\n", "team_opp: Pardubice 0.0812 0.188 0.432 0.666 -0.287 0.449\n", "ref_interv_per_attack * ref_interv_per_attack_opp -1.1145 1.309 -0.852 0.394 -3.679 1.450\n", "=====================================================================================================================\n" ] } ], "source": [ "# Print the summary of the final model. The extracted model is statsmodels object.\n", "final_model = model2.current_model\n", "print(final_model.summary())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Prepering model matrix for other models\n", "The `stepsel` package can be used to prepare the model matrix for other models. The `prepare_model_matrix` function is used for this purpose using the convienient `formula` syntax.\n", "Interaction terms of two variables are supported." ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [], "source": [ "# Prepare the model matrix\n", "formula = \"goals ~ team + hga * penalty\"\n", "y, X, feature_ids = stepsel.modeling.prep.prepare_model_matrix(formula, dt)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Fit `statsmodels` model with prepared model matrix using `stepsel`" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [], "source": [ "# Train-test split based on the match_id\n", "train_filter = dt[\"match_id\"] <= 200\n", "y_train = y[train_filter]\n", "X_train = X.loc[train_filter,:].copy()\n", "y_test = y[~train_filter]\n", "X_test = X.loc[~train_filter,:].copy()" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " Generalized Linear Model Regression Results \n", "==============================================================================\n", "Dep. Variable: goals No. Observations: 400\n", "Model: GLM Df Residuals: 382\n", "Model Family: Poisson Df Model: 17\n", "Link Function: Log Scale: 1.0000\n", "Method: IRLS Log-Likelihood: -593.90\n", "Date: Tue, 03 Sep 2024 Deviance: 423.76\n", "Time: 15:20:35 Pearson chi2: 369.\n", "No. Iterations: 5 Pseudo R-squ. (CS): 0.1442\n", "Covariance Type: nonrobust \n", "==========================================================================================\n", " coef std err z P>|z| [0.025 0.975]\n", "------------------------------------------------------------------------------------------\n", "Intercept 0.4030 0.159 2.531 0.011 0.091 0.715\n", "team: Jablonec -0.0476 0.226 -0.211 0.833 -0.490 0.394\n", "team: Slovácko -0.2853 0.244 -1.171 0.242 -0.763 0.192\n", "team: Hradec Králové -0.2945 0.243 -1.210 0.226 -0.772 0.183\n", "team: Sparta Praha 0.4073 0.201 2.031 0.042 0.014 0.800\n", "team: Teplice -0.2247 0.234 -0.960 0.337 -0.683 0.234\n", "team: Sigma Olomouc 0.0312 0.221 0.141 0.888 -0.403 0.465\n", "team: Slavia Praha 0.4624 0.201 2.295 0.022 0.067 0.857\n", "team: České Budějovice -0.2186 0.239 -0.915 0.360 -0.687 0.250\n", "team: Zbrojovka Brno -0.3861 0.248 -1.557 0.120 -0.872 0.100\n", "team: Zlín -0.1886 0.239 -0.790 0.430 -0.657 0.279\n", "team: Mladá Boleslav -0.2761 0.244 -1.131 0.258 -0.755 0.202\n", "team: Viktoria Plzeň 0.1407 0.214 0.656 0.512 -0.279 0.561\n", "team: Baník Ostrava -0.0086 0.224 -0.038 0.969 -0.448 0.431\n", "team: Slovan Liberec -0.1769 0.235 -0.754 0.451 -0.637 0.283\n", "team: Pardubice -0.3462 0.249 -1.390 0.165 -0.834 0.142\n", "hga: H * penalty 0.4112 0.120 3.426 0.001 0.176 0.646\n", "hga: A * penalty 0.2397 0.112 2.131 0.033 0.019 0.460\n", "==========================================================================================\n" ] } ], "source": [ "# Fit the model\n", "model3 = sm.GLM(endog = y_train,\n", " exog = X_train,\n", " family = family)\n", "model3 = model3.fit()\n", "print(model3.summary())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Fixing some of the variables coefficients\n", "It is possible to fix some of the variables coefficients to a specific value using offset. This is particularly useful when the variable is a factor and one or more of its levels are not well fitted by the model." ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [], "source": [ "# Fix some of the coefficients - use the names of the coefficients from the summary\n", "adjusted_coeffs = {\"team: Baník Ostrava\": 0.00,\n", " \"hga: H * penalty\": 0.45 \n", "}" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [], "source": [ "# Adjust the model matrix and offset\n", "X_train, X_test, offset_train, offset_test = stepsel.modeling.prep.model_matrix.adjust_model_matrix([X_train, X_test], adjusted_coeffs)" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " Generalized Linear Model Regression Results \n", "==============================================================================\n", "Dep. Variable: goals No. Observations: 400\n", "Model: GLM Df Residuals: 384\n", "Model Family: Poisson Df Model: 15\n", "Link Function: Log Scale: 1.0000\n", "Method: IRLS Log-Likelihood: -593.96\n", "Date: Tue, 03 Sep 2024 Deviance: 423.87\n", "Time: 15:20:36 Pearson chi2: 370.\n", "No. Iterations: 5 Pseudo R-squ. (CS): 0.1189\n", "Covariance Type: nonrobust \n", "==========================================================================================\n", " coef std err z P>|z| [0.025 0.975]\n", "------------------------------------------------------------------------------------------\n", "Intercept 0.3918 0.112 3.492 0.000 0.172 0.612\n", "team: Jablonec -0.0413 0.197 -0.209 0.834 -0.428 0.345\n", "team: Slovácko -0.2766 0.217 -1.276 0.202 -0.701 0.148\n", "team: Hradec Králové -0.2878 0.217 -1.327 0.185 -0.713 0.137\n", "team: Sparta Praha 0.4092 0.169 2.426 0.015 0.079 0.740\n", "team: Teplice -0.2206 0.207 -1.065 0.287 -0.627 0.185\n", "team: Sigma Olomouc 0.0376 0.192 0.196 0.845 -0.339 0.414\n", "team: Slavia Praha 0.4703 0.169 2.785 0.005 0.139 0.801\n", "team: České Budějovice -0.2099 0.212 -0.992 0.321 -0.625 0.205\n", "team: Zbrojovka Brno -0.3819 0.223 -1.716 0.086 -0.818 0.054\n", "team: Zlín -0.1821 0.212 -0.860 0.390 -0.597 0.233\n", "team: Mladá Boleslav -0.2652 0.217 -1.223 0.221 -0.690 0.160\n", "team: Viktoria Plzeň 0.1474 0.184 0.802 0.423 -0.213 0.508\n", "team: Slovan Liberec -0.1685 0.207 -0.814 0.416 -0.574 0.237\n", "team: Pardubice -0.3373 0.223 -1.514 0.130 -0.774 0.099\n", "hga: A * penalty 0.2439 0.112 2.184 0.029 0.025 0.463\n", "==========================================================================================\n" ] } ], "source": [ "# Fit the final model using the adjusted model matrix and offset\n", "model_final2 = sm.GLM(endog = y_train,\n", " exog = X_train,\n", " family = family,\n", " offset = offset_train)\n", "model_final2 = model_final2.fit()\n", "print(model_final2.summary())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Scoring the model\n", "The model can be scored via standard `statsmodels` API. `stepsel` package provides a `scoring_table` object, which handles the fixed variables and the offset in a straightforward way. It is also possible to generate SQL code for scoring the model in the database." ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "ScoringTableGLM(scoring_table= var1 var2 level_var1 level_var2 estimate\n", "0 Intercept None None None 0.391757\n", "1 team None České Budějovice None -0.209868\n", "2 team None Zlín None -0.182095\n", "3 team None Zbrojovka Brno None -0.381924\n", "4 team None Viktoria Plzeň None 0.147379\n", "5 team None Teplice None -0.220638\n", "6 team None Sparta Praha None 0.409163\n", "7 team None Slovácko None -0.276560\n", "8 team None Slovan Liberec None -0.168498\n", "9 team None Slavia Praha None 0.470338\n", "10 team None Sigma Olomouc None 0.037562\n", "11 team None Pardubice None -0.337274\n", "12 team None Mladá Boleslav None -0.265193\n", "13 team None Jablonec None -0.041279\n", "14 team None Hradec Králové None -0.287798\n", "15 team None Baník Ostrava None 0.000000\n", "16 hga penalty H None 0.450000\n", "17 hga penalty A None 0.243900)\n" ] } ], "source": [ "# Create scoring table\n", "# Notice the fixed coefficients are also used in the scoring table\n", "# You can also create the scoring table from csv file or pandas DataFrame.\n", "scoring_table = stepsel.modeling.predict.ScoringTableGLM.from_glm_model(model_final2, adjusted_coeffs)\n", "print(scoring_table)" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [], "source": [ "# For prediction, prepare the full model matrix\n", "y, X_full, feature_ids_full = stepsel.modeling.prep.prepare_model_matrix(formula, dt, drop_first=False)\n", "\n", "# There is a method to predict the linear predictor of the model, which can be used to calculate the predictions\n", "dt[\"preds\"] = np.exp(scoring_table.predict_linear(X_full))" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " + 0.39175660628921744\n", " + case when TRIM(CAST(team as varchar(999))) = 'České Budějovice' then -0.2098683563962888\n", " when TRIM(CAST(team as varchar(999))) = 'Zlín' then -0.18209532272001644\n", " when TRIM(CAST(team as varchar(999))) = 'Zbrojovka Brno' then -0.38192399630625384\n", " when TRIM(CAST(team as varchar(999))) = 'Viktoria Plzeň' then 0.14737941642116634\n", " when TRIM(CAST(team as varchar(999))) = 'Teplice' then -0.22063773340931742\n", " when TRIM(CAST(team as varchar(999))) = 'Sparta Praha' then 0.4091626261463453\n", " when TRIM(CAST(team as varchar(999))) = 'Slovácko' then -0.2765597308949614\n", " when TRIM(CAST(team as varchar(999))) = 'Slovan Liberec' then -0.1684980555750112\n", " when TRIM(CAST(team as varchar(999))) = 'Slavia Praha' then 0.4703384015175229\n", " when TRIM(CAST(team as varchar(999))) = 'Sigma Olomouc' then 0.037561752737359774\n", " when TRIM(CAST(team as varchar(999))) = 'Pardubice' then -0.33727351980242654\n", " when TRIM(CAST(team as varchar(999))) = 'Mladá Boleslav' then -0.2651933788212607\n", " when TRIM(CAST(team as varchar(999))) = 'Jablonec' then -0.041278776042565773\n", " when TRIM(CAST(team as varchar(999))) = 'Hradec Králové' then -0.2877983396251753\n", " when TRIM(CAST(team as varchar(999))) = 'Baník Ostrava' then 0.0 else 0.0 end\n", " + case when TRIM(CAST(hga as varchar(999))) = 'H' then penalty * 0.45\n", " when TRIM(CAST(hga as varchar(999))) = 'A' then penalty * 0.243900495630906 else 0.0 end\n", "\n" ] } ], "source": [ "# Generate the SQL code for the model (microsoft SQL Server flavor)\n", "print(scoring_table.sql(format=True))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Verifying the model\n", "For quick verification of the model, one can use the `group_over_columns` function, which goes over the specified columns and applies the specified grouping dictionary. This is built on top of the pandas `groupby` function." ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [], "source": [ "# Evaluate the model. Note you can evaluate any combination of variables.\n", "vars2eval = [\"team\", \"hga\", \"penalty\", \"fouls_opp_cat2\", [\"hga\", \"penalty\"]]\n", "evaluation_train = stepsel.tools.group_over_columns(dt.loc[train_filter,], vars2eval, {\"goals\": \"mean\", \"preds\": \"mean\" })\n", "evaluation_test = stepsel.tools.group_over_columns(dt.loc[~train_filter,:], vars2eval, {\"goals\": \"mean\", \"preds\": \"mean\"})" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " variable_1 level_1 variable_2 level_2 goals preds\n", "0 team Bohemians NaN NaN 1.640000 1.636806\n", "1 team Jablonec NaN NaN 1.520000 1.520000\n", "2 team Slovácko NaN NaN 1.160000 1.160000\n", "3 team Hradec Králové NaN NaN 1.160000 1.160000\n", "4 team Sparta Praha NaN NaN 2.560000 2.560000\n", "5 team Teplice NaN NaN 1.320000 1.320000\n", "6 team Sigma Olomouc NaN NaN 1.640000 1.640000\n", "7 team Slavia Praha NaN NaN 2.560000 2.560000\n", "8 team České Budějovice NaN NaN 1.240000 1.240000\n", "9 team Zbrojovka Brno NaN NaN 1.080000 1.080000\n", "10 team Zlín NaN NaN 1.291667 1.291667\n", "11 team Mladá Boleslav NaN NaN 1.160000 1.160000\n", "12 team Viktoria Plzeň NaN NaN 1.807692 1.807692\n", "13 team Baník Ostrava NaN NaN 1.560000 1.563194\n", "14 team Slovan Liberec NaN NaN 1.320000 1.320000\n", "15 team Pardubice NaN NaN 1.080000 1.080000\n", "16 hga H NaN NaN 1.755000 1.542806\n", "17 hga A NaN NaN 1.260000 1.472194\n", "18 penalty 0.0 NaN NaN 1.380403 1.387885\n", "19 penalty 1.0 NaN NaN 2.361702 2.193053\n", "20 penalty 2.0 NaN NaN 2.166667 3.055077\n", "21 fouls_opp_cat2 (-Inf, 16.5] NaN NaN 1.567251 1.512505\n", "22 fouls_opp_cat2 (16.5, Inf) NaN NaN 1.155172 1.477987\n", "23 hga H penalty 0.0 1.641618 1.404335\n", "24 hga H penalty 1.0 2.600000 2.379531\n", "25 hga H penalty 2.0 1.000000 3.061540\n", "26 hga A penalty 0.0 1.120690 1.371529\n", "27 hga A penalty 1.0 2.090909 1.981147\n", "28 hga A penalty 2.0 2.750000 3.051845\n", "\n", " variable_1 level_1 variable_2 level_2 goals preds\n", "0 team Bohemians NaN NaN 1.625000 1.635771\n", "1 team Jablonec NaN NaN 1.428571 1.535011\n", "2 team Slovácko NaN NaN 1.375000 1.201807\n", "3 team Hradec Králové NaN NaN 1.000000 1.109554\n", "4 team Sparta Praha NaN NaN 1.500000 2.544079\n", "5 team Teplice NaN NaN 1.142857 1.282971\n", "6 team Sigma Olomouc NaN NaN 1.125000 1.645341\n", "7 team Slavia Praha NaN NaN 3.375000 2.449881\n", "8 team České Budějovice NaN NaN 1.000000 1.199480\n", "9 team Zbrojovka Brno NaN NaN 1.857143 1.049731\n", "10 team Zlín NaN NaN 1.000000 1.233260\n", "11 team Mladá Boleslav NaN NaN 1.428571 1.363987\n", "12 team Viktoria Plzeň NaN NaN 1.714286 1.714525\n", "13 team Baník Ostrava NaN NaN 1.285714 1.479578\n", "14 team Slovan Liberec NaN NaN 1.714286 1.250144\n", "15 team Pardubice NaN NaN 0.571429 1.055995\n", "16 hga H NaN NaN 1.440678 1.545113\n", "17 hga A NaN NaN 1.474576 1.454344\n", "18 penalty 0.0 NaN NaN 1.428571 1.411392\n", "19 penalty 1.0 NaN NaN 1.692308 2.213212\n", "20 fouls_opp_cat2 (-Inf, 16.5] NaN NaN 1.500000 1.513460\n", "21 fouls_opp_cat2 (16.5, Inf) NaN NaN 1.142857 1.397720\n", "22 hga H penalty 0.0 1.440000 1.400752\n", "23 hga H penalty 1.0 1.444444 2.347115\n", "24 hga A penalty 0.0 1.418182 1.421065\n", "25 hga A penalty 1.0 2.250000 1.911932\n" ] } ], "source": [ "# One can see that rather simple descriptive model fits the data reasonably well, even though it was constructed only to demonstrate the package.\n", "# The biggest discrepancy is in matches with penalty, and for the teams of Slavia Praha and Sparta Praha. This has its reasons,\n", "# and Czech football fans will have their own opinions on that.\n", "print(evaluation_train, evaluation_test, sep=\"\\n\\n\")" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": ".venv", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.12.4" } }, "nbformat": 4, "nbformat_minor": 4 }