{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "### Leakage of test set information\n", "\n" ] }, { "cell_type": "code", "execution_count": 58, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import pandas as pd\n", "from sklearn.preprocessing import StandardScaler\n", "from sklearn.model_selection import train_test_split\n", "from sklearn.feature_selection import SelectKBest\n", "from sklearn.linear_model import SGDClassifier\n", "from sklearn.metrics import accuracy_score\n", "import seaborn as sns\n" ] }, { "cell_type": "code", "execution_count": 43, "metadata": {}, "outputs": [], "source": [ "# generate data with no relations between features and target\n", "\n", "def mk_data(nobs=1000, nfeatures=1000, p=0.5, seed=None):\n", " rng = np.random.RandomState(seed)\n", " X = rng.normal(size=(nobs, nfeatures))\n", " y = rng.binomial(1, p, size=nobs)\n", " return X, y\n", "\n", "nobs = 100\n", "nfeatures = 10000\n", "X, y = mk_data(nobs, nfeatures)\n", "assert X.shape == (nobs, nfeatures)\n", "assert y.shape == (nobs,)\n", "\n", "\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Proper crossvalidation" ] }, { "cell_type": "code", "execution_count": 52, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "accuracy: 0.4904666666666667\n" ] } ], "source": [ "# split data into training and test sets\n", "\n", "X, y = mk_data(nobs, nfeatures, seed=1234)\n", "\n", "# do 100 shuffle splits\n", "scores = []\n", "nsplits = 500\n", "n_selected_features = 50\n", "\n", "for i in range(nsplits):\n", " X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)\n", " scaler = StandardScaler()\n", " X_train = scaler.fit_transform(X_train)\n", " X_test = scaler.transform(X_test)\n", " # select the best features using training set only\n", " selector = SelectKBest(k=n_selected_features)\n", " X_train = selector.fit_transform(X_train, y_train)\n", " X_test = selector.transform(X_test)\n", " # fit a classifier\n", " clf = SGDClassifier()\n", " clf.fit(X_train, y_train)\n", " score = clf.score(X_test, y_test)\n", " scores.append(score)\n", "\n", "print('accuracy:', np.mean(scores))\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Feature selection on the entire dataset" ] }, { "cell_type": "code", "execution_count": 53, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "accuracy: 0.9241333333333335\n" ] } ], "source": [ "X, y = mk_data(nobs, nfeatures, seed=1234)\n", "\n", "# do feature selection outside the loop - induces data leakage\n", "X = SelectKBest(k=n_selected_features).fit_transform(X, y)\n", "\n", "scores_bad_fsel = []\n", "\n", "for i in range(nsplits):\n", " X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)\n", " scaler = StandardScaler()\n", " X_train = scaler.fit_transform(X_train)\n", " X_test = scaler.transform(X_test)\n", " # fit a classifier\n", " clf = SGDClassifier()\n", " clf.fit(X_train, y_train)\n", " score = clf.score(X_test, y_test)\n", " scores_bad_fsel.append(score)\n", "\n", "print('accuracy:', np.mean(scores_bad_fsel))\n" ] }, { "cell_type": "code", "execution_count": 60, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 60, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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7twZe/fuRd++fbFw4UL861//wqVLlxAWFgYA+O2333DXXXchIyMDRqPR8fnatWuHp59+GjNmzHDhn5aIiPRSF0BEztG9e3cMHz4cXbt2xejRozFq1Cjcc889KC0txeXLlzF8+PAaP+748eOIjo52BDgAiI+PR1BQEI4fP46+ffsCAGJiYhwBDgASExNRUFCAkJCQKp+vqKgIZ8+edcGfkIiIKmOII1IJnU6HTZs2YdeuXdi4cSOWLl2KBQsWYPPmzTf8OEEQoNFo6nzdz8+vyu/bbDZERUVh69at1T42KCioUX8GIiKqP4Y4IhXRaDQYNGgQBg0ahBdeeAExMTHYtGkTYmNjsXnzZgwbNqzax8THxyMlJQWpqalVhlNzc3PRqVOnWr9Wr169kJ6eDr1ej9jYWFf9kYiIqBYMcUQqsWfPHmzevBmjRo1CeHg49uzZg8zMTHTq1AkLFy7EzJkzER4ejrFjxyI/Px87d+7EnDlzMGLECHTr1g0PPPAA3nnnHZSVleHxxx/HkCFD0KdPn1q/3ogRIzBgwABMmDABr732GuLi4nD58mWsW7cOEyZMuOHHEhFR0zHEEalEYGAgtm/fjnfeeQd5eXmIiYnB4sWLMXbsWABAcXEx3n77bcyfPx+hoaG45557AIjdu++//x5z5szB4MGDodVqMWbMGCxduvSGX0+j0WDdunVYsGABHnzwQWRmZiIyMhKDBw9GRESEy/+8RESejqtTiYiIiBSI+8QRERERKRBDHBEREZECMcQRERERKRBDHBEREZECMcQRERERKRBDHBEREZECMcQRERERKRBDHBEREZECMcQRERERKRBDHBEREZECMcQRERERKdD/A+vw+63SnmqhAAAAAElFTkSuQmCC", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "df_scores = pd.DataFrame({'proper_fsel': scores, 'bad_fsel': scores_bad_fsel})\n", "# gather the data in a long format\n", "df_scores = pd.melt(df_scores, var_name='method', value_name='score')\n", "\n", "sns.displot(data=df_scores, x='score', hue='method', kind='kde')\n", "\n", "import matplotlib.pyplot as plt\n", "plt.axvline(0.5, color='blue', linestyle='--')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Hyperparameter selection" ] }, { "cell_type": "code", "execution_count": 65, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{'C': 0.001, 'kernel': 'linear'}\n", "0.5900000000000001\n" ] } ], "source": [ "param_grid = [\n", " {'C': [.0001, .001, .01, 0.1, 1, 10, 100, 1000], 'kernel': ['linear']},\n", " {'C': [.0001, .001, .01, 0.1, 1, 10, 100, 1000], 'gamma': [100, 10, 1, 0.1, 0.01, 0.001, 0.0001], 'kernel': ['rbf']},\n", " ]\n", "\n", "from sklearn.model_selection import GridSearchCV\n", "from sklearn.svm import SVC\n", "\n", "X, y = mk_data(nobs, nfeatures, seed=1234)\n", "gs = GridSearchCV(SVC(), param_grid, cv=5)\n", "gs.fit(X, y)\n", "\n", "print(gs.best_params_)\n", "print(gs.best_score_)\n" ] }, { "cell_type": "code", "execution_count": 80, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([1.e-04, 1.e-03, 1.e-02, 1.e-01, 1.e+00, 1.e+01, 1.e+02, 1.e+03])" ] }, "execution_count": 80, "metadata": {}, "output_type": "execute_result" } ], "source": [ "10.**np.arange(-4, 4, 1)" ] }, { "cell_type": "code", "execution_count": 106, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{'clf': SGDClassifier(), 'clf__alpha': np.float64(10.0), 'clf__penalty': 'l2'}\n", "0.64\n" ] } ], "source": [ "from sklearn.pipeline import Pipeline\n", "from sklearn.svm import LinearSVC\n", "from sklearn.ensemble import RandomForestClassifier\n", "from sklearn.neural_network import MLPClassifier\n", "\n", "np.random.seed(14567)\n", "X, y = mk_data(nobs, nfeatures, seed=14567)\n", "\n", "pipeline = Pipeline([\n", " ('clf', None),\n", "])\n", "parameters = [\n", " {\n", " 'clf': (SGDClassifier(),),\n", " 'clf__alpha': 10.**np.arange(-4, 4, 1),\n", " 'clf__penalty': ('l1', 'l2', 'elasticnet'),\n", " }, \n", " {\n", " 'clf': (SVC(),),\n", " 'clf__C': 10.**np.arange(-4, 4, 1),\n", " 'clf__kernel': ('linear', 'rbf'),\n", " },\n", "\n", "]\n", "grid_search = GridSearchCV(pipeline, parameters,\n", " scoring='accuracy')\n", "grid_search.fit(X, y)\n", "\n", "print(grid_search.best_params_)\n", "print(grid_search.best_score_)" ] }, { "cell_type": "code", "execution_count": 107, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "40" ] }, "execution_count": 107, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(grid_search.cv_results_['mean_test_score'])\n" ] }, { "cell_type": "code", "execution_count": 108, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 108, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "sns.displot(grid_search.cv_results_['mean_test_score'], bins=10)" ] }, { "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.12.4" } }, "nbformat": 4, "nbformat_minor": 2 }