Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
95865 Model Evaluation Demo
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"import matplotlib.pyplot as plt\n",
"import numpy as np\n",
"%matplotlib inline"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Load data"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"from sklearn import datasets\n",
"iris = datasets.load_iris()\n",
"X = iris.data\n",
"y = iris.target\n",
"X, y = X[y != 2], y[y != 2]\n",
"n_samples, n_features = X.shape"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [],
"source": [
"# Add noisy features\n",
"random_state = np.random.RandomState(0)\n",
"X = np.c_[X, random_state.randn(n_samples, 200 * n_features)]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Hold out test data\n",
"\n",
"Hold out 25% of the data for testing."
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"from sklearn.model_selection import train_test_split\n",
"X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, shuffle=True)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# SVM: Create the hyperparameter grid"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[ 1.00000000e-04 1.61026203e-04 2.59294380e-04 4.17531894e-04\n",
" 6.72335754e-04 1.08263673e-03 1.74332882e-03 2.80721620e-03\n",
" 4.52035366e-03 7.27895384e-03 1.17210230e-02 1.88739182e-02\n",
" 3.03919538e-02 4.89390092e-02 7.88046282e-02 1.26896100e-01\n",
" 2.04335972e-01 3.29034456e-01 5.29831691e-01 8.53167852e-01\n",
" 1.37382380e+00 2.21221629e+00 3.56224789e+00 5.73615251e+00\n",
" 9.23670857e+00 1.48735211e+01 2.39502662e+01 3.85662042e+01\n",
" 6.21016942e+01 1.00000000e+02]\n"
]
}
],
"source": [
"Cs = np.logspace(-4, 2, 30) # 30 numbers evenly spaced between 10^-4 and 10^(2)\n",
"print(Cs)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# SVM: 5-fold cross-validation to select $C$"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"C = 0.0001\n",
"\t[fold 0] C: 0.00010, accuracy: 0.60000\n",
"\t[fold 1] C: 0.00010, accuracy: 0.46667\n",
"\t[fold 2] C: 0.00010, accuracy: 0.80000\n",
"\t[fold 3] C: 0.00010, accuracy: 0.26667\n",
"\t[fold 4] C: 0.00010, accuracy: 0.53333\n",
"\tMean k-Fold score: 0.533333333333\n",
"C = 0.000161026202756\n",
"\t[fold 0] C: 0.00016, accuracy: 0.60000\n",
"\t[fold 1] C: 0.00016, accuracy: 0.46667\n",
"\t[fold 2] C: 0.00016, accuracy: 0.86667\n",
"\t[fold 3] C: 0.00016, accuracy: 0.26667\n",
"\t[fold 4] C: 0.00016, accuracy: 0.53333\n",
"\tMean k-Fold score: 0.546666666667\n",
"C = 0.00025929437974\n",
"\t[fold 0] C: 0.00026, accuracy: 0.60000\n",
"\t[fold 1] C: 0.00026, accuracy: 0.46667\n",
"\t[fold 2] C: 0.00026, accuracy: 0.86667\n",
"\t[fold 3] C: 0.00026, accuracy: 0.33333\n",
"\t[fold 4] C: 0.00026, accuracy: 0.53333\n",
"\tMean k-Fold score: 0.56\n",
"C = 0.000417531893656\n",
"\t[fold 0] C: 0.00042, accuracy: 0.60000\n",
"\t[fold 1] C: 0.00042, accuracy: 0.46667\n",
"\t[fold 2] C: 0.00042, accuracy: 0.86667\n",
"\t[fold 3] C: 0.00042, accuracy: 0.46667\n",
"\t[fold 4] C: 0.00042, accuracy: 0.60000\n",
"\tMean k-Fold score: 0.6\n",
"C = 0.00067233575365\n",
"\t[fold 0] C: 0.00067, accuracy: 0.53333\n",
"\t[fold 1] C: 0.00067, accuracy: 0.66667\n",
"\t[fold 2] C: 0.00067, accuracy: 0.86667\n",
"\t[fold 3] C: 0.00067, accuracy: 0.60000\n",
"\t[fold 4] C: 0.00067, accuracy: 0.60000\n",
"\tMean k-Fold score: 0.653333333333\n",
"C = 0.00108263673387\n",
"\t[fold 0] C: 0.00108, accuracy: 0.60000\n",
"\t[fold 1] C: 0.00108, accuracy: 0.66667\n",
"\t[fold 2] C: 0.00108, accuracy: 0.86667\n",
"\t[fold 3] C: 0.00108, accuracy: 0.66667\n",
"\t[fold 4] C: 0.00108, accuracy: 0.60000\n",
"\tMean k-Fold score: 0.68\n",
"C = 0.0017433288222\n",
"\t[fold 0] C: 0.00174, accuracy: 0.66667\n",
"\t[fold 1] C: 0.00174, accuracy: 0.66667\n",
"\t[fold 2] C: 0.00174, accuracy: 0.86667\n",
"\t[fold 3] C: 0.00174, accuracy: 0.66667\n",
"\t[fold 4] C: 0.00174, accuracy: 0.60000\n",
"\tMean k-Fold score: 0.693333333333\n",
"C = 0.00280721620394\n",
"\t[fold 0] C: 0.00281, accuracy: 0.66667\n",
"\t[fold 1] C: 0.00281, accuracy: 0.66667\n",
"\t[fold 2] C: 0.00281, accuracy: 0.86667\n",
"\t[fold 3] C: 0.00281, accuracy: 0.66667\n",
"\t[fold 4] C: 0.00281, accuracy: 0.60000\n",
"\tMean k-Fold score: 0.693333333333\n",
"C = 0.00452035365636\n",
"\t[fold 0] C: 0.00452, accuracy: 0.66667\n",
"\t[fold 1] C: 0.00452, accuracy: 0.66667\n",
"\t[fold 2] C: 0.00452, accuracy: 0.86667\n",
"\t[fold 3] C: 0.00452, accuracy: 0.66667\n",
"\t[fold 4] C: 0.00452, accuracy: 0.60000\n",
"\tMean k-Fold score: 0.693333333333\n",
"C = 0.00727895384398\n",
"\t[fold 0] C: 0.00728, accuracy: 0.66667\n",
"\t[fold 1] C: 0.00728, accuracy: 0.66667\n",
"\t[fold 2] C: 0.00728, accuracy: 0.86667\n",
"\t[fold 3] C: 0.00728, accuracy: 0.66667\n",
"\t[fold 4] C: 0.00728, accuracy: 0.60000\n",
"\tMean k-Fold score: 0.693333333333\n",
"C = 0.0117210229753\n",
"\t[fold 0] C: 0.01172, accuracy: 0.66667\n",
"\t[fold 1] C: 0.01172, accuracy: 0.60000\n",
"\t[fold 2] C: 0.01172, accuracy: 0.86667\n",
"\t[fold 3] C: 0.01172, accuracy: 0.66667\n",
"\t[fold 4] C: 0.01172, accuracy: 0.60000\n",
"\tMean k-Fold score: 0.68\n",
"C = 0.0188739182214\n",
"\t[fold 0] C: 0.01887, accuracy: 0.66667\n",
"\t[fold 1] C: 0.01887, accuracy: 0.60000\n",
"\t[fold 2] C: 0.01887, accuracy: 0.86667\n",
"\t[fold 3] C: 0.01887, accuracy: 0.66667\n",
"\t[fold 4] C: 0.01887, accuracy: 0.60000\n",
"\tMean k-Fold score: 0.68\n",
"C = 0.0303919538231\n",
"\t[fold 0] C: 0.03039, accuracy: 0.66667\n",
"\t[fold 1] C: 0.03039, accuracy: 0.60000\n",
"\t[fold 2] C: 0.03039, accuracy: 0.86667\n",
"\t[fold 3] C: 0.03039, accuracy: 0.66667\n",
"\t[fold 4] C: 0.03039, accuracy: 0.60000\n",
"\tMean k-Fold score: 0.68\n",
"C = 0.0489390091848\n",
"\t[fold 0] C: 0.04894, accuracy: 0.66667\n",
"\t[fold 1] C: 0.04894, accuracy: 0.60000\n",
"\t[fold 2] C: 0.04894, accuracy: 0.86667\n",
"\t[fold 3] C: 0.04894, accuracy: 0.66667\n",
"\t[fold 4] C: 0.04894, accuracy: 0.60000\n",
"\tMean k-Fold score: 0.68\n",
"C = 0.0788046281567\n",
"\t[fold 0] C: 0.07880, accuracy: 0.66667\n",
"\t[fold 1] C: 0.07880, accuracy: 0.60000\n",
"\t[fold 2] C: 0.07880, accuracy: 0.86667\n",
"\t[fold 3] C: 0.07880, accuracy: 0.66667\n",
"\t[fold 4] C: 0.07880, accuracy: 0.60000\n",
"\tMean k-Fold score: 0.68\n",
"C = 0.126896100317\n",
"\t[fold 0] C: 0.12690, accuracy: 0.66667\n",
"\t[fold 1] C: 0.12690, accuracy: 0.60000\n",
"\t[fold 2] C: 0.12690, accuracy: 0.86667\n",
"\t[fold 3] C: 0.12690, accuracy: 0.66667\n",
"\t[fold 4] C: 0.12690, accuracy: 0.60000\n",
"\tMean k-Fold score: 0.68\n",
"C = 0.204335971786\n",
"\t[fold 0] C: 0.20434, accuracy: 0.66667\n",
"\t[fold 1] C: 0.20434, accuracy: 0.60000\n",
"\t[fold 2] C: 0.20434, accuracy: 0.86667\n",
"\t[fold 3] C: 0.20434, accuracy: 0.66667\n",
"\t[fold 4] C: 0.20434, accuracy: 0.60000\n",
"\tMean k-Fold score: 0.68\n",
"C = 0.329034456231\n",
"\t[fold 0] C: 0.32903, accuracy: 0.66667\n",
"\t[fold 1] C: 0.32903, accuracy: 0.60000\n",
"\t[fold 2] C: 0.32903, accuracy: 0.86667\n",
"\t[fold 3] C: 0.32903, accuracy: 0.66667\n",
"\t[fold 4] C: 0.32903, accuracy: 0.60000\n",
"\tMean k-Fold score: 0.68\n",
"C = 0.529831690628\n",
"\t[fold 0] C: 0.52983, accuracy: 0.66667\n",
"\t[fold 1] C: 0.52983, accuracy: 0.60000\n",
"\t[fold 2] C: 0.52983, accuracy: 0.86667\n",
"\t[fold 3] C: 0.52983, accuracy: 0.66667\n",
"\t[fold 4] C: 0.52983, accuracy: 0.60000\n",
"\tMean k-Fold score: 0.68\n",
"C = 0.853167852417\n",
"\t[fold 0] C: 0.85317, accuracy: 0.66667\n",
"\t[fold 1] C: 0.85317, accuracy: 0.60000\n",
"\t[fold 2] C: 0.85317, accuracy: 0.86667\n",
"\t[fold 3] C: 0.85317, accuracy: 0.66667\n",
"\t[fold 4] C: 0.85317, accuracy: 0.60000\n",
"\tMean k-Fold score: 0.68\n",
"C = 1.37382379588\n",
"\t[fold 0] C: 1.37382, accuracy: 0.66667\n",
"\t[fold 1] C: 1.37382, accuracy: 0.60000\n",
"\t[fold 2] C: 1.37382, accuracy: 0.86667\n",
"\t[fold 3] C: 1.37382, accuracy: 0.66667\n",
"\t[fold 4] C: 1.37382, accuracy: 0.60000\n",
"\tMean k-Fold score: 0.68\n",
"C = 2.21221629107\n",
"\t[fold 0] C: 2.21222, accuracy: 0.66667\n",
"\t[fold 1] C: 2.21222, accuracy: 0.60000\n",
"\t[fold 2] C: 2.21222, accuracy: 0.86667\n",
"\t[fold 3] C: 2.21222, accuracy: 0.66667\n",
"\t[fold 4] C: 2.21222, accuracy: 0.60000\n",
"\tMean k-Fold score: 0.68\n",
"C = 3.56224789026\n",
"\t[fold 0] C: 3.56225, accuracy: 0.66667\n",
"\t[fold 1] C: 3.56225, accuracy: 0.60000\n",
"\t[fold 2] C: 3.56225, accuracy: 0.86667\n",
"\t[fold 3] C: 3.56225, accuracy: 0.66667\n",
"\t[fold 4] C: 3.56225, accuracy: 0.60000\n",
"\tMean k-Fold score: 0.68\n",
"C = 5.73615251045\n",
"\t[fold 0] C: 5.73615, accuracy: 0.66667\n",
"\t[fold 1] C: 5.73615, accuracy: 0.60000\n",
"\t[fold 2] C: 5.73615, accuracy: 0.86667\n",
"\t[fold 3] C: 5.73615, accuracy: 0.66667\n",
"\t[fold 4] C: 5.73615, accuracy: 0.60000\n",
"\tMean k-Fold score: 0.68\n",
"C = 9.23670857187\n",
"\t[fold 0] C: 9.23671, accuracy: 0.66667\n",
"\t[fold 1] C: 9.23671, accuracy: 0.60000\n",
"\t[fold 2] C: 9.23671, accuracy: 0.86667\n",
"\t[fold 3] C: 9.23671, accuracy: 0.66667\n",
"\t[fold 4] C: 9.23671, accuracy: 0.60000\n",
"\tMean k-Fold score: 0.68\n",
"C = 14.8735210729\n",
"\t[fold 0] C: 14.87352, accuracy: 0.66667\n",
"\t[fold 1] C: 14.87352, accuracy: 0.60000\n",
"\t[fold 2] C: 14.87352, accuracy: 0.86667\n",
"\t[fold 3] C: 14.87352, accuracy: 0.66667\n",
"\t[fold 4] C: 14.87352, accuracy: 0.60000\n",
"\tMean k-Fold score: 0.68\n",
"C = 23.9502661999\n",
"\t[fold 0] C: 23.95027, accuracy: 0.66667\n",
"\t[fold 1] C: 23.95027, accuracy: 0.60000\n",
"\t[fold 2] C: 23.95027, accuracy: 0.86667\n",
"\t[fold 3] C: 23.95027, accuracy: 0.66667\n",
"\t[fold 4] C: 23.95027, accuracy: 0.60000\n",
"\tMean k-Fold score: 0.68\n",
"C = 38.5662042116\n",
"\t[fold 0] C: 38.56620, accuracy: 0.66667\n",
"\t[fold 1] C: 38.56620, accuracy: 0.60000\n",
"\t[fold 2] C: 38.56620, accuracy: 0.86667\n",
"\t[fold 3] C: 38.56620, accuracy: 0.66667\n",
"\t[fold 4] C: 38.56620, accuracy: 0.60000\n",
"\tMean k-Fold score: 0.68\n",
"C = 62.1016941892\n",
"\t[fold 0] C: 62.10169, accuracy: 0.66667\n",
"\t[fold 1] C: 62.10169, accuracy: 0.60000\n",
"\t[fold 2] C: 62.10169, accuracy: 0.86667\n",
"\t[fold 3] C: 62.10169, accuracy: 0.66667\n",
"\t[fold 4] C: 62.10169, accuracy: 0.60000\n",
"\tMean k-Fold score: 0.68\n",
"C = 100.0\n",
"\t[fold 0] C: 100.00000, accuracy: 0.66667\n",
"\t[fold 1] C: 100.00000, accuracy: 0.60000\n",
"\t[fold 2] C: 100.00000, accuracy: 0.86667\n",
"\t[fold 3] C: 100.00000, accuracy: 0.66667\n",
"\t[fold 4] C: 100.00000, accuracy: 0.60000\n",
"\tMean k-Fold score: 0.68\n"
]
}
],
"source": [
"from sklearn.model_selection import KFold\n",
"from sklearn import svm\n",
"\n",
"n_folds = 5\n",
"k_fold = KFold(n_folds)\n",
"\n",
"c_scores = []\n",
"for C in Cs:\n",
" fold_scores = []\n",
" print(\"C = \" + str(C))\n",
" for k, (train, val) in enumerate(k_fold.split(X_train, y_train)):\n",
" clf = svm.LinearSVC(C=C)\n",
" clf.fit(X_train[train], y_train[train])\n",
" \n",
" ypred = clf.predict(X_train[val])\n",
" yval = y_train[val]\n",
" accuracy = np.sum(ypred==yval)/len(ypred)\n",
" fold_scores.append(accuracy)\n",
" \n",
" print(\"\\t[fold {0}] C: {1:.5f}, accuracy: {2:.5f}\".\n",
" format(k, C, accuracy))\n",
" \n",
" c_score = np.mean(fold_scores)\n",
" c_scores.append(c_score)\n",
" print(\"\\tMean k-Fold score: \" + str(c_score))"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Best C: 0.0017433288222 with score: 0.693333333333\n"
]
}
],
"source": [
"best_score_idx = np.argmax(c_scores)\n",
"best_c = Cs[best_score_idx]\n",
"print(\"Best C: \" + str(best_c) + \" with score: \" + str(c_scores[best_score_idx]))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Fit Final Models"
]
},
{
"cell_type": "code",
"execution_count": 35,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"RandomForestClassifier(bootstrap=True, class_weight=None, criterion='gini',\n",
" max_depth=None, max_features='auto', max_leaf_nodes=None,\n",
" min_impurity_decrease=0.0, min_impurity_split=None,\n",
" min_samples_leaf=1, min_samples_split=2,\n",
" min_weight_fraction_leaf=0.0, n_estimators=10, n_jobs=1,\n",
" oob_score=False, random_state=None, verbose=0,\n",
" warm_start=False)"
]
},
"execution_count": 35,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"clf_svm = svm.LinearSVC(C=best_c)\n",
"clf_rf = RandomForestClassifier(n_estimators=100)\n",
"clf_svm.fit(X_train, y_train)\n",
"clf_rf.fit(X_train, y_train)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# ROC curve"
]
},
{
"cell_type": "code",
"execution_count": 62,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x11b14bda0>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"from sklearn.metrics import roc_curve\n",
"plt.figure(figsize=(10,10))\n",
"\n",
"# SVM\n",
"y_score = clf_svm.decision_function(X_test)\n",
"fpr, tpr, thresholds = roc_curve(y_test, y_score, pos_label=1)\n",
"auc = np.trapz(tpr, fpr)\n",
"plt.plot(fpr, tpr, label=\"SVM AUC=\" + str(auc), lw=3, color='C0')\n",
"\n",
"# Other SVMs\n",
"for C in Cs:\n",
" if C == best_c:\n",
" continue\n",
" clf_svm = svm.LinearSVC(C=C)\n",
" clf_svm.fit(X_train, y_train)\n",
" y_score = clf_svm.decision_function(X_test)\n",
" fpr, tpr, thresholds = roc_curve(y_test, y_score, pos_label=1)\n",
" auc = np.trapz(tpr, fpr)\n",
" plt.plot(fpr, tpr, linestyle='--', alpha=0.5, color='C0')\n",
"\n",
"# Random Forest\n",
"y_score = clf_rf.predict_proba(X_test)[:,1]\n",
"fpr, tpr, thresholds = roc_curve(y_test, y_score, pos_label=1)\n",
"auc = np.trapz(tpr, fpr)\n",
"plt.plot(fpr, tpr, label=\"RF AUC=\" + str(auc), lw=3, color='C1')\n",
"\n",
"# Other RFs\n",
"for ntrees in [1, 10, 200, 500, 1000]:\n",
" clf_rf = RandomForestClassifier(n_estimators=ntrees)\n",
" clf_rf.fit(X_train, y_train)\n",
" y_score = clf_rf.predict_proba(X_test)[:,1]\n",
" fpr, tpr, thresholds = roc_curve(y_test, y_score, pos_label=1)\n",
" auc = np.trapz(tpr, fpr)\n",
" plt.plot(fpr, tpr, linestyle='--', alpha=0.5, color='C1')\n",
"\n",
"plt.xlabel(\"FPR\")\n",
"plt.ylabel(\"TPR\")\n",
"plt.grid()\n",
"plt.legend()\n",
"plt.show() "
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python [conda env:py3.6]",
"language": "python",
"name": "conda-env-py3.6-py"
},
"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.3"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.