Commit c44c1a5e authored by Frank Rayo's avatar Frank Rayo 🚀
Browse files

script for gradient boosted trees hyperparameter gridsearch

parent 99599ac2
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"import pandas as pd\n",
"import xgboost as xgb\n",
"import sklearn\n",
"import matplotlib\n",
"import matplotlib.pyplot as plt\n",
"import pygraphviz # apt update -y; apt upgrade -y; apt-get install -y graphviz libgraphviz-dev pkg-config; pip install graphviz pygraphviz"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"scrolled": true
},
"outputs": [],
"source": [
"!wget -q https://pedro.asti.dost.gov.ph/gitlab/franco/fish-suitability-map/-/raw/master/2017-2020_filtered_filtered_with_cfa.csv -O /tmp/training-2017-2020-monthly-mean.csv\n",
"!wget -q https://pedro.asti.dost.gov.ph/gitlab/franco/fish-suitability-map/-/raw/master/testing-2021-monthly-mean.csv -O /tmp/testing-2021-monthly-mean.csv\n",
"!wget -q https://pedro.asti.dost.gov.ph/gitlab/franco/fish-suitability-map/-/raw/master/2021_converted.csv -O /tmp/testing-2021.csv"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>chl</th>\n",
" <th>sst</th>\n",
" <th>bath</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>0.132899</td>\n",
" <td>25.934444</td>\n",
" <td>-3173</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>0.121123</td>\n",
" <td>24.907999</td>\n",
" <td>-3173</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>0.116107</td>\n",
" <td>25.329166</td>\n",
" <td>-3173</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>0.100442</td>\n",
" <td>25.823666</td>\n",
" <td>-3173</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>0.081607</td>\n",
" <td>27.529062</td>\n",
" <td>-3173</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" chl sst bath\n",
"0 0.132899 25.934444 -3173\n",
"1 0.121123 24.907999 -3173\n",
"2 0.116107 25.329166 -3173\n",
"3 0.100442 25.823666 -3173\n",
"4 0.081607 27.529062 -3173"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"train_data = pd.read_csv('/tmp/training-2017-2020-monthly-mean.csv', usecols=['bath', 'chl', 'sst'], engine='c', index_col=False)\n",
"train_labels = pd.read_csv('/tmp/training-2017-2020-monthly-mean.csv', usecols=['boat_present'], engine='c', index_col=False)\n",
"\n",
"train_data.head()"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"CV with max_depth=6, learning_rate=0.01, max_delta_step=1\n",
"\tlogloss 0.688167 and error 0.0035388000000000004 for 0 rounds\n",
"CV with max_depth=6, learning_rate=0.01, max_delta_step=4\n",
"\tlogloss 0.6833164 and error 0.0035388000000000004 for 0 rounds\n",
"CV with max_depth=6, learning_rate=0.01, max_delta_step=7\n",
"\tlogloss 0.6833164 and error 0.0035388000000000004 for 0 rounds\n",
"CV with max_depth=6, learning_rate=0.01, max_delta_step=10\n",
"\tlogloss 0.6833164 and error 0.0035388000000000004 for 0 rounds\n",
"CV with max_depth=6, learning_rate=0.01, max_delta_step=13\n",
"\tlogloss 0.6833164 and error 0.0035388000000000004 for 0 rounds\n",
"CV with max_depth=6, learning_rate=0.1, max_delta_step=1\n",
"\tlogloss 0.644798 and error 0.0035388000000000004 for 0 rounds\n",
"CV with max_depth=6, learning_rate=0.1, max_delta_step=4\n",
"\tlogloss 0.5994062 and error 0.0035388000000000004 for 0 rounds\n",
"CV with max_depth=6, learning_rate=0.1, max_delta_step=7\n",
"\tlogloss 0.5994062 and error 0.0035388000000000004 for 0 rounds\n",
"CV with max_depth=6, learning_rate=0.1, max_delta_step=10\n",
"\tlogloss 0.5994062 and error 0.0035388000000000004 for 0 rounds\n",
"CV with max_depth=6, learning_rate=0.1, max_delta_step=13\n",
"\tlogloss 0.5994062 and error 0.0035388000000000004 for 0 rounds\n",
"CV with max_depth=6, learning_rate=0.3, max_delta_step=1\n",
"\tlogloss 0.5553683999999999 and error 0.0035388000000000004 for 0 rounds\n",
"CV with max_depth=6, learning_rate=0.3, max_delta_step=4\n",
"\tlogloss 0.44096160000000006 and error 0.0035388000000000004 for 0 rounds\n",
"CV with max_depth=6, learning_rate=0.3, max_delta_step=7\n",
"\tlogloss 0.4409618 and error 0.0035388000000000004 for 0 rounds\n",
"CV with max_depth=6, learning_rate=0.3, max_delta_step=10\n",
"\tlogloss 0.44096160000000006 and error 0.0035388000000000004 for 0 rounds\n",
"CV with max_depth=6, learning_rate=0.3, max_delta_step=13\n",
"\tlogloss 0.4409618 and error 0.0035388000000000004 for 0 rounds\n",
"CV with max_depth=6, learning_rate=0.5, max_delta_step=1\n",
"\tlogloss 0.4758826 and error 0.0035388000000000004 for 0 rounds\n",
"CV with max_depth=6, learning_rate=0.5, max_delta_step=4\n",
"\tlogloss 0.31849019999999995 and error 0.0035388000000000004 for 0 rounds\n",
"CV with max_depth=6, learning_rate=0.5, max_delta_step=7\n",
"\tlogloss 0.31849019999999995 and error 0.0035388000000000004 for 0 rounds\n",
"CV with max_depth=6, learning_rate=0.5, max_delta_step=10\n",
"\tlogloss 0.31849019999999995 and error 0.0035388000000000004 for 0 rounds\n",
"CV with max_depth=6, learning_rate=0.5, max_delta_step=13\n",
"\tlogloss 0.31849019999999995 and error 0.0035388000000000004 for 0 rounds\n",
"CV with max_depth=7, learning_rate=0.01, max_delta_step=1\n",
"\tlogloss 0.688167 and error 0.0035388000000000004 for 0 rounds\n",
"CV with max_depth=7, learning_rate=0.01, max_delta_step=4\n",
"\tlogloss 0.683316 and error 0.0035388000000000004 for 0 rounds\n",
"CV with max_depth=7, learning_rate=0.01, max_delta_step=7\n",
"\tlogloss 0.683316 and error 0.0035388000000000004 for 0 rounds\n",
"CV with max_depth=7, learning_rate=0.01, max_delta_step=10\n",
"\tlogloss 0.683316 and error 0.0035388000000000004 for 0 rounds\n",
"CV with max_depth=7, learning_rate=0.01, max_delta_step=13\n",
"\tlogloss 0.683316 and error 0.0035388000000000004 for 0 rounds\n",
"CV with max_depth=7, learning_rate=0.1, max_delta_step=1\n",
"\tlogloss 0.644798 and error 0.0035388000000000004 for 0 rounds\n",
"CV with max_depth=7, learning_rate=0.1, max_delta_step=4\n",
"\tlogloss 0.599402 and error 0.0035388000000000004 for 0 rounds\n",
"CV with max_depth=7, learning_rate=0.1, max_delta_step=7\n",
"\tlogloss 0.599402 and error 0.0035388000000000004 for 0 rounds\n",
"CV with max_depth=7, learning_rate=0.1, max_delta_step=10\n",
"\tlogloss 0.599402 and error 0.0035388000000000004 for 0 rounds\n",
"CV with max_depth=7, learning_rate=0.1, max_delta_step=13\n",
"\tlogloss 0.599402 and error 0.0035388000000000004 for 0 rounds\n",
"CV with max_depth=7, learning_rate=0.3, max_delta_step=1\n",
"\tlogloss 0.5553684 and error 0.0035388000000000004 for 0 rounds\n",
"CV with max_depth=7, learning_rate=0.3, max_delta_step=4\n",
"\tlogloss 0.44094920000000004 and error 0.0035388000000000004 for 0 rounds\n",
"CV with max_depth=7, learning_rate=0.3, max_delta_step=7\n",
"\tlogloss 0.44094920000000004 and error 0.0035388000000000004 for 0 rounds\n",
"CV with max_depth=7, learning_rate=0.3, max_delta_step=10\n",
"\tlogloss 0.44094920000000004 and error 0.0035388000000000004 for 0 rounds\n",
"CV with max_depth=7, learning_rate=0.3, max_delta_step=13\n",
"\tlogloss 0.44094920000000004 and error 0.0035388000000000004 for 0 rounds\n",
"CV with max_depth=7, learning_rate=0.5, max_delta_step=1\n",
"\tlogloss 0.4758826 and error 0.0035388000000000004 for 0 rounds\n",
"CV with max_depth=7, learning_rate=0.5, max_delta_step=4\n",
"\tlogloss 0.318471 and error 0.0035388000000000004 for 0 rounds\n",
"CV with max_depth=7, learning_rate=0.5, max_delta_step=7\n",
"\tlogloss 0.318471 and error 0.0035388000000000004 for 0 rounds\n",
"CV with max_depth=7, learning_rate=0.5, max_delta_step=10\n",
"\tlogloss 0.318471 and error 0.0035388000000000004 for 0 rounds\n",
"CV with max_depth=7, learning_rate=0.5, max_delta_step=13\n",
"\tlogloss 0.318471 and error 0.0035388000000000004 for 0 rounds\n",
"CV with max_depth=8, learning_rate=0.01, max_delta_step=1\n",
"\tlogloss 0.688167 and error 0.0035388000000000004 for 0 rounds\n",
"CV with max_depth=8, learning_rate=0.01, max_delta_step=4\n",
"\tlogloss 0.6833159999999999 and error 0.0035388000000000004 for 0 rounds\n",
"CV with max_depth=8, learning_rate=0.01, max_delta_step=7\n",
"\tlogloss 0.6833159999999999 and error 0.0035388000000000004 for 0 rounds\n",
"CV with max_depth=8, learning_rate=0.01, max_delta_step=10\n",
"\tlogloss 0.6833159999999999 and error 0.0035388000000000004 for 0 rounds\n",
"CV with max_depth=8, learning_rate=0.01, max_delta_step=13\n",
"\tlogloss 0.6833157999999999 and error 0.0035388000000000004 for 0 rounds\n",
"CV with max_depth=8, learning_rate=0.1, max_delta_step=1\n",
"\tlogloss 0.644798 and error 0.0035388000000000004 for 0 rounds\n",
"CV with max_depth=8, learning_rate=0.1, max_delta_step=4\n",
"\tlogloss 0.5993986 and error 0.0035388000000000004 for 0 rounds\n",
"CV with max_depth=8, learning_rate=0.1, max_delta_step=7\n",
"\tlogloss 0.5993984 and error 0.0035388000000000004 for 0 rounds\n",
"CV with max_depth=8, learning_rate=0.1, max_delta_step=10\n",
"\tlogloss 0.5993984 and error 0.0035388000000000004 for 0 rounds\n",
"CV with max_depth=8, learning_rate=0.1, max_delta_step=13\n",
"\tlogloss 0.5993986 and error 0.0035388000000000004 for 0 rounds\n",
"CV with max_depth=8, learning_rate=0.3, max_delta_step=1\n",
"\tlogloss 0.5553682 and error 0.0035388000000000004 for 0 rounds\n",
"CV with max_depth=8, learning_rate=0.3, max_delta_step=4\n",
"\tlogloss 0.44093980000000005 and error 0.0035388000000000004 for 0 rounds\n",
"CV with max_depth=8, learning_rate=0.3, max_delta_step=7\n",
"\tlogloss 0.44093980000000005 and error 0.0035388000000000004 for 0 rounds\n",
"CV with max_depth=8, learning_rate=0.3, max_delta_step=10\n",
"\tlogloss 0.44093980000000005 and error 0.0035388000000000004 for 0 rounds\n",
"CV with max_depth=8, learning_rate=0.3, max_delta_step=13\n",
"\tlogloss 0.44093980000000005 and error 0.0035388000000000004 for 0 rounds\n",
"CV with max_depth=8, learning_rate=0.5, max_delta_step=1\n",
"\tlogloss 0.0192622 and error 0.0035381999999999996 for 10 rounds\n",
"CV with max_depth=8, learning_rate=0.5, max_delta_step=4\n",
"\tlogloss 0.3184564 and error 0.0035388000000000004 for 0 rounds\n",
"CV with max_depth=8, learning_rate=0.5, max_delta_step=7\n",
"\tlogloss 0.3184562 and error 0.0035388000000000004 for 0 rounds\n",
"CV with max_depth=8, learning_rate=0.5, max_delta_step=10\n",
"\tlogloss 0.3184564 and error 0.0035388000000000004 for 0 rounds\n",
"CV with max_depth=8, learning_rate=0.5, max_delta_step=13\n",
"\tlogloss 0.3184562 and error 0.0035388000000000004 for 0 rounds\n",
"CV with max_depth=9, learning_rate=0.01, max_delta_step=1\n",
"\tlogloss 0.688167 and error 0.0035388000000000004 for 0 rounds\n",
"CV with max_depth=9, learning_rate=0.01, max_delta_step=4\n",
"\tlogloss 0.5492988000000001 and error 0.0035388000000000004 for 16 rounds\n",
"CV with max_depth=9, learning_rate=0.01, max_delta_step=7\n",
"\tlogloss 0.5492986 and error 0.0035388000000000004 for 16 rounds\n",
"CV with max_depth=9, learning_rate=0.01, max_delta_step=10\n",
"\tlogloss 0.5492988000000001 and error 0.0035388000000000004 for 16 rounds\n",
"CV with max_depth=9, learning_rate=0.01, max_delta_step=13\n",
"\tlogloss 0.5492986 and error 0.0035388000000000004 for 16 rounds\n",
"CV with max_depth=9, learning_rate=0.1, max_delta_step=1\n",
"\tlogloss 0.644798 and error 0.0035388000000000004 for 0 rounds\n",
"CV with max_depth=9, learning_rate=0.1, max_delta_step=4\n",
"\tlogloss 0.458685 and error 0.0035388000000000004 for 2 rounds\n",
"CV with max_depth=9, learning_rate=0.1, max_delta_step=7\n",
"\tlogloss 0.458685 and error 0.0035388000000000004 for 2 rounds\n",
"CV with max_depth=9, learning_rate=0.1, max_delta_step=10\n",
"\tlogloss 0.458685 and error 0.0035388000000000004 for 2 rounds\n",
"CV with max_depth=9, learning_rate=0.1, max_delta_step=13\n",
"\tlogloss 0.458685 and error 0.0035388000000000004 for 2 rounds\n",
"CV with max_depth=9, learning_rate=0.3, max_delta_step=1\n",
"\tlogloss 0.555368 and error 0.0035388000000000004 for 0 rounds\n",
"CV with max_depth=9, learning_rate=0.3, max_delta_step=4\n",
"\tlogloss 0.3017864 and error 0.0035388000000000004 for 1 rounds\n",
"CV with max_depth=9, learning_rate=0.3, max_delta_step=7\n",
"\tlogloss 0.3017864 and error 0.0035388000000000004 for 1 rounds\n",
"CV with max_depth=9, learning_rate=0.3, max_delta_step=10\n",
"\tlogloss 0.3017864 and error 0.0035388000000000004 for 1 rounds\n",
"CV with max_depth=9, learning_rate=0.3, max_delta_step=13\n",
"\tlogloss 0.3017864 and error 0.0035388000000000004 for 1 rounds\n",
"CV with max_depth=9, learning_rate=0.5, max_delta_step=1\n",
"\tlogloss 0.4758826 and error 0.0035388000000000004 for 0 rounds\n",
"CV with max_depth=9, learning_rate=0.5, max_delta_step=4\n",
"\tlogloss 0.17797419999999997 and error 0.0035388000000000004 for 1 rounds\n",
"CV with max_depth=9, learning_rate=0.5, max_delta_step=7\n",
"\tlogloss 0.17797419999999997 and error 0.0035388000000000004 for 1 rounds\n",
"CV with max_depth=9, learning_rate=0.5, max_delta_step=10\n",
"\tlogloss 0.17797419999999997 and error 0.0035388000000000004 for 1 rounds\n",
"CV with max_depth=9, learning_rate=0.5, max_delta_step=13\n",
"\tlogloss 0.17797419999999997 and error 0.0035388000000000004 for 1 rounds\n",
"CV with max_depth=10, learning_rate=0.01, max_delta_step=1\n",
"\tlogloss 0.688167 and error 0.0035388000000000004 for 0 rounds\n",
"CV with max_depth=10, learning_rate=0.01, max_delta_step=4\n",
"\tlogloss 0.6833153999999999 and error 0.0035394000000000003 for 0 rounds\n",
"CV with max_depth=10, learning_rate=0.01, max_delta_step=7\n",
"\tlogloss 0.6833153999999999 and error 0.0035394000000000003 for 0 rounds\n",
"CV with max_depth=10, learning_rate=0.01, max_delta_step=10\n",
"\tlogloss 0.6833153999999999 and error 0.0035394000000000003 for 0 rounds\n",
"CV with max_depth=10, learning_rate=0.01, max_delta_step=13\n",
"\tlogloss 0.6833153999999999 and error 0.0035394000000000003 for 0 rounds\n",
"CV with max_depth=10, learning_rate=0.1, max_delta_step=1\n",
"\tlogloss 0.644798 and error 0.0035388000000000004 for 0 rounds\n",
"CV with max_depth=10, learning_rate=0.1, max_delta_step=4\n",
"\tlogloss 0.4586794 and error 0.0035388000000000004 for 2 rounds\n",
"CV with max_depth=10, learning_rate=0.1, max_delta_step=7\n",
"\tlogloss 0.4586794 and error 0.0035388000000000004 for 2 rounds\n",
"CV with max_depth=10, learning_rate=0.1, max_delta_step=10\n",
"\tlogloss 0.4586794 and error 0.0035388000000000004 for 2 rounds\n",
"CV with max_depth=10, learning_rate=0.1, max_delta_step=13\n",
"\tlogloss 0.4586794 and error 0.0035388000000000004 for 2 rounds\n",
"CV with max_depth=10, learning_rate=0.3, max_delta_step=1\n",
"\tlogloss 0.5553684 and error 0.0035388000000000004 for 0 rounds\n",
"CV with max_depth=10, learning_rate=0.3, max_delta_step=4\n",
"\tlogloss 0.0301866 and error 0.0035382000000000005 for 10 rounds\n",
"CV with max_depth=10, learning_rate=0.3, max_delta_step=7\n",
"\tlogloss 0.030186 and error 0.0035382000000000005 for 10 rounds\n",
"CV with max_depth=10, learning_rate=0.3, max_delta_step=10\n",
"\tlogloss 0.030186 and error 0.0035382000000000005 for 10 rounds\n",
"CV with max_depth=10, learning_rate=0.3, max_delta_step=13\n",
"\tlogloss 0.030186 and error 0.0035382000000000005 for 10 rounds\n",
"CV with max_depth=10, learning_rate=0.5, max_delta_step=1\n",
"\tlogloss 0.4758826 and error 0.0035388000000000004 for 0 rounds\n",
"CV with max_depth=10, learning_rate=0.5, max_delta_step=4\n",
"\tlogloss 0.1779542 and error 0.0035388000000000004 for 1 rounds\n",
"CV with max_depth=10, learning_rate=0.5, max_delta_step=7\n",
"\tlogloss 0.1779542 and error 0.0035388000000000004 for 1 rounds\n",
"CV with max_depth=10, learning_rate=0.5, max_delta_step=10\n",
"\tlogloss 0.1779542 and error 0.0035388000000000004 for 1 rounds\n",
"CV with max_depth=10, learning_rate=0.5, max_delta_step=13\n",
"\tlogloss 0.1779542 and error 0.0035388000000000004 for 1 rounds\n",
"Best params: max_depth: 8, learning_rate: 0.5, max_delta_step: 1, logloss: 0.0192622, error: 0.0035381999999999996\n"
]
}
],
"source": [
"xgtrain = xgb.DMatrix(train_data, train_labels)\n",
"\n",
"# for parameter values, see here https://xgboost.readthedocs.io/en/latest/parameter.html\n",
"params = {'max_depth': 4, # depth of a decision tree\n",
" 'learning_rate': 0.1,\n",
" #'min_split_loss': 1,\n",
" #'min_child_weight': 1,\n",
" 'max_delta_step': 10,\n",
" 'tree_method': 'exact',\n",
" 'predictor': 'cpu_predictor',\n",
" 'objective': 'reg:logistic'}\n",
"\n",
"gridsearch_params = [\n",
" (max_depth, learning_rate, max_delta_step)\n",
" for max_depth in [6, 7, 8, 9, 10]\n",
" for learning_rate in [0.01, 0.1, 0.3, 0.5]\n",
" for max_delta_step in [1, 4, 7, 10, 13]\n",
"]\n",
"\n",
"# best so far\n",
"# 7 0.3 4 # 2022-01-03\n",
"# 8 0.5 1\n",
"\n",
"min_loss, min_err = float(\"Inf\"), 0\n",
"best_params = None# We start by the largest values and go down to the smallest\n",
"\n",
"for max_depth, learning_rate, max_delta_step in gridsearch_params:\n",
" print(\"CV with max_depth={}, learning_rate={}, max_delta_step={}\".format(\n",
" max_depth,\n",
" learning_rate,\n",
" max_delta_step)) # We update our parameters\n",
" \n",
" params['max_depth'] = max_depth\n",
" params['learning_rate'] = learning_rate\n",
" params['max_delta_step'] = max_delta_step\n",
" \n",
" # Run CV\n",
" cv_results = xgb.cv(\n",
" params,\n",
" xgtrain,\n",
" num_boost_round=1000,\n",
" folds=sklearn.model_selection.StratifiedKFold(n_splits=5, shuffle=True),\n",
" metrics={'logloss', 'error'},\n",
" early_stopping_rounds=10\n",
" ) # Update best score\n",
" \n",
" min_ll = cv_results['test-logloss-mean'].min()\n",
" min_er = cv_results['test-error-mean'].min()\n",
" boost_rounds = cv_results['test-logloss-mean'].argmin()\n",
" \n",
" print(\"\\tlogloss {} and error {} for {} rounds\".format(min_ll, min_er, boost_rounds))\n",
" \n",
" if min_ll < min_loss:\n",
" min_loss = min_ll\n",
" min_err = min_er\n",
" best_params = (max_depth, learning_rate, max_delta_step)\n",
" \n",
"print(\"Best params: max_depth: {}, learning_rate: {}, max_delta_step: {}, logloss: {}, error: {}\".format(best_params[0], best_params[1], best_params[2], min_loss, min_err))"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"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.6.9"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment