Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
C
courseML_phd2023
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Requirements
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Locked files
Build
Pipelines
Jobs
Pipeline schedules
Test cases
Artifacts
Deploy
Releases
Package registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Code review analytics
Issue analytics
Insights
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
GitLab community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
GILSON Matthieu
courseML_phd2023
Commits
63a0b4c8
Commit
63a0b4c8
authored
2 years ago
by
GILSON Matthieu
Browse files
Options
Downloads
Patches
Plain Diff
Delete basic2_classifiers.ipynb
parent
62218181
No related branches found
No related tags found
No related merge requests found
Changes
1
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
nb_supervised_learning/basic2_classifiers.ipynb
+0
-445
0 additions, 445 deletions
nb_supervised_learning/basic2_classifiers.ipynb
with
0 additions
and
445 deletions
nb_supervised_learning/basic2_classifiers.ipynb
deleted
100644 → 0
+
0
−
445
View file @
62218181
{
"cells": [
{
"cell_type": "markdown",
"id": "2628a7ec",
"metadata": {},
"source": [
"# 3) Comparing classifiers \n",
"\n",
"author: Mat Gilson, https://github.com/MatthieuGilson\n",
"\n",
"This notebook compares different classifiers for a synthetic dataset. It includes nested cross-validation to optimize hyperparameters.\n",
"\n",
"See also the documentation of scikit-learn library (https://scikit-learn.org/)"
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "ec9bb8b2",
"metadata": {},
"outputs": [],
"source": [
"# import librairies\n",
"\n",
"import numpy as np\n",
"\n",
"from sklearn.model_selection import StratifiedShuffleSplit, StratifiedKFold\n",
"\n",
"# classifiers\n",
"from sklearn.linear_model import LogisticRegression\n",
"from sklearn.neighbors import KNeighborsClassifier\n",
"from sklearn.ensemble import RandomForestClassifier\n",
"from sklearn.discriminant_analysis import QuadraticDiscriminantAnalysis\n",
"\n",
"import pandas as pd\n",
"\n",
"%matplotlib inline\n",
"import matplotlib as mpl\n",
"import matplotlib.pyplot as plt\n",
"import seaborn as sb\n",
"\n",
"font = {'family' : 'DejaVu Sans',\n",
" 'weight' : 'regular',\n",
" 'size' : 18}\n",
"mpl.rc('font', **font)"
]
},
{
"cell_type": "markdown",
"id": "5e78fcf9",
"metadata": {},
"source": [
"Let's generate a dataset for classification, including labels."
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "aef4882d",
"metadata": {},
"outputs": [],
"source": [
"# create synthetic dataset where 2 classes of s0+s1 samples of m-dimensional inputs with controlled contrast\n",
"def gen_inputs(m, # input dimensionality\n",
" s0, # number of samples for class 0\n",
" s1, # number of samples for class 1\n",
" scaling): # scaling factor to separate classes\n",
"\n",
" # labels\n",
" lbl = np.zeros([s0+s1], dtype=int)\n",
" # inputs\n",
" X = np.zeros([s0+s1,m])\n",
"\n",
" # create s0 and s1 samples for the 2 classes\n",
" for i in range(s0+s1):\n",
" # label\n",
" lbl[i] = int(i<s0)\n",
" # inputs are random noise plus a shift\n",
" for j in range(m):\n",
" # positive/negative shift for 1st/2nd class\n",
" if i<s0:\n",
" a = -scaling\n",
" else:\n",
" a = scaling\n",
" # the shift linearly depends on the feature index j\n",
" X[i,j] = a*j/m + np.random.randn()\n",
" \n",
" return X, lbl"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "4d4bade5",
"metadata": {},
"outputs": [],
"source": [
"# input properties\n",
"m = 10 # input dimensionality\n",
"s0 = 100 # number of samples for class 0\n",
"s1 = 100 # number of samples for class 1\n",
"scaling = 1.0 # class contrast (try 0.5, 0.1)\n",
"\n",
"# generate inputs\n",
"X, y = gen_inputs(m, s0, s1, scaling)"
]
},
{
"cell_type": "markdown",
"id": "45051d6f",
"metadata": {},
"source": [
"## Comparison of classifiers\n",
"\n",
"We want to compare the accuracy for different classifiers:\n",
"- MLR is the multinomial logistic regression\n",
"- 1NN is the 1-nearest-neighbor\n",
"- RF is a random forest\n",
"- QDA is a quadratic discrimnant analysis"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "5ffeb39f",
"metadata": {},
"outputs": [],
"source": [
"# classifiers\n",
"clf_MLR = LogisticRegression(penalty='l2', solver='lbfgs', max_iter=500)\n",
"\n",
"clf_1NN = KNeighborsClassifier(n_neighbors=1, algorithm='brute', metric='minkowski')\n",
"\n",
"clf_RF = RandomForestClassifier(n_estimators=10)\n",
"\n",
"clf_QDA = QuadraticDiscriminantAnalysis()\n",
"\n",
"dict_clf = {'MLR': clf_MLR,\n",
" '1NN': clf_1NN,\n",
" 'RF': clf_RF,\n",
" 'QDA': clf_QDA}\n",
"\n",
"# dictionary of hyperparameters and ranges to explore (grid search)\n",
"dict_params = {'C': [0.01,0.1,1.0,10.0,100.0], # C for regularization\n",
" 'n_neighbors': [1,2,3,4,5], # k nearest neighbors\n",
" 'criterion': ['gini', 'entropy'], # splitting quality eval\n",
" 'reg_param': [0.01,0.1,1.0]} # regularization param"
]
},
{
"cell_type": "markdown",
"id": "a5ed9e3c",
"metadata": {},
"source": [
"We use cross-validation with the evaluation of test accuracy, as well as nested cross-validation to optimize hyperparameters."
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "08581b70",
"metadata": {},
"outputs": [],
"source": [
"# outer cross-validation scheme: 80% for training and 20% for testing\n",
"cvs = StratifiedShuffleSplit(n_splits=20, test_size=0.2)"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "7065006a",
"metadata": {},
"outputs": [],
"source": [
"# nested cross-validation scheme\n",
"n_split_nest = 5\n",
"cv_nest = StratifiedKFold(n_splits=n_split_nest)\n",
"\n",
"# function to train hyperparameter with nested (inner) cross-validation\n",
"def nested_CV(clf, X, y, param_name, param_vals):\n",
" acc_nest = np.zeros([len(param_vals),n_split_nest])\n",
" j = 0\n",
" for ind0, ind1 in cv_nest.split(X, y):\n",
" # split in train and validation sets\n",
" X0, X1 = X[ind0], X[ind1]\n",
" y0, y1 = y[ind0], y[ind1]\n",
" # train classifier over all reg parameters\n",
" for i, val in enumerate(param_vals):\n",
" # set parameter\n",
" clf.set_params(**{param_name: val})\n",
" # train classifier on X0\n",
" clf.fit(X0, y0)\n",
" # test classifier on X1\n",
" acc_nest[i,j] = clf.score(X1,y1)\n",
" j += 1\n",
" # get and return best parameter\n",
" i_best = np.argmax(acc_nest.mean(1))\n",
" return param_vals[i_best]"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "cc99137f",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"C [0.01, 0.1, 1.0, 10.0, 100.0]\n",
"1.0\n",
"1.0\n",
"1.0\n",
"1.0\n",
"1.0\n",
"1.0\n",
"1.0\n",
"1.0\n",
"1.0\n",
"1.0\n",
"1.0\n",
"1.0\n",
"1.0\n",
"1.0\n",
"1.0\n",
"1.0\n",
"1.0\n",
"1.0\n",
"1.0\n",
"1.0\n",
"n_neighbors [1, 2, 3, 4, 5]\n",
"5\n",
"5\n",
"5\n",
"5\n",
"5\n",
"5\n",
"5\n",
"5\n",
"5\n",
"5\n",
"5\n",
"5\n",
"5\n",
"5\n",
"5\n",
"5\n",
"5\n",
"5\n",
"5\n",
"5\n",
"criterion ['gini', 'entropy']\n",
"gini\n",
"gini\n",
"gini\n",
"entropy\n",
"entropy\n",
"gini\n",
"entropy\n",
"gini\n",
"entropy\n",
"gini\n",
"gini\n",
"gini\n",
"gini\n",
"entropy\n",
"gini\n",
"gini\n",
"entropy\n",
"entropy\n",
"gini\n",
"gini\n",
"reg_param [0.01, 0.1, 1.0]\n",
"1.0\n",
"1.0\n",
"1.0\n",
"1.0\n",
"1.0\n",
"1.0\n",
"1.0\n",
"1.0\n",
"1.0\n",
"1.0\n",
"1.0\n",
"1.0\n",
"1.0\n",
"1.0\n",
"1.0\n",
"1.0\n",
"1.0\n",
"1.0\n",
"1.0\n",
"1.0\n",
"\n",
" type clf score\n",
"0 train MLR 0.96250\n",
"1 test MLR 0.97500\n",
"2 shuf MLR 0.67500\n",
"3 train MLR 0.96250\n",
"4 test MLR 0.95000\n",
".. ... ... ...\n",
"235 test QDA 0.97500\n",
"236 shuf QDA 0.87500\n",
"237 train QDA 0.95625\n",
"238 test QDA 0.92500\n",
"239 shuf QDA 0.12500\n",
"\n",
"[240 rows x 3 columns]\n"
]
}
],
"source": [
"# to store result accuracies\n",
"acc = pd.DataFrame(columns=['type', 'clf', 'score'])\n",
"\n",
"# loop over classifiers\n",
"iterable = iter(dict_params)\n",
"for i, k in enumerate(dict_clf):\n",
" # get classifier and related information\n",
" clf = dict_clf[k]\n",
" param_name = next(iterable)\n",
" param_vals = dict_params[param_name]\n",
" print(param_name, param_vals)\n",
"\n",
" # repeat classification\n",
" for train_ind, test_ind in cvs.split(X, y):\n",
" # train and test classifiers with subject labels\n",
" best_param = nested_CV(clf, X, y, param_name, param_vals)\n",
" clf.set_params(**{param_name: best_param})\n",
" print(best_param)\n",
" # fit with best parameter\n",
" clf.fit(X[train_ind,:], y[train_ind])\n",
" # train and test accuracies\n",
" d = {'type': ['train'],\n",
" 'clf': [k], \n",
" 'score': [clf.score(X[train_ind,:], y[train_ind])]}\n",
" acc = pd.concat((acc, pd.DataFrame(data=d)), ignore_index=True)\n",
" d = {'type': ['test'],\n",
" 'clf': [k], \n",
" 'score': [clf.score(X[test_ind,:], y[test_ind])]}\n",
" acc = pd.concat((acc, pd.DataFrame(data=d)), ignore_index=True)\n",
"\n",
" # shuffling labels and fit again for evaluation of chance level\n",
" train_ind_rand = np.random.permutation(train_ind)\n",
" clf.fit(X[train_ind,:], y[train_ind_rand])\n",
" d = {'type': ['shuf'],\n",
" 'clf': [k], \n",
" 'score': [clf.score(X[test_ind,:], y[test_ind])]}\n",
" acc = pd.concat((acc, pd.DataFrame(data=d)), ignore_index=True)\n",
" \n",
"# print table of results\n",
"print()\n",
"print(acc)"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "ebeab02a",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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pRgddry8vJCVlYWMjAzDtubNmwMAzp07V6ptbGws0tPTeccWERER1Rqjw06HDh0AAH///bdhW58+fSCKIt5++23D5az8/Hy8+OKLAID27dsbe1oiIiKiSjE67AwZMgSiKGLHjh2GbXPnzoVKpcKRI0fQqFEjdO/eHV5eXti3bx8EQcC8efOMPS0RERFRpRgddgIDA7FixQr4+voatvn4+GDr1q2wt7dHSkoKgoODkZycDEEQ8Morr2DixInGnpaIiIioUky+6nlJKSkpOHjwIKKjo+Ho6IgBAwagRYsWNXW6auE8O0REROZH0lXPS3JxccGkSZNq8hREREREFeKq50RERGTRGHaIiIjIojHsEBERkUVj2CEiIiKLxrBDREREFo1hh4iIiCwaww4RERFZNIYdIiIismgMO0RERGTRGHaIiIjIojHsEBERkUVj2CEiIiKLxrBDREREFo1hh4iIiCwaww4RERFZNIYdIiIismgMO0RERGTRGHaIiIjIojHsEBERkUVj2CEiIiKLxrBDREREFo1hh4iIiCwaww4RERFZNIYdIiIismgMO0RERGTRGHaIiIjIojHsEBERkUVj2CEiIiKLxrBDREREFo1hh4iIiCwaww4RERFZNIYdIiIismgMO0RERGTRGHaIiIjIojHsEBERkUVj2CEiIiKLxrBDREREFo1hh4iIiCwaww4RERFZNIYdIiIismgMO0RERGTRGHaIiIjIojHsEBERkUVj2CEiIiKLxrBDREREFo1hh4iIiCwaww4RERFZNIYdIiIismgMO0RERGTRGHaIiIjIojHsEBERkUVj2CEiIiKLxrBDREREFo1hh4iIiCwaww4RERFZNIYdIiIismgMO0RERGTRGHaIiIjIojHsEBERkUVj2CEiIiKLxrBDREREFo1hh4iIiCwaww4RERFZNIYdIiIismgMO0RERGTRGHaIiIjIojHsEBERkUVTSF0AERGRudJqtSgoKJC6DIujUCggl8shCIJpjmeSoxAREdUjoigiPj4eaWlpUpdiseRyOdzd3eHo6Gh06GHYISIiqqLioOPu7g61Wm2yHgjSB8nCwkJkZGQgLi4Oubm58PT0NOqYDDtERERVoNVqDUHH1dVV6nIslr29PVQqFZKSkuDu7g65XF7tY3GAMhERURUUj9FRq9USV2L5bG1tIYqi0eOiGHaI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",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# plot: train versus test accuracy\n",
"acc2 = acc[np.logical_or(acc['type']=='train',acc['type']=='test')]\n",
"\n",
"# theoretical chance level\n",
"chance_level = 0.5\n",
"\n",
"sb.violinplot(data=acc2, x='clf', y='score', hue='type', split=True, scale='width', palette=['brown','orange']) # cut=0\n",
"plt.plot([-1,4], [chance_level]*2, '--k')\n",
"plt.yticks([0,1])\n",
"plt.xlabel('classifier')\n",
"plt.ylabel('accuracy')\n",
"plt.legend(loc='lower right', fontsize=11)\n",
"plt.show()\n"
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "77102885",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAjsAAAHECAYAAADf+usKAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAAB2CklEQVR4nO3dd3zTdf4H8Nc3adI2HeketKULKKPsIVRkVjYICqIow71FFBUVBMed5513+PPw7hwHiIgoynSByhCQIUP2KF10UtrSdCdt8v39kUtsgZa2Gd+M1/Px6MOSfvP9vhvT5JXPFERRFEFERETkomRSF0BERERkSww7RERE5NIYdoiIiMilMewQERGRS2PYISIiIpfGsENEREQujWGHiIiIXJqH1AVIzWAwID8/H35+fhAEQepyiIiIqAVEUURFRQXatWsHmaz5thu3Dzv5+fmIiYmRugwiIiJqg5ycHERHRzd7jNuHHT8/PwDGB8vf31/iaoiIiKglysvLERMTY34fb47bhx1T15W/vz/DDhERkZNpyRAUDlAmIiIil8awQ0RERC6NYYeIiIhcGsMOERERuTSGHSIiInJpDDtERETk0hh2iIiIyKUx7BAREZFLY9ghIiIil8awQ0RERC6NYYeIiIhcGsMOERERuTSGHSIiInJpbr/rORERuRdRFPHVV18hLy8PAwYMQEpKitQlkY0x7BARkVtJT0/HqlWrAAD79+9n2HED7MYiIiK3Ulpaav5ep9NJWAnZC8MOERG5FY1GI3UJZGcMO0RE5FbKy8ulLoHsjGGHiIjcSllZmdQlkJ0x7BARkVtpOGaH3APDDhERuRW27Lgfhh0iInIrJSUlUpdAdsawQ0REbkMURRQXF0tdBtkZww4REbmNyspKaLVaqcsgO2PYISIit8FWHffEsENERG6jsLAQAKBQKCSuhOyJYYeIiNyGKewolUqJKyF7YtghIiK3YQo7np6eEldC9sSwQ0REbiM/Px8Aw467YdghIiK3kZubCwDw9vaWuBKyJ4YdIiJyCzU1NebZWF5eXhJXQ/bEsENERG7B1Krj4eEBuVwucTVkTww7RETkFrKysgCwC8sdMewQEZFbMIUdlUolbSFkdww7RETkFjIzMwGwZccdMewQEZHLMxgMSE9PB8CWHXfEsENERC4vPz8f1dXVkMlkbNlxQww7RETk8tLS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A5SJiIjIpTHsEBERkUtj2CGn5+npicWLF8PT01PqUlwaH2f74ONsH3yc3YvbD1AmIiIi18aWHSIiInJpDDtERETk0hh2iIiIyKUx7BAREZFLY9ghu1iyZAkEQTB/rV279ob3GT9+fKP7ZGVlNfp5XFwcBEHAnDlzWlWL6X5Xf/n6+qJz58647777sH///lad01FUV1fj+++/x5tvvonbb78dsbGx5t9vyZIlzd53zpw55mOjoqJQXV3d5LE7d+5s8v8L0Pgxnjx5crPXNT034uLibvwLOqGrn/umL09PT7Rr1w6jR4/Gxx9/jLq6uuvePysr67r3v97XypUr7fvL2UltbS0++OADTJw4Ee3bt4e3tzfUajW6dOmCRx55BL/88kuz97/e37xCoUBwcDASExMxYcIEvPrqq/j9999bXdsLL7xgPue9997bxt+QbI1hhySxYsWKZn+en5+PrVu32rQGLy8vhIeHIzw8HGFhYaipqcG5c+ewcuVKpKSk4PXXX7fp9W3h4MGDGDduHBYtWoQNGzbg4sWLbTpPfn4+/u///s8qNW3atAm//vqrVc7l7EzPt/DwcHh4eKCgoADbtm3DQw89hJSUFFy5cqXZ+/v7+zc6x9Vf3t7edvpN7OfHH39Ex44d8eijj+Kbb75BTk4OlEoltFotzp49iw8//BBDhw7FpEmTbvj4NfybDwoKQnV1NTIyMvDtt9/ijTfeQO/evTFo0CAcP368RbXV19fj008/Nf/766+/RllZmSW/LtkIww7ZVUhICHx8fPDTTz8hJyenyeNWrVoFvV5v00/706dPR2FhIQoLC3Hp0iXU1tZix44dSE5OhiiKWLx4MX7++WebXd9WAgMDMXLkSDz//PP4/PPPERER0abzvP322ygtLbVKTQsWLLDKeZyd6flWWFiIqqoqZGdn46GHHgIAHDp0CE8//XSz9/+///u/Rue4+mv69On2+DXs5ssvv8S4ceOQm5uLqKgofPzxxygtLYVGo0FtbS3OnDmDZ555Bh4eHtiyZQtSUlJQUlLS5Pmu/puvqamBRqPB9u3b8dBDD8HT0xP79+9H//798c0339ywvm+//RaFhYXo2rUrRowYgdraWqxZs8aaDwFZCcMO2ZWPjw+mTp0Kg8GATz75pMnjTC0/re2isoRCocCwYcOwadMmeHgYt43773//a7frW8Mt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",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# test versus baseline accuracy\n",
"acc2 = acc[np.logical_or(acc['type']=='shuf',acc['type']=='test')]\n",
"\n",
"sb.violinplot(data=acc2, x='clf', y='score', hue='type', hue_order=['shuf','test'], \n",
" split=True, scale='width', palette=['gray','orange'])\n",
"plt.plot([-1,4], [chance_level]*2, '--k')\n",
"plt.yticks([0,1])\n",
"plt.xlabel('classifier')\n",
"plt.ylabel('accuracy')\n",
"plt.legend(loc='lower right', fontsize=11)\n",
"plt.show()"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"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.11.3"
}
},
"nbformat": 4,
"nbformat_minor": 5
}
%% Cell type:markdown id:2628a7ec tags:
# 3) Comparing classifiers
author: Mat Gilson, https://github.com/MatthieuGilson
This notebook compares different classifiers for a synthetic dataset. It includes nested cross-validation to optimize hyperparameters.
See also the documentation of scikit-learn library (https://scikit-learn.org/)
%% Cell type:code id:ec9bb8b2 tags:
```
python
# import librairies
import
numpy
as
np
from
sklearn.model_selection
import
StratifiedShuffleSplit
,
StratifiedKFold
# classifiers
from
sklearn.linear_model
import
LogisticRegression
from
sklearn.neighbors
import
KNeighborsClassifier
from
sklearn.ensemble
import
RandomForestClassifier
from
sklearn.discriminant_analysis
import
QuadraticDiscriminantAnalysis
import
pandas
as
pd
%
matplotlib
inline
import
matplotlib
as
mpl
import
matplotlib.pyplot
as
plt
import
seaborn
as
sb
font
=
{
'
family
'
:
'
DejaVu Sans
'
,
'
weight
'
:
'
regular
'
,
'
size
'
:
18
}
mpl
.
rc
(
'
font
'
,
**
font
)
```
%% Cell type:markdown id:5e78fcf9 tags:
Let's generate a dataset for classification, including labels.
%% Cell type:code id:aef4882d tags:
```
python
# create synthetic dataset where 2 classes of s0+s1 samples of m-dimensional inputs with controlled contrast
def
gen_inputs
(
m
,
# input dimensionality
s0
,
# number of samples for class 0
s1
,
# number of samples for class 1
scaling
):
# scaling factor to separate classes
# labels
lbl
=
np
.
zeros
([
s0
+
s1
],
dtype
=
int
)
# inputs
X
=
np
.
zeros
([
s0
+
s1
,
m
])
# create s0 and s1 samples for the 2 classes
for
i
in
range
(
s0
+
s1
):
# label
lbl
[
i
]
=
int
(
i
<
s0
)
# inputs are random noise plus a shift
for
j
in
range
(
m
):
# positive/negative shift for 1st/2nd class
if
i
<
s0
:
a
=
-
scaling
else
:
a
=
scaling
# the shift linearly depends on the feature index j
X
[
i
,
j
]
=
a
*
j
/
m
+
np
.
random
.
randn
()
return
X
,
lbl
```
%% Cell type:code id:4d4bade5 tags:
```
python
# input properties
m
=
10
# input dimensionality
s0
=
100
# number of samples for class 0
s1
=
100
# number of samples for class 1
scaling
=
1.0
# class contrast (try 0.5, 0.1)
# generate inputs
X
,
y
=
gen_inputs
(
m
,
s0
,
s1
,
scaling
)
```
%% Cell type:markdown id:45051d6f tags:
## Comparison of classifiers
We want to compare the accuracy for different classifiers:
-
MLR is the multinomial logistic regression
-
1NN is the 1-nearest-neighbor
-
RF is a random forest
-
QDA is a quadratic discrimnant analysis
%% Cell type:code id:5ffeb39f tags:
```
python
# classifiers
clf_MLR
=
LogisticRegression
(
penalty
=
'
l2
'
,
solver
=
'
lbfgs
'
,
max_iter
=
500
)
clf_1NN
=
KNeighborsClassifier
(
n_neighbors
=
1
,
algorithm
=
'
brute
'
,
metric
=
'
minkowski
'
)
clf_RF
=
RandomForestClassifier
(
n_estimators
=
10
)
clf_QDA
=
QuadraticDiscriminantAnalysis
()
dict_clf
=
{
'
MLR
'
:
clf_MLR
,
'
1NN
'
:
clf_1NN
,
'
RF
'
:
clf_RF
,
'
QDA
'
:
clf_QDA
}
# dictionary of hyperparameters and ranges to explore (grid search)
dict_params
=
{
'
C
'
:
[
0.01
,
0.1
,
1.0
,
10.0
,
100.0
],
# C for regularization
'
n_neighbors
'
:
[
1
,
2
,
3
,
4
,
5
],
# k nearest neighbors
'
criterion
'
:
[
'
gini
'
,
'
entropy
'
],
# splitting quality eval
'
reg_param
'
:
[
0.01
,
0.1
,
1.0
]}
# regularization param
```
%% Cell type:markdown id:a5ed9e3c tags:
We use cross-validation with the evaluation of test accuracy, as well as nested cross-validation to optimize hyperparameters.
%% Cell type:code id:08581b70 tags:
```
python
# outer cross-validation scheme: 80% for training and 20% for testing
cvs
=
StratifiedShuffleSplit
(
n_splits
=
20
,
test_size
=
0.2
)
```
%% Cell type:code id:7065006a tags:
```
python
# nested cross-validation scheme
n_split_nest
=
5
cv_nest
=
StratifiedKFold
(
n_splits
=
n_split_nest
)
# function to train hyperparameter with nested (inner) cross-validation
def
nested_CV
(
clf
,
X
,
y
,
param_name
,
param_vals
):
acc_nest
=
np
.
zeros
([
len
(
param_vals
),
n_split_nest
])
j
=
0
for
ind0
,
ind1
in
cv_nest
.
split
(
X
,
y
):
# split in train and validation sets
X0
,
X1
=
X
[
ind0
],
X
[
ind1
]
y0
,
y1
=
y
[
ind0
],
y
[
ind1
]
# train classifier over all reg parameters
for
i
,
val
in
enumerate
(
param_vals
):
# set parameter
clf
.
set_params
(
**
{
param_name
:
val
})
# train classifier on X0
clf
.
fit
(
X0
,
y0
)
# test classifier on X1
acc_nest
[
i
,
j
]
=
clf
.
score
(
X1
,
y1
)
j
+=
1
# get and return best parameter
i_best
=
np
.
argmax
(
acc_nest
.
mean
(
1
))
return
param_vals
[
i_best
]
```
%% Cell type:code id:cc99137f tags:
```
python
# to store result accuracies
acc
=
pd
.
DataFrame
(
columns
=
[
'
type
'
,
'
clf
'
,
'
score
'
])
# loop over classifiers
iterable
=
iter
(
dict_params
)
for
i
,
k
in
enumerate
(
dict_clf
):
# get classifier and related information
clf
=
dict_clf
[
k
]
param_name
=
next
(
iterable
)
param_vals
=
dict_params
[
param_name
]
print
(
param_name
,
param_vals
)
# repeat classification
for
train_ind
,
test_ind
in
cvs
.
split
(
X
,
y
):
# train and test classifiers with subject labels
best_param
=
nested_CV
(
clf
,
X
,
y
,
param_name
,
param_vals
)
clf
.
set_params
(
**
{
param_name
:
best_param
})
print
(
best_param
)
# fit with best parameter
clf
.
fit
(
X
[
train_ind
,:],
y
[
train_ind
])
# train and test accuracies
d
=
{
'
type
'
:
[
'
train
'
],
'
clf
'
:
[
k
],
'
score
'
:
[
clf
.
score
(
X
[
train_ind
,:],
y
[
train_ind
])]}
acc
=
pd
.
concat
((
acc
,
pd
.
DataFrame
(
data
=
d
)),
ignore_index
=
True
)
d
=
{
'
type
'
:
[
'
test
'
],
'
clf
'
:
[
k
],
'
score
'
:
[
clf
.
score
(
X
[
test_ind
,:],
y
[
test_ind
])]}
acc
=
pd
.
concat
((
acc
,
pd
.
DataFrame
(
data
=
d
)),
ignore_index
=
True
)
# shuffling labels and fit again for evaluation of chance level
train_ind_rand
=
np
.
random
.
permutation
(
train_ind
)
clf
.
fit
(
X
[
train_ind
,:],
y
[
train_ind_rand
])
d
=
{
'
type
'
:
[
'
shuf
'
],
'
clf
'
:
[
k
],
'
score
'
:
[
clf
.
score
(
X
[
test_ind
,:],
y
[
test_ind
])]}
acc
=
pd
.
concat
((
acc
,
pd
.
DataFrame
(
data
=
d
)),
ignore_index
=
True
)
# print table of results
print
()
print
(
acc
)
```
%% Output
C [0.01, 0.1, 1.0, 10.0, 100.0]
1.0
1.0
1.0
1.0
1.0
1.0
1.0
1.0
1.0
1.0
1.0
1.0
1.0
1.0
1.0
1.0
1.0
1.0
1.0
1.0
n_neighbors [1, 2, 3, 4, 5]
5
5
5
5
5
5
5
5
5
5
5
5
5
5
5
5
5
5
5
5
criterion ['gini', 'entropy']
gini
gini
gini
entropy
entropy
gini
entropy
gini
entropy
gini
gini
gini
gini
entropy
gini
gini
entropy
entropy
gini
gini
reg_param [0.01, 0.1, 1.0]
1.0
1.0
1.0
1.0
1.0
1.0
1.0
1.0
1.0
1.0
1.0
1.0
1.0
1.0
1.0
1.0
1.0
1.0
1.0
1.0
type clf score
0 train MLR 0.96250
1 test MLR 0.97500
2 shuf MLR 0.67500
3 train MLR 0.96250
4 test MLR 0.95000
.. ... ... ...
235 test QDA 0.97500
236 shuf QDA 0.87500
237 train QDA 0.95625
238 test QDA 0.92500
239 shuf QDA 0.12500
[240 rows x 3 columns]
%% Cell type:code id:ebeab02a tags:
```
python
# plot: train versus test accuracy
acc2
=
acc
[
np
.
logical_or
(
acc
[
'
type
'
]
==
'
train
'
,
acc
[
'
type
'
]
==
'
test
'
)]
# theoretical chance level
chance_level
=
0.5
sb
.
violinplot
(
data
=
acc2
,
x
=
'
clf
'
,
y
=
'
score
'
,
hue
=
'
type
'
,
split
=
True
,
scale
=
'
width
'
,
palette
=
[
'
brown
'
,
'
orange
'
])
# cut=0
plt
.
plot
([
-
1
,
4
],
[
chance_level
]
*
2
,
'
--k
'
)
plt
.
yticks
([
0
,
1
])
plt
.
xlabel
(
'
classifier
'
)
plt
.
ylabel
(
'
accuracy
'
)
plt
.
legend
(
loc
=
'
lower right
'
,
fontsize
=
11
)
plt
.
show
()
```
%% Output
%% Cell type:code id:77102885 tags:
```
python
# test versus baseline accuracy
acc2
=
acc
[
np
.
logical_or
(
acc
[
'
type
'
]
==
'
shuf
'
,
acc
[
'
type
'
]
==
'
test
'
)]
sb
.
violinplot
(
data
=
acc2
,
x
=
'
clf
'
,
y
=
'
score
'
,
hue
=
'
type
'
,
hue_order
=
[
'
shuf
'
,
'
test
'
],
split
=
True
,
scale
=
'
width
'
,
palette
=
[
'
gray
'
,
'
orange
'
])
plt
.
plot
([
-
1
,
4
],
[
chance_level
]
*
2
,
'
--k
'
)
plt
.
yticks
([
0
,
1
])
plt
.
xlabel
(
'
classifier
'
)
plt
.
ylabel
(
'
accuracy
'
)
plt
.
legend
(
loc
=
'
lower right
'
,
fontsize
=
11
)
plt
.
show
()
```
%% Output
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment