Skip to content

Instantly share code, notes, and snippets.

@soumikghosal
Created February 13, 2017 08:34
Show Gist options
  • Save soumikghosal/5a663fd99af776af0c43d20b2fa48460 to your computer and use it in GitHub Desktop.
Save soumikghosal/5a663fd99af776af0c43d20b2fa48460 to your computer and use it in GitHub Desktop.
Machine Learning: Evaluation of Classifier
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
" #AGENDA\n",
"#Purpose of model Evaluation and common evaluation process\n",
"#Usage of classification accuracy and its limitations\n",
"#How does confusion matrix describe the performance of a classifier\n",
"#What metrics can be evaluated using confusion matrix\n",
"#Adjust classification performance by changing classification threshold \n",
"#Purpose of ROC curve\n",
"#Area under the curve (AUC) differ from classification accuracy"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"#Model Evaluation Process:\n",
"\n",
"#Training and Testing on the same data\n",
"#Train/Test Split\n",
"# k-fold validation\n",
"\n",
"#Model Evaluation Metrics\n",
" #Regression Problems: MAE, MSE, RMSE\n",
" #Classification Problem: Classification Accuracy"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"import pandas as pd"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"url='https://archive.ics.uci.edu/ml/machine-learning-databases/pima-indians-diabetes/pima-indians-diabetes.data'\n",
"col_names=['pregnant','glucose','bp','skin','insulin','bmi','pedigree','age','label']\n",
"pima=pd.read_csv(url, header=None, names=col_names)"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"(768, 9)"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"pima.shape"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>pregnant</th>\n",
" <th>glucose</th>\n",
" <th>bp</th>\n",
" <th>skin</th>\n",
" <th>insulin</th>\n",
" <th>bmi</th>\n",
" <th>pedigree</th>\n",
" <th>age</th>\n",
" <th>label</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>6</td>\n",
" <td>148</td>\n",
" <td>72</td>\n",
" <td>35</td>\n",
" <td>0</td>\n",
" <td>33.6</td>\n",
" <td>0.627</td>\n",
" <td>50</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1</td>\n",
" <td>85</td>\n",
" <td>66</td>\n",
" <td>29</td>\n",
" <td>0</td>\n",
" <td>26.6</td>\n",
" <td>0.351</td>\n",
" <td>31</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>8</td>\n",
" <td>183</td>\n",
" <td>64</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>23.3</td>\n",
" <td>0.672</td>\n",
" <td>32</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>1</td>\n",
" <td>89</td>\n",
" <td>66</td>\n",
" <td>23</td>\n",
" <td>94</td>\n",
" <td>28.1</td>\n",
" <td>0.167</td>\n",
" <td>21</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>0</td>\n",
" <td>137</td>\n",
" <td>40</td>\n",
" <td>35</td>\n",
" <td>168</td>\n",
" <td>43.1</td>\n",
" <td>2.288</td>\n",
" <td>33</td>\n",
" <td>1</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" pregnant glucose bp skin insulin bmi pedigree age label\n",
"0 6 148 72 35 0 33.6 0.627 50 1\n",
"1 1 85 66 29 0 26.6 0.351 31 0\n",
"2 8 183 64 0 0 23.3 0.672 32 1\n",
"3 1 89 66 23 94 28.1 0.167 21 0\n",
"4 0 137 40 35 168 43.1 2.288 33 1"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"pima.head()"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"x=pima.ix[:,:'age']\n",
"y=pima['label']"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"0 1\n",
"1 0\n",
"2 1\n",
"3 0\n",
"4 1\n",
"Name: label, dtype: int64"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"y.head()"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,\n",
" intercept_scaling=1, max_iter=100, multi_class='ovr', n_jobs=1,\n",
" penalty='l2', random_state=None, solver='liblinear', tol=0.0001,\n",
" verbose=0, warm_start=False)"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from sklearn.cross_validation import train_test_split\n",
"from sklearn.linear_model import LogisticRegression\n",
"from sklearn import metrics\n",
"\n",
"x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=0)\n",
"\n",
"logreg=LogisticRegression()\n",
"logreg.fit(x_train,y_train)"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"0.807291666667\n"
]
}
],
"source": [
"y_pred = logreg.predict(x_test)\n",
"print(metrics.accuracy_score(y_test,y_pred))"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"0 130\n",
"1 62\n",
"Name: label, dtype: int64"
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"y_test.value_counts()"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"0.3229166666666667"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# % of ones\n",
"\n",
"y_test.mean()"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"0.6770833333333333"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# % of zeroes\n",
"\n",
"1-y_test.mean()"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"0 0.677083\n",
"1 0.322917\n",
"Name: label, dtype: float64"
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"y_test.value_counts()/len(y_test)"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"True: [1 0 0 1 0 0 1 1 0 0 1 1 0 0 0 0 1 0 0 0 1 1 0 0 0]\n",
"Pred: [1 0 0 1 0 0 1 1 0 0 1 1 0 0 0 0 1 0 0 0 1 0 0 0 0]\n"
]
}
],
"source": [
"#print first 25 true and predicted values\n",
"\n",
"print('True:', y_test.values[0:25])\n",
"print('Pred:', y_pred[0:25])"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"#Conclusion:\n",
" #Classification Accuracy is the easiest classification metrics to understand\n",
" #Doesn't tell the underlying distribution of response values\n",
" #Doesn't tell what \"type of errors\" your classifier is making"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
" #CONFUSION MATRIX"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"#Describes the performance of classification model"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[[119 11]\n",
" [ 26 36]]\n"
]
}
],
"source": [
"print(metrics.confusion_matrix(y_test, y_pred))"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"#Basic Terminology\n",
" #True Positive\n",
" #True Negative\n",
" #False Positive\n",
" #False Negative"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"#Save Confusion Matrix \n",
"\n",
"confusion=metrics.confusion_matrix(y_test, y_pred)\n",
"TP=confusion[1,1]\n",
"FP=confusion[0,1]\n",
"TN=confusion[0,0]\n",
"FN=confusion[1,0]"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"0.807291666667\n",
"0.807291666667\n"
]
}
],
"source": [
"#Classification Accuracy: How often the classifier is correct\n",
"\n",
"print((TP+TN)/(TP+TN+FP+FN))\n",
"print(metrics.accuracy_score(y_test,y_pred))"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"0.192708333333\n",
"0.192708333333\n"
]
}
],
"source": [
"#Classification Error: How often the classifier is incorrect\n",
" # Also known as Misclassification Error\n",
" \n",
"print((FP+FN)/(TP+TN+FP+FN))\n",
"print(1 - metrics.accuracy_score(y_test,y_pred))"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"0.58064516129\n",
"0.58064516129\n"
]
}
],
"source": [
"#Sensitivity/ Recall: When the actual value is positive, how often the prediction is correct\n",
" # Also know as \"Recall\" or \"True Positive Rate\"\n",
"print(TP/float(TP+FN))\n",
"print(metrics.recall_score(y_test,y_pred))"
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"0.915384615385\n"
]
}
],
"source": [
"#Specificity: When the actual value is negative, how often the prediction is correct\n",
" \n",
"print(TN/(TN+FP))"
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"0.0846153846154\n"
]
}
],
"source": [
"#False Positive Rate: When the true value is negative, how often is the prediction is incorrect\n",
"\n",
"print(FP/(FP+TN))"
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"0.765957446809\n",
"0.765957446809\n"
]
}
],
"source": [
"#Precision: When positve value is predicted, how often is the prediction is correct\n",
" #i.e. when I predict positive how often is it true\n",
" \n",
"print(TP/(TP+FP))\n",
"print(metrics.precision_score(y_test,y_pred))"
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"#Conclusion\n",
" #Confusion Matrix gives a more complete picture of how the performance of the classifier\n",
" #Als o allows to compute various classification metrics and these metrics can guide your model selection"
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"#Spam Classifeir: Spam is Positive. False Negative(Spam goes to Ham) are more acceptable than False Positive(Ham goes to Spam)\n",
" #So using Specifity or Precision\n",
"#Fraud Detection: Fraud is Positive:\n",
" #Normal Transaction flagged as fraud(False Positive) than False Negative (Fraud flagged as Normal)\n",
" #So using Sensitivity"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 32,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
" #Adjusting Classification Threshold"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 33,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"array([1, 0, 0, 1, 0, 0, 1, 1, 0, 0], dtype=int64)"
]
},
"execution_count": 33,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"#Predicting first 10 predicted responses\n",
"logreg.predict(x_test)[:10]"
]
},
{
"cell_type": "code",
"execution_count": 34,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"array([[ 0.10478412, 0.89521588],\n",
" [ 0.7865292 , 0.2134708 ],\n",
" [ 0.85902097, 0.14097903],\n",
" [ 0.39703763, 0.60296237],\n",
" [ 0.82785626, 0.17214374],\n",
" [ 0.92375952, 0.07624048],\n",
" [ 0.31033361, 0.68966639],\n",
" [ 0.25141564, 0.74858436],\n",
" [ 0.55814379, 0.44185621],\n",
" [ 0.62403917, 0.37596083]])"
]
},
"execution_count": 34,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"#Print first 10 predicted probabilities of class members\n",
"logreg.predict_proba(x_test)[:10]"
]
},
{
"cell_type": "code",
"execution_count": 35,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"array([ 0.89521588, 0.2134708 , 0.14097903, 0.60296237, 0.17214374,\n",
" 0.07624048, 0.68966639, 0.74858436, 0.44185621, 0.37596083])"
]
},
"execution_count": 35,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"#first 10 predicted probabilities of class 1\n",
"logreg.predict_proba(x_test)[:10,1]"
]
},
{
"cell_type": "code",
"execution_count": 36,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"#store \n",
"y_pred_prob=logreg.predict_proba(x_test)[:,1]"
]
},
{
"cell_type": "code",
"execution_count": 38,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "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\neJwqGrTly5ezYkX3U9PVJtt89tnms882n11r1qxhv/32g7ueQzUQcyHhWAGcleSdwEnUROLV1Fn9\nxhwNvDvJxdw1q+Ll1Ccf9rIBYPHixSxZsmScKhq0hQsX2t6zzDaffbb57LPNh2agQxKGnnCUUs5J\n8gLqY4gPoT7Z8I2llH/vqHNk8/TQY6nTGp8J7OMcHJIkzQ9DTzgASimnUB+oNFGdwxjMQ4MkSdIs\nmwu3xUqSpBFnwqGBWbZs2bBDuMexzWefbT77bPPRMPSZRtvQPPjthz/84Q8daCRJ0jSsXr2apUuX\nAiwtpawe1H7t4ZAkSa0z4ZAkSa0z4ZAkSa0z4ZAkSa0z4ZAkSa0z4ZAkSa2bEzONauYuu+wy1q1b\nN+wwBmr77bdnp512GnYYkqQBMOEYAZdddhm77baYDRtuHnYoA7XNNgu48MI1Jh2SNAJMOEbAunXr\nmmTjRGDxsMMZkDVs2LAf69atM+GQpBFgwjFSFgPOrCpJmnscNCpJklpnwiFJklpnwiFJklpnwiFJ\nklpnwiFJklpnwiFJklpnwiFJklpnwiFJklpnwiFJklpnwiFJklpnwiFJklpnwiFJklpnwiFJklpn\nwiFJklpnwiFJklpnwiFJklpnwiFJklpnwiFJklpnwiFJklpnwiFJklpnwiFJklpnwiFJklpnwiFJ\nklpnwiFJklpnwiFJklpnwiFJklpnwiFJklpnwiFJklo39IQjyaFJNnW9ftJV5/AkVya5OcnXkzxq\nWPFKkqTpG3rC0TgfWATs2LyeNrYiycHAQcBrgCcDNwGrkmw9hDglSVIfthp2AI07SinXjrPujcAR\npZSvACTZH7gGeD5w0izFJ0mSZmCu9HDsmuSKJJckOTHJwwCS7ELt8fjmWMVSyvXA94A9hhOqJEma\nrrmQcHwXOBDYG3gdsAvwrST3oSYbhdqj0emaZp0kSZoHhn5JpZSyqmPx/CTfB34OvBS4YCb7Xr58\nOQsXLtysbNmyZSxbtmwmu5UkaSSsXLmSlStXbla2fv36Vo419ISjWyllfZKLgEcBZwChDijt7OVY\nBJw72b5WrFjBkiVL2ghTkqR5r9eX8NWrV7N06dKBH2suXFLZTJL7UpONK0spa4GrgWd1rN8W2B04\nezgRSpKk6Rp6D0eSo4AvUy+jPAR4L3A78O9NlaOBdye5GLgUOAK4HDh51oOVJEl9GXrCATwU+Czw\nAOBa4NvAU0opvwIopRyZZAFwLLAdcCawTynltiHFK0mSpmnoCUcpZdIRnKWUw4DDWg9GkiS1Ys6N\n4ZAkSaPHhEOSJLXOhEOSJLXOhEOSJLXOhEOSJLXOhEOSJLXOhEOSJLXOhEOSJLXOhEOSJLXOhEOS\nJLXOhEOSJLXOhEOSJLXOhEOSJLXOhEOSJLXOhEOSJLXOhEOSJLXOhEOSJLXOhEOSJLXOhEOSJLXO\nhEOSJLXOhEOSJLXOhEOSJLXOhEOSJLXOhEOSJLXOhEOSJLXOhEOSJLXOhEOSJLXOhEOSJLXOhEOS\nJLXOhEOSJLXOhEOSJLXOhEOSJLXOhEOSJLXOhEOSJLXOhEOSJLXOhEOSJLXOhEOSJLXOhEOSJLXO\nhEOSJLXOhEOSJLVuziUcSd6RZFOSD3WVH57kyiQ3J/l6kkcNK0ZJkjQ9cyrhSPJ7wGuAH3eVHwwc\n1Kx7MnATsCrJ1rMepCRJmrY5k3AkuS9wIvBq4Dddq98IHFFK+Uop5Xxgf+DBwPNnN0pJktSPOZNw\nAB8FvlxKOa2zMMkuwI7AN8fKSinXA98D9pjVCCVJUl+2GnYAAEleDjwBeFKP1TsCBbimq/yaZp0k\nSZrjhp5wJHkocDTw7FLK7cOOR5IkDd7QEw5gKbADsDpJmrItgacnOQh4NBBgEZv3ciwCzp1ox8uX\nL2fhwoWblS1btoxly5YNKHRJkuavlStXsnLlys3K1q9f38qx5kLC8Q3gd7vKjgfWAB8opfwsydXA\ns4DzAJJsC+xOHfcxrhUrVrBkyZKBByxJ0ijo9SV89erVLF26dODHGnrCUUq5CfhJZ1mSm4BflVLW\nNEVHA+9OcjFwKXAEcDlw8iyGKkmS+jT0hGMcZbOFUo5MsgA4FtgOOBPYp5Ry2zCCkyRJ0zMnE45S\nyh/2KDsMOGzWg5EkSTM2l+bhkCRJI8qEQ5Iktc6EQ5Iktc6EQ5Iktc6EQ5Iktc6EQ5Iktc6EQ5Ik\ntc6EQ5Iktc6EQ5Iktc6EQ5Iktc6EQ5Iktc6EQ5Iktc6EQ5Ikta6vhCPJnyfZZtDBSJKk0dRvD8cK\n4OokxyZ58iADkiRJo6ffhOPBwF8CDwXOSnJ+krck2WFwoUmSpFHRV8JRSrmtlPL5UsqfADsBnwFe\nBVye5AtJ/iRJBhmoJEmav2Y8aLSUchXwDeB0oABPAlYCP02y50z3L0mS5r++E44k2yd5U5IfA2cB\n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\nkiuT3Jzk60keNYxYJUnS9M2JhAO4D/Aj4PVA6V6Z5GDgIOA1wJOBm4BVSbaezSAlSVJ/thp2AACl\nlFOBUwEEm2K3AAASo0lEQVSSpEeVNwJHlFK+0tTZH7gGeD5w0mzFKUmS+jNXejjGlWQXYEfgm2Nl\npZTrge8BewwrLkmSNHVzPuGgJhuF2qPR6ZpmnSRJmuPmxCUVSdLsWLNmzbBDGLjtt9+enXbaadhh\naBLzIeG4GgiwiM17ORYB50604fLly1m4cOGdyxdccAGbNt3YRoySNMddBWzBfvvtN+xABm6bbRZw\n4YVrTDr6sHLlSlauXLlZ2fr161s51pxPOEopa5NcDTwLOA8gybbA7sBHJ9p2xYoVLFmy5M7ld73r\nXRx11Eo2bmwxYEmak34DbAJOBBYPOZZBWsOGDfuxbt06E44+LFu2jGXLlm1Wtnr1apYuXTrwY82J\nhCPJfYBHUXsyAB6R5PHAr0spvwCOBt6d5GLgUuAI4HLg5CGEK0nz2GJgyaS1pEGbEwkH8CTgdOrg\n0AJ8sCk/AfiLUsqRSRYAxwLbAWcC+5RSbhtGsJIkaXrmRMJRSvkfJrljppRyGHDYbMQjSZIGaz7c\nFitJkuY5Ew5JktQ6Ew5JktQ6Ew5JktS6OTFoVJKkmRi1GVRHcfZUEw5J0jw2mjOojuLsqSYckqR5\nbBRnUB3N2VNNOCRJI8AZVOc6B41KkqTWmXBIkqTWmXBIkqTWmXBIkqTWmXBIkqTWmXBIkqTWmXBI\nkqTWmXBIkqTWmXBIkqTWmXBIkqTWmXBIkqTWmXBIkqTWmXBIkqTWmXBIkqTWmXBIkqTWmXBIkqTW\nmXBIkqTWmXBIkqTWmXBIkqTWmXBIkqTWmXBIkqTWmXBIkqTWmXBIkqTWmXBIkqTWmXBIkqTWmXBI\nkqTWmXBIkqTWmXBIkqTWmXBIkqTWmXBIkqTWmXBIkqTWmXBIkqTWmXBIkqTWzauEI8lfJ1mb5JYk\n303ye8OOSZ1WDjuAeyDbfPbZ5rPPNh8F8ybhSPIy4IPAocATgR8Dq5JsP9TA1ME/CrPPNp99tvns\ns81HwbxJOIDlwLGllE+XUi4AXgfcDPzFcMOSJEmTmRcJR5J7AUuBb46VlVIK8A1gj2HFJUmSpmar\nYQcwRdsDWwLXdJVfA+w2nR2VciuwekBhzQVrhx2AJEmTmi8Jx3RtA7BmzZrNCpNwxx1XUjtLRseW\nW27Fxo13AKcAayar3qLLgX8b0L7Oav4d9jkNUhvnNMg279c97Wc1F9q8H/P55zRRm8/n8xpP/SLZ\n/Rk2WzqOu80g95t6ZWJuay6p3Ay8qJTypY7y44GFpZQXdNV/BfPzL4IkSXPFvqWUzw5qZ/Oih6OU\ncnuSHwLPAr4EkCTN8kd6bLIK2Be4FNgwS2FKkjQKtgEeTv0sHZh50cMBkOSlwPHUu1O+T71r5cXA\no0sp1w4xNEmSNIl50cMBUEo5qZlz43BgEfAjYG+TDUmS5r5508MhSZLmr3kxD4ckSZrfTDgkSVLr\n5m3CMd0HuSX5gyQ/TLIhyUVJDpitWEfFdNo8yQuS/HeSXyZZn+TsJHvNZryjoN8HFiZ5apLbk4zS\nLHezoo+/LVsneV+SS5u/Lz9LcuAshTsS+mjzfZP8KMlNSa5MclyS+89WvPNdkj2TfCnJFUk2JXne\nFLaZ8WfovEw4pvsgtyQPB75CnRr98cCHgU8k+aPZiHcU9PHwvKcD/w3sAywBTge+nOTxsxDuSOj3\ngYVJFgInUKf+1zT02eafB54JvBL4f8Ay4MKWQx0Zffw9fyr1/f2vwGOodys+GfiXWQl4NNyHeuPF\n64FJB3IO7DO0lDLvXsB3gQ93LIc6Fd3bx6n/D8B5XWUrgVOGfS7z5TXdNh9nH+cD7x72ucyXV79t\n3ry330v9A7562Ocxn159/G35Y+DXwHbDjn2+vvpo87cAP+0qOwi4bNjnMh9fwCbgeZPUGchn6Lzr\n4ejzQW5P4e7f9lZNUF8dBvHwvGaitt+m/nHWJPpt8ySvBHahJhyahj7b/LnAOcDBSS5PcmGSo5IM\ndEroUdVnm38HeFiSfZp9LAJeAny13Wjv0QbyGTrvEg4mfpDbjuNss+M49bdNcu/BhjeS+mnzbm+j\nduOdNMC4Rtm02zzJrsDfU6cj3tRueCOpn/f5I4A9gd8Bng+8kdrF/9GWYhw1027zUsrZwH7A55Lc\nBlwFXEft5VA7BvIZOh8TDs0zzbNtDgFeUkpZN+x4RlGSLajPDzq0lHLJWPEQQ7qn2ILaJf2KUso5\npZRTgTcDB/hlph1JHkMdQ3AYdXzY3tRevWOHGJamYN7MNNphHbCROttop0XA1eNsc/U49a8v9Xn1\nmlg/bQ5AkpdTB3O9uJRyejvhjaTptvlvA08CnpBk7Nv1FtSrWbcBe5VSzmgp1lHRz/v8KuCKUsqN\nHWVrqMneQ4FLem6lMf20+TuAs0opH2qWz0/yeuDMJO8qpXR/E9fMDeQzdN71cJRSbgfGHuQGbPYg\nt7PH2ew7nfUbezXlmkSfbU6SZcBxwMubb36aoj7a/HrgscATqKPIHw98HLig+f/3Wg553uvzfX4W\n8OAkCzrKdqP2elzeUqgjo882XwDc0VW2iXq3hb167RjMZ+iwR8j2Oar2pdTH1e8PPJralfYrYIdm\n/fuBEzrqPxy4gTrSdjfqrUC3Ac8e9rnMl1cfbf6Kpo1fR82Ex17bDvtc5strum3eY3vvUmm5zanj\nkn4OfA5YTL0d/ELg48M+l/ny6qPNDwBubf627AI8lfpAz7OHfS7z5dW8bx9P/YKyCXhTs/ywcdp8\nIJ+hQz/xGTTY66mPn7+FmmU9qWPdp4DTuuo/nZpJ3wL8FPjzYZ/DfHtNp82p825s7PH65LDPYz69\npvs+79rWhGMW2pw698Yq4MYm+TgSuPewz2M+vfpo878G/rdp88up83I8aNjnMV9ewDOaRKPn3+e2\nPkN9eJskSWrdvBvDIUmS5h8TDkmS1DoTDkmS1DoTDkmS1DoTDkmS1DoTDkmS1DoTDkmS1DoTDkmS\n1DoTDmkSSXZOsinJ45rlZyTZmGTbIcRyepIPTV6zlWOvTfKGGe7jgCTXTVLn0CSrO5Y/leQLHcvD\nbIPfT3Jekts6Y5rCdpu1XfN+et40tj80ybnTjVeaS0w4NC81H0Kbmg/+W5P8NMkhzWPa29A5Je9Z\n1GmUr5/KhrP5Adl8oI+1y8Ykv0jyySQ7zMbxp2iy6Y2P4u4Piur0AuCQsYVBJELT8CFgNbAzcOAM\n9rMj8LVpbjOjaaG7E2dpts3Hx9NLY75G/aO/DbAP8DHqQ52O7K7YJCKl9D+X/51PoSyl3AH8ss/9\nzIb11Od7bEl9INPx1A+45/SqnGSr5pzmhFLKzdSHeY23/jezGE63RwL/XEq5aiY7KaUM4/0TZpi0\nSDNhD4fms1tLKdeWUn5RSvkX4BvAnwEkOTDJdUmem+T/gA3Aw5p1r07ykyS3NP/+VedOkzw5yepm\n/feBJ9Lxh7q5pLKp85JKkqc2PRk3Jfl1kq8lWZjkU9QHJb2xo+dhp2abxyY5JckNSa5O8ukkD+jY\n54Km7IYkVyR58xTbpTTtcnUpZRXwYeCPkty741vuS5OckeRm6pN9SfKiJOcn2dD0GvQ63rZJPpvk\n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\nuc2JkQAAAABJRU5ErkJggg==\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x887d850>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import matplotlib.pyplot as plt\n",
"plt.rcParams['font.size']=10\n",
"\n",
"plt.hist(y_pred_prob,bins=8)\n",
"plt.xlim(0,1)\n",
"\n",
"plt.title('Histogram of Predicted Probability')\n",
"plt.xlabel('Predicted Probability of diabetes')\n",
"plt.ylabel('Frequency')\n",
"\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 39,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"#Currently threshold is 0.5"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 40,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"#Decrease threshold to increase the sensitivity"
]
},
{
"cell_type": "code",
"execution_count": 41,
"metadata": {
"collapsed": false,
"scrolled": true
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"C:\\Program Files\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\validation.py:386: DeprecationWarning: Passing 1d arrays as data is deprecated in 0.17 and willraise ValueError in 0.19. Reshape your data either using X.reshape(-1, 1) if your data has a single feature or X.reshape(1, -1) if it contains a single sample.\n",
" DeprecationWarning)\n"
]
}
],
"source": [
"#Predict diabetes if predicted prob is greater than 0.3\n",
"from sklearn.preprocessing import binarize\n",
"y_pred_class = binarize(y_pred_prob, 0.3)[0]"
]
},
{
"cell_type": "code",
"execution_count": 42,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"array([ 0.89521588, 0.2134708 , 0.14097903, 0.60296237, 0.17214374,\n",
" 0.07624048, 0.68966639, 0.74858436, 0.44185621, 0.37596083])"
]
},
"execution_count": 42,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"y_pred_prob[:10]"
]
},
{
"cell_type": "code",
"execution_count": 43,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"array([ 1., 0., 0., 1., 0., 0., 1., 1., 1., 1., 1., 1., 1.,\n",
" 0., 0., 0., 1., 0., 1., 1., 1., 1., 1., 0., 0., 1.,\n",
" 0., 1., 0., 0., 1., 0., 0., 1., 0., 1., 1., 0., 1.,\n",
" 1., 1., 0., 0., 1., 1., 0., 0., 0., 1., 1., 1., 0.,\n",
" 1., 1., 0., 0., 0., 1., 1., 0., 1., 1., 0., 1., 1.,\n",
" 1., 1., 0., 1., 0., 0., 1., 0., 1., 1., 1., 0., 1.,\n",
" 0., 0., 1., 1., 0., 0., 0., 0., 1., 1., 1., 0., 0.,\n",
" 0., 1., 0., 1., 0., 1., 1., 1., 0., 0., 0., 0., 0.,\n",
" 1., 1., 0., 1., 0., 1., 0., 1., 1., 1., 1., 1., 0.,\n",
" 1., 0., 1., 1., 0., 1., 1., 0., 0., 1., 1., 1., 1.,\n",
" 1., 0., 0., 1., 1., 1., 0., 1., 1., 0., 0., 1., 0.,\n",
" 0., 1., 0., 0., 0., 0., 0., 0., 1., 0., 0., 1., 0.,\n",
" 1., 0., 1., 1., 1., 1., 0., 1., 1., 1., 0., 0., 0.,\n",
" 0., 0., 0., 0., 0., 1., 0., 1., 0., 0., 0., 0., 1.,\n",
" 0., 1., 1., 0., 1., 0., 1., 0., 0., 0.])"
]
},
"execution_count": 43,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"y_pred_class"
]
},
{
"cell_type": "code",
"execution_count": 44,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[[119 11]\n",
" [ 26 36]]\n"
]
}
],
"source": [
"print(confusion)"
]
},
{
"cell_type": "code",
"execution_count": 45,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[[86 44]\n",
" [ 8 54]]\n"
]
}
],
"source": [
"print(metrics.confusion_matrix(y_test,y_pred_class))"
]
},
{
"cell_type": "code",
"execution_count": 46,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"0.8709677419354839\n"
]
}
],
"source": [
"#print sensitivity\n",
"print(54/(54+8))"
]
},
{
"cell_type": "code",
"execution_count": 47,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"0.6615384615384615\n"
]
}
],
"source": [
"#print specificity\n",
"print(86/(86+44))"
]
},
{
"cell_type": "code",
"execution_count": 48,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
" #CONCLUSION\n",
"#Threshold prob is 0.5, by default, to convert predicted probabilities into class predictions\n",
"#Specificity and Sensitivity are inversily related"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 49,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"#ROC and Area Under the Curve(AUC)"
]
},
{
"cell_type": "code",
"execution_count": 205,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"#It would be great if we could see how Specificity and Sensitivity are affected by various thresholds without actually changing \n",
" #thresholds\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 54,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "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\ncp8nVpdC0AAAAABJRU5ErkJggg==\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x887d870>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"#IMPORTANT:first arg is true value, second arg is pred prob\n",
"\n",
"fpr, tpr, thresholds=metrics.roc_curve(y_test, y_pred_prob)\n",
"plt.plot(fpr,tpr)\n",
"plt.xlim([0,1])\n",
"plt.ylim([0,1])\n",
"plt.xlabel(\"False Positive Rate(1 - Specificity)\")\n",
"plt.ylabel(\"True Positive Rate(Sensitivity)\")\n",
"plt.title(\"ROC Curve for diabetes classifier\")\n",
"plt.grid(True)\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 55,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"#ROC Curve can help you to choose a threshold that balances sensitivity and specificity in a way that makes sense for your \n",
"#particular context\n",
"#You can't actually see the thresholds used to generate the curve on the ROC curve itself"
]
},
{
"cell_type": "code",
"execution_count": 58,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"#define a function that returns dpecificity and sensitivity for a threshold\n",
"def evaluate_threshold(threshold):\n",
" print('Sensitivity:', tpr[thresholds > threshold][-1])\n",
" print('Specificity:', 1-fpr[thresholds > threshold][-1])"
]
},
{
"cell_type": "code",
"execution_count": 59,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Sensitivity: 0.58064516129\n",
"Specificity: 0.930769230769\n"
]
}
],
"source": [
"evaluate_threshold(0.5)"
]
},
{
"cell_type": "code",
"execution_count": 60,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Sensitivity: 0.870967741935\n",
"Specificity: 0.676923076923\n"
]
}
],
"source": [
"evaluate_threshold(0.3)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 61,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
" #Area Under Curve(AUC)\n",
"#AUC is the percentage of the ROC plot underneath the curve"
]
},
{
"cell_type": "code",
"execution_count": 62,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"0.864143920596\n"
]
}
],
"source": [
"#IMPORTANT:first arg is true value, second arg is pred prob\n",
"print(metrics.roc_auc_score(y_test, y_pred_prob))"
]
},
{
"cell_type": "code",
"execution_count": 63,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"#AUC is useful as a single number summary of classifier performance\n",
"\n",
"#If you randomly chose one positive and one negative observation,AUC represents the likelihood that your classifier will assign \n",
"#a higher predicted probability to the positive observation\n",
"\n",
"#AUC is useful even when there is high class imbalance (unlike classification accuracy)"
]
},
{
"cell_type": "code",
"execution_count": 65,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"0.8246837606837607"
]
},
"execution_count": 65,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"#calculate cross-validation AUC\n",
"from sklearn.cross_validation import cross_val_score\n",
"logreg=LogisticRegression()\n",
"cross_val_score(logreg, x, y, cv=10, scoring='roc_auc').mean()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 66,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"#CONFUSION MATRIX advantages\n",
"\n",
"#Allows to calculate variety of metrics\n",
"#Useful for multi-class problems"
]
},
{
"cell_type": "code",
"execution_count": 67,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"#ROC/AUC Advantages:\n",
"\n",
"#Doesnt need to set a classification threshold\n",
"#Still useful when there is high class imbalance"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
}
],
"metadata": {
"anaconda-cloud": {},
"kernelspec": {
"display_name": "Python [default]",
"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.5.2"
}
},
"nbformat": 4,
"nbformat_minor": 1
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment