Skip to content

Instantly share code, notes, and snippets.

@soumikghosal
Last active February 13, 2017 08:44
Show Gist options
  • Save soumikghosal/40ad9b385b58253b15b4969290f80065 to your computer and use it in GitHub Desktop.
Save soumikghosal/40ad9b385b58253b15b4969290f80065 to your computer and use it in GitHub Desktop.
Scikit Learn: CV, GridSearchCV, RandomizedSearchCV (kNN, Logistic Regression)
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"from sklearn.datasets import load_iris"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"iris = load_iris()"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"sklearn.datasets.base.Bunch"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"type(iris)"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"array([[ 5.1, 3.5, 1.4, 0.2],\n",
" [ 4.9, 3. , 1.4, 0.2],\n",
" [ 4.7, 3.2, 1.3, 0.2],\n",
" [ 4.6, 3.1, 1.5, 0.2],\n",
" [ 5. , 3.6, 1.4, 0.2],\n",
" [ 5.4, 3.9, 1.7, 0.4],\n",
" [ 4.6, 3.4, 1.4, 0.3],\n",
" [ 5. , 3.4, 1.5, 0.2],\n",
" [ 4.4, 2.9, 1.4, 0.2],\n",
" [ 4.9, 3.1, 1.5, 0.1],\n",
" [ 5.4, 3.7, 1.5, 0.2],\n",
" [ 4.8, 3.4, 1.6, 0.2],\n",
" [ 4.8, 3. , 1.4, 0.1],\n",
" [ 4.3, 3. , 1.1, 0.1],\n",
" [ 5.8, 4. , 1.2, 0.2],\n",
" [ 5.7, 4.4, 1.5, 0.4],\n",
" [ 5.4, 3.9, 1.3, 0.4],\n",
" [ 5.1, 3.5, 1.4, 0.3],\n",
" [ 5.7, 3.8, 1.7, 0.3],\n",
" [ 5.1, 3.8, 1.5, 0.3],\n",
" [ 5.4, 3.4, 1.7, 0.2],\n",
" [ 5.1, 3.7, 1.5, 0.4],\n",
" [ 4.6, 3.6, 1. , 0.2],\n",
" [ 5.1, 3.3, 1.7, 0.5],\n",
" [ 4.8, 3.4, 1.9, 0.2],\n",
" [ 5. , 3. , 1.6, 0.2],\n",
" [ 5. , 3.4, 1.6, 0.4],\n",
" [ 5.2, 3.5, 1.5, 0.2],\n",
" [ 5.2, 3.4, 1.4, 0.2],\n",
" [ 4.7, 3.2, 1.6, 0.2],\n",
" [ 4.8, 3.1, 1.6, 0.2],\n",
" [ 5.4, 3.4, 1.5, 0.4],\n",
" [ 5.2, 4.1, 1.5, 0.1],\n",
" [ 5.5, 4.2, 1.4, 0.2],\n",
" [ 4.9, 3.1, 1.5, 0.1],\n",
" [ 5. , 3.2, 1.2, 0.2],\n",
" [ 5.5, 3.5, 1.3, 0.2],\n",
" [ 4.9, 3.1, 1.5, 0.1],\n",
" [ 4.4, 3. , 1.3, 0.2],\n",
" [ 5.1, 3.4, 1.5, 0.2],\n",
" [ 5. , 3.5, 1.3, 0.3],\n",
" [ 4.5, 2.3, 1.3, 0.3],\n",
" [ 4.4, 3.2, 1.3, 0.2],\n",
" [ 5. , 3.5, 1.6, 0.6],\n",
" [ 5.1, 3.8, 1.9, 0.4],\n",
" [ 4.8, 3. , 1.4, 0.3],\n",
" [ 5.1, 3.8, 1.6, 0.2],\n",
" [ 4.6, 3.2, 1.4, 0.2],\n",
" [ 5.3, 3.7, 1.5, 0.2],\n",
" [ 5. , 3.3, 1.4, 0.2],\n",
" [ 7. , 3.2, 4.7, 1.4],\n",
" [ 6.4, 3.2, 4.5, 1.5],\n",
" [ 6.9, 3.1, 4.9, 1.5],\n",
" [ 5.5, 2.3, 4. , 1.3],\n",
" [ 6.5, 2.8, 4.6, 1.5],\n",
" [ 5.7, 2.8, 4.5, 1.3],\n",
" [ 6.3, 3.3, 4.7, 1.6],\n",
" [ 4.9, 2.4, 3.3, 1. ],\n",
" [ 6.6, 2.9, 4.6, 1.3],\n",
" [ 5.2, 2.7, 3.9, 1.4],\n",
" [ 5. , 2. , 3.5, 1. ],\n",
" [ 5.9, 3. , 4.2, 1.5],\n",
" [ 6. , 2.2, 4. , 1. ],\n",
" [ 6.1, 2.9, 4.7, 1.4],\n",
" [ 5.6, 2.9, 3.6, 1.3],\n",
" [ 6.7, 3.1, 4.4, 1.4],\n",
" [ 5.6, 3. , 4.5, 1.5],\n",
" [ 5.8, 2.7, 4.1, 1. ],\n",
" [ 6.2, 2.2, 4.5, 1.5],\n",
" [ 5.6, 2.5, 3.9, 1.1],\n",
" [ 5.9, 3.2, 4.8, 1.8],\n",
" [ 6.1, 2.8, 4. , 1.3],\n",
" [ 6.3, 2.5, 4.9, 1.5],\n",
" [ 6.1, 2.8, 4.7, 1.2],\n",
" [ 6.4, 2.9, 4.3, 1.3],\n",
" [ 6.6, 3. , 4.4, 1.4],\n",
" [ 6.8, 2.8, 4.8, 1.4],\n",
" [ 6.7, 3. , 5. , 1.7],\n",
" [ 6. , 2.9, 4.5, 1.5],\n",
" [ 5.7, 2.6, 3.5, 1. ],\n",
" [ 5.5, 2.4, 3.8, 1.1],\n",
" [ 5.5, 2.4, 3.7, 1. ],\n",
" [ 5.8, 2.7, 3.9, 1.2],\n",
" [ 6. , 2.7, 5.1, 1.6],\n",
" [ 5.4, 3. , 4.5, 1.5],\n",
" [ 6. , 3.4, 4.5, 1.6],\n",
" [ 6.7, 3.1, 4.7, 1.5],\n",
" [ 6.3, 2.3, 4.4, 1.3],\n",
" [ 5.6, 3. , 4.1, 1.3],\n",
" [ 5.5, 2.5, 4. , 1.3],\n",
" [ 5.5, 2.6, 4.4, 1.2],\n",
" [ 6.1, 3. , 4.6, 1.4],\n",
" [ 5.8, 2.6, 4. , 1.2],\n",
" [ 5. , 2.3, 3.3, 1. ],\n",
" [ 5.6, 2.7, 4.2, 1.3],\n",
" [ 5.7, 3. , 4.2, 1.2],\n",
" [ 5.7, 2.9, 4.2, 1.3],\n",
" [ 6.2, 2.9, 4.3, 1.3],\n",
" [ 5.1, 2.5, 3. , 1.1],\n",
" [ 5.7, 2.8, 4.1, 1.3],\n",
" [ 6.3, 3.3, 6. , 2.5],\n",
" [ 5.8, 2.7, 5.1, 1.9],\n",
" [ 7.1, 3. , 5.9, 2.1],\n",
" [ 6.3, 2.9, 5.6, 1.8],\n",
" [ 6.5, 3. , 5.8, 2.2],\n",
" [ 7.6, 3. , 6.6, 2.1],\n",
" [ 4.9, 2.5, 4.5, 1.7],\n",
" [ 7.3, 2.9, 6.3, 1.8],\n",
" [ 6.7, 2.5, 5.8, 1.8],\n",
" [ 7.2, 3.6, 6.1, 2.5],\n",
" [ 6.5, 3.2, 5.1, 2. ],\n",
" [ 6.4, 2.7, 5.3, 1.9],\n",
" [ 6.8, 3. , 5.5, 2.1],\n",
" [ 5.7, 2.5, 5. , 2. ],\n",
" [ 5.8, 2.8, 5.1, 2.4],\n",
" [ 6.4, 3.2, 5.3, 2.3],\n",
" [ 6.5, 3. , 5.5, 1.8],\n",
" [ 7.7, 3.8, 6.7, 2.2],\n",
" [ 7.7, 2.6, 6.9, 2.3],\n",
" [ 6. , 2.2, 5. , 1.5],\n",
" [ 6.9, 3.2, 5.7, 2.3],\n",
" [ 5.6, 2.8, 4.9, 2. ],\n",
" [ 7.7, 2.8, 6.7, 2. ],\n",
" [ 6.3, 2.7, 4.9, 1.8],\n",
" [ 6.7, 3.3, 5.7, 2.1],\n",
" [ 7.2, 3.2, 6. , 1.8],\n",
" [ 6.2, 2.8, 4.8, 1.8],\n",
" [ 6.1, 3. , 4.9, 1.8],\n",
" [ 6.4, 2.8, 5.6, 2.1],\n",
" [ 7.2, 3. , 5.8, 1.6],\n",
" [ 7.4, 2.8, 6.1, 1.9],\n",
" [ 7.9, 3.8, 6.4, 2. ],\n",
" [ 6.4, 2.8, 5.6, 2.2],\n",
" [ 6.3, 2.8, 5.1, 1.5],\n",
" [ 6.1, 2.6, 5.6, 1.4],\n",
" [ 7.7, 3. , 6.1, 2.3],\n",
" [ 6.3, 3.4, 5.6, 2.4],\n",
" [ 6.4, 3.1, 5.5, 1.8],\n",
" [ 6. , 3. , 4.8, 1.8],\n",
" [ 6.9, 3.1, 5.4, 2.1],\n",
" [ 6.7, 3.1, 5.6, 2.4],\n",
" [ 6.9, 3.1, 5.1, 2.3],\n",
" [ 5.8, 2.7, 5.1, 1.9],\n",
" [ 6.8, 3.2, 5.9, 2.3],\n",
" [ 6.7, 3.3, 5.7, 2.5],\n",
" [ 6.7, 3. , 5.2, 2.3],\n",
" [ 6.3, 2.5, 5. , 1.9],\n",
" [ 6.5, 3. , 5.2, 2. ],\n",
" [ 6.2, 3.4, 5.4, 2.3],\n",
" [ 5.9, 3. , 5.1, 1.8]])"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"#Print Iris data\n",
"iris.data"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"['sepal length (cm)',\n",
" 'sepal width (cm)',\n",
" 'petal length (cm)',\n",
" 'petal width (cm)']"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# names of the features (or print() to print)\n",
"iris.feature_names"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
" 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
" 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n",
" 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n",
" 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n",
" 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n",
" 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2])"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"#Values of target values\n",
"iris.target"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"array(['setosa', 'versicolor', 'virginica'], \n",
" dtype='<U10')"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"#names of the target variable\n",
"iris.target_names"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"numpy.ndarray"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"type(iris.data)\n",
"type(iris.target)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 144,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"#Store feature vector values and target values\n",
"x,y=iris.data,iris.target"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"2 50\n",
"1 50\n",
"0 50\n",
"dtype: int64"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import pandas as pd\n",
"pd.value_counts(y)"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"numpy.ndarray"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"type(x)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"#import the class we will use+\n",
"from sklearn.neighbors import KNeighborsClassifier"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"#make an instance\n",
"knn=KNeighborsClassifier(n_neighbors=1)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',\n",
" metric_params=None, n_jobs=1, n_neighbors=1, p=2,\n",
" weights='uniform')"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"#Fit the model\n",
"knn.fit(x,y)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"array([2, 1])"
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"#Prediction\n",
"x_new=[[3,5,4,2],[5,4,3,2]]\n",
"knn.predict(x_new)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"array([1, 1])"
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# For different k values\n",
"knn=KNeighborsClassifier(n_neighbors=5)\n",
"knn.fit(x,y)\n",
"knn.predict(x_new)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"array([2, 0])"
]
},
"execution_count": 18,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"#Using Logistic Regression\n",
"\n",
"from sklearn.linear_model import LogisticRegression\n",
"logreg=LogisticRegression()\n",
"logreg.fit(x,y)\n",
"logreg.predict(x_new)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"#Agenda\n",
"#1. Choose which model to use\n",
"#2. Choose the best tunning parameters for that model\n",
"#3. Estimating the likely performance of the model on out of sample data"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"#1. CHOOSING THE BEST MODEL"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"#Train and Test on the dataset (OVERFITTING)"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
" 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
" 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1,\n",
" 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 1,\n",
" 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n",
" 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2,\n",
" 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2])"
]
},
"execution_count": 22,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"#Using Logistic Regression\n",
"\n",
"from sklearn.linear_model import LogisticRegression\n",
"logreg=LogisticRegression()\n",
"logreg.fit(x,y)\n",
"logreg.predict(x)"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"150"
]
},
"execution_count": 23,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"y_pred=logreg.predict(x)\n",
"len(y_pred)"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"0.96\n"
]
}
],
"source": [
"#Calculate the accuracy\n",
"\n",
"from sklearn import metrics\n",
"print(metrics.accuracy_score(y,y_pred))"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"0.966666666667\n"
]
}
],
"source": [
"# KNN (k=5)\n",
"\n",
"knn=KNeighborsClassifier(n_neighbors=5)\n",
"knn.fit(x,y)\n",
"y_pred=knn.predict(x)\n",
"print(metrics.accuracy_score(y,y_pred))"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"1.0\n"
]
}
],
"source": [
"# KNN (k=1)\n",
"\n",
"knn=KNeighborsClassifier(n_neighbors=1)\n",
"knn.fit(x,y)\n",
"y_pred=knn.predict(x)\n",
"print(metrics.accuracy_score(y,y_pred))"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"#Train/Test Split "
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"from sklearn.cross_validation import train_test_split\n",
"x_train, x_test, y_train, y_test= train_test_split(x, y, test_size=0.4)"
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"0.95\n"
]
}
],
"source": [
"#Logistic regression\n",
"\n",
"logreg = LogisticRegression()\n",
"logreg.fit(x_train, y_train)\n",
"y_pred = logreg.predict(x_test)\n",
"print(metrics.accuracy_score(y_test, y_pred))"
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"0.95\n"
]
}
],
"source": [
"# KNN (k=5)\n",
"\n",
"knn=KNeighborsClassifier(n_neighbors=5)\n",
"knn.fit(x_train, y_train)\n",
"y_pred=knn.predict(x_test)\n",
"print(metrics.accuracy_score(y_test, y_pred))"
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"0.916666666667\n"
]
}
],
"source": [
"# KNN (k=1)\n",
"\n",
"knn=KNeighborsClassifier(n_neighbors=1)\n",
"knn.fit(x_train, y_train)\n",
"y_pred=knn.predict(x_test)\n",
"print(metrics.accuracy_score(y_test, y_pred))"
]
},
{
"cell_type": "code",
"execution_count": 32,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"#Finding a best value of k for better accuracy\n",
"\n",
"k_range=range(1,26)\n",
"scores=[]\n",
"\n",
"for k in k_range:\n",
" knn=KNeighborsClassifier(n_neighbors=k)\n",
" knn.fit(x_train, y_train)\n",
" y_pred=knn.predict(x_test)\n",
" scores.append(metrics.accuracy_score(y_test, y_pred))"
]
},
{
"cell_type": "code",
"execution_count": 33,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x816dd30>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import matplotlib.pyplot as plt\n",
"\n",
"plt.plot(k_range, scores)\n",
"plt.xlabel('k value')\n",
"plt.ylabel('Accuracy')\n",
"\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 34,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"0.96666666666666667"
]
},
"execution_count": 34,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import numpy as np\n",
"np.max(scores)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 35,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"LinearRegression(copy_X=True, fit_intercept=True, n_jobs=1, normalize=False)"
]
},
"execution_count": 35,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Linear Regression (Just for practice: Since output var is not continous, lm shouldnt be used. Instead logistic reg )\n",
"\n",
"from sklearn.linear_model import LinearRegression\n",
"x_train, x_test, y_train, y_test= train_test_split(x, y, random_state=1) # Default 75% - 25% split\n",
"linreg=LinearRegression()\n",
"linreg.fit(x_train, y_train)"
]
},
{
"cell_type": "code",
"execution_count": 36,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"0.484722279632\n",
"[-0.23186739 0.00626135 0.34404223 0.4789197 ]\n"
]
}
],
"source": [
"print(linreg.intercept_)\n",
"print(linreg.coef_)"
]
},
{
"cell_type": "code",
"execution_count": 37,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"y_pred=linreg.predict(x_test)"
]
},
{
"cell_type": "code",
"execution_count": 38,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"0.19409314875718642"
]
},
"execution_count": 38,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"#MAE\n",
"metrics.mean_absolute_error(y_test, y_pred)"
]
},
{
"cell_type": "code",
"execution_count": 39,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"0.057090139335964983"
]
},
"execution_count": 39,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"#MSE\n",
"metrics.mean_squared_error(y_test, y_pred)"
]
},
{
"cell_type": "code",
"execution_count": 40,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"0.23893542921878494"
]
},
"execution_count": 40,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"#RMSE\n",
"np.sqrt(metrics.mean_squared_error(y_test, y_pred))"
]
},
{
"cell_type": "code",
"execution_count": 41,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"0.97368421052631582"
]
},
"execution_count": 41,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"#Accuracy\n",
"metrics.accuracy_score(y_test, np.around(y_pred))"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 42,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"#Parameter Tuning (using cross_val_score)\n",
"#Use K-fold Cross Validation to find the best Tuning Parameters"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 43,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"from sklearn.cross_validation import cross_val_score"
]
},
{
"cell_type": "code",
"execution_count": 44,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[0.95999999999999996, 0.95333333333333337, 0.96666666666666656, 0.96666666666666656, 0.96666666666666679, 0.96666666666666679, 0.96666666666666679, 0.96666666666666679, 0.97333333333333338, 0.96666666666666679, 0.96666666666666679, 0.97333333333333338, 0.98000000000000009, 0.97333333333333338, 0.97333333333333338, 0.97333333333333338, 0.97333333333333338, 0.98000000000000009, 0.97333333333333338, 0.98000000000000009, 0.96666666666666656, 0.96666666666666656, 0.97333333333333338, 0.95999999999999996, 0.96666666666666656, 0.95999999999999996, 0.96666666666666656, 0.95333333333333337, 0.95333333333333337, 0.95333333333333337]\n"
]
}
],
"source": [
"#Use K-fold Cross Validation on different values of k\n",
"\n",
"k_range=range(1,31)\n",
"k_scores=[]\n",
"for k in k_range:\n",
" knn=KNeighborsClassifier(n_neighbors=k)\n",
" scores=cross_val_score(knn,x,y,cv=10,scoring='accuracy')\n",
" k_scores.append(scores.mean())\n",
"print(k_scores)"
]
},
{
"cell_type": "code",
"execution_count": 45,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "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\ngTEzM7PS+R/7dGHF7gK/yQAAAABJRU5ErkJggg==\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x86a5c10>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import matplotlib.pyplot as plt\n",
"\n",
"plt.plot(k_range, k_scores)\n",
"plt.xlabel('k value')\n",
"plt.ylabel('Cross Validation Accuracy')\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 46,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"# Model Selection: "
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 48,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"0.97333333333333338"
]
},
"execution_count": 48,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# KNN\n",
"k_scores.index(max(k_scores))\n",
"knn=KNeighborsClassifier(n_neighbors = 12)\n",
"cross_val_score(knn, x, y, cv=10, scoring='accuracy').mean()"
]
},
{
"cell_type": "code",
"execution_count": 49,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"0.95333333333333337"
]
},
"execution_count": 49,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"#Logistic Regression\n",
"\n",
"logreg=LogisticRegression()\n",
"scores=cross_val_score(logreg,x,y,cv=10,scoring='accuracy')\n",
"scores.mean()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 120,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"array([-0.01030626, -0.00579236, -0.01316088, -0.05409482, -0.08438419,\n",
" -0.10284038, -0.0352186 , -0.07421254, -0.14858161, -0.058886 ])"
]
},
"execution_count": 120,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"#linear regression (Just for practice: Since output var is not continous, lm shouldnt be used. Instead logistic reg )\n",
"\n",
"lm=LinearRegression()\n",
"scores=cross_val_score(lm,x,y,cv=10,scoring='mean_squared_error')\n",
"scores"
]
},
{
"cell_type": "code",
"execution_count": 51,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"0.058747762208298561"
]
},
"execution_count": 51,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"#Fix the signs\n",
"mse=-scores\n",
"mse.mean()"
]
},
{
"cell_type": "code",
"execution_count": 52,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"0.22243211928539314"
]
},
"execution_count": 52,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"#RMSE \n",
"rmse_score=np.sqrt(mse).mean()\n",
"rmse_score"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 75,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[ 0.33150734 0.08022311 0.03531764]\n"
]
}
],
"source": [
"from sklearn import datasets, linear_model\n",
"from sklearn.cross_validation import cross_val_score\n",
"diabetes = datasets.load_diabetes()\n",
"X = diabetes.data[:150]\n",
"y = diabetes.target[:150]\n",
"lasso = linear_model.Lasso()\n",
"print(cross_val_score(lasso, X, y)) #scoring='r2' default for regression"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 53,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"#CHOOSING THE BEST MODEL PARAMETERS"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 54,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"#PARAMETER TUNING USING GridSearchCV\n",
"#Allows you to define grid of parameters that will be searched using k fold cross validation"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 93,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"from sklearn.grid_search import GridSearchCV"
]
},
{
"cell_type": "code",
"execution_count": 100,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30]\n"
]
}
],
"source": [
"k_range=list(range(1,31))\n",
"print(k_range)"
]
},
{
"cell_type": "code",
"execution_count": 101,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"{'n_neighbors': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30]}\n"
]
}
],
"source": [
"param_grid=dict(n_neighbors=k_range)\n",
"print(param_grid)"
]
},
{
"cell_type": "code",
"execution_count": 124,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"knn=KNeighborsClassifier() #Important to form an instance\n",
"grid = GridSearchCV(knn, param_grid, cv=10, scoring='accuracy')"
]
},
{
"cell_type": "code",
"execution_count": 125,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"GridSearchCV(cv=10, error_score='raise',\n",
" estimator=KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',\n",
" metric_params=None, n_jobs=1, n_neighbors=5, p=2,\n",
" weights='uniform'),\n",
" fit_params={}, iid=True, n_jobs=1,\n",
" param_grid={'n_neighbors': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30]},\n",
" pre_dispatch='2*n_jobs', refit=True, scoring='accuracy', verbose=0)"
]
},
"execution_count": 125,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"grid.fit(x,y)"
]
},
{
"cell_type": "code",
"execution_count": 106,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"[mean: 0.96000, std: 0.05333, params: {'n_neighbors': 1},\n",
" mean: 0.95333, std: 0.05207, params: {'n_neighbors': 2},\n",
" mean: 0.96667, std: 0.04472, params: {'n_neighbors': 3},\n",
" mean: 0.96667, std: 0.04472, params: {'n_neighbors': 4},\n",
" mean: 0.96667, std: 0.04472, params: {'n_neighbors': 5},\n",
" mean: 0.96667, std: 0.04472, params: {'n_neighbors': 6},\n",
" mean: 0.96667, std: 0.04472, params: {'n_neighbors': 7},\n",
" mean: 0.96667, std: 0.04472, params: {'n_neighbors': 8},\n",
" mean: 0.97333, std: 0.03266, params: {'n_neighbors': 9},\n",
" mean: 0.96667, std: 0.04472, params: {'n_neighbors': 10},\n",
" mean: 0.96667, std: 0.04472, params: {'n_neighbors': 11},\n",
" mean: 0.97333, std: 0.03266, params: {'n_neighbors': 12},\n",
" mean: 0.98000, std: 0.03055, params: {'n_neighbors': 13},\n",
" mean: 0.97333, std: 0.04422, params: {'n_neighbors': 14},\n",
" mean: 0.97333, std: 0.03266, params: {'n_neighbors': 15},\n",
" mean: 0.97333, std: 0.03266, params: {'n_neighbors': 16},\n",
" mean: 0.97333, std: 0.03266, params: {'n_neighbors': 17},\n",
" mean: 0.98000, std: 0.03055, params: {'n_neighbors': 18},\n",
" mean: 0.97333, std: 0.03266, params: {'n_neighbors': 19},\n",
" mean: 0.98000, std: 0.03055, params: {'n_neighbors': 20},\n",
" mean: 0.96667, std: 0.03333, params: {'n_neighbors': 21},\n",
" mean: 0.96667, std: 0.03333, params: {'n_neighbors': 22},\n",
" mean: 0.97333, std: 0.03266, params: {'n_neighbors': 23},\n",
" mean: 0.96000, std: 0.04422, params: {'n_neighbors': 24},\n",
" mean: 0.96667, std: 0.03333, params: {'n_neighbors': 25},\n",
" mean: 0.96000, std: 0.04422, params: {'n_neighbors': 26},\n",
" mean: 0.96667, std: 0.04472, params: {'n_neighbors': 27},\n",
" mean: 0.95333, std: 0.04269, params: {'n_neighbors': 28},\n",
" mean: 0.95333, std: 0.04269, params: {'n_neighbors': 29},\n",
" mean: 0.95333, std: 0.04269, params: {'n_neighbors': 30}]"
]
},
"execution_count": 106,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"grid.grid_scores_"
]
},
{
"cell_type": "code",
"execution_count": 126,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"{'n_neighbors': 1}\n",
"[ 1. 0.93333333 1. 0.93333333 0.86666667 1.\n",
" 0.86666667 1. 1. 1. ]\n",
"0.96\n"
]
}
],
"source": [
"print(grid.grid_scores_[0].parameters)\n",
"print(grid.grid_scores_[0].cv_validation_scores)\n",
"print(grid.grid_scores_[0].mean_validation_score)"
]
},
{
"cell_type": "code",
"execution_count": 127,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"grid_mean_scores=[result.mean_validation_score for result in grid.grid_scores_]"
]
},
{
"cell_type": "code",
"execution_count": 133,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "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\nrHT+B0JwpWxge4ECAAAAAElFTkSuQmCC\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x8e68790>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.plot(k_range,grid_mean_scores)\n",
"plt.xlabel('Value of k')\n",
"plt.ylabel('Cross Validation Accuracy')\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 136,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"0.98\n",
"{'n_neighbors': 13}\n",
"KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',\n",
" metric_params=None, n_jobs=1, n_neighbors=13, p=2,\n",
" weights='uniform')\n"
]
}
],
"source": [
"print(grid.best_score_)\n",
"print(grid.best_params_)\n",
"print(grid.best_estimator_)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 137,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"#Searching multiple parameters simultaneously\n",
" #Tuning k value and weights parameter(that controls how the k nearest neighbors are weighted when making the predictions)\n",
" #Default value is 'uniform': Every points in the neighbourhood are weighted equally\n",
" #Another option is 'distance': which wights the closer neighbors than the further ones"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 139,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"#Define the parameter values that should be searched\n",
"k_range=list(range(1,31))\n",
"options=['uniform', 'distance']"
]
},
{
"cell_type": "code",
"execution_count": 146,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"{'n_neighbors': [1,\n",
" 2,\n",
" 3,\n",
" 4,\n",
" 5,\n",
" 6,\n",
" 7,\n",
" 8,\n",
" 9,\n",
" 10,\n",
" 11,\n",
" 12,\n",
" 13,\n",
" 14,\n",
" 15,\n",
" 16,\n",
" 17,\n",
" 18,\n",
" 19,\n",
" 20,\n",
" 21,\n",
" 22,\n",
" 23,\n",
" 24,\n",
" 25,\n",
" 26,\n",
" 27,\n",
" 28,\n",
" 29,\n",
" 30],\n",
" 'weights': ['uniform', 'distance']}"
]
},
"execution_count": 146,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"param_grid = dict(n_neighbors=k_range, weights=options)\n",
"param_grid"
]
},
{
"cell_type": "code",
"execution_count": 147,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"GridSearchCV(cv=10, error_score='raise',\n",
" estimator=KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',\n",
" metric_params=None, n_jobs=1, n_neighbors=5, p=2,\n",
" weights='uniform'),\n",
" fit_params={}, iid=True, n_jobs=1,\n",
" param_grid={'n_neighbors': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30], 'weights': ['uniform', 'distance']},\n",
" pre_dispatch='2*n_jobs', refit=True, scoring='accuracy', verbose=0)"
]
},
"execution_count": 147,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"knn=KNeighborsClassifier()\n",
"grid = GridSearchCV(knn, param_grid, cv=10, scoring='accuracy')\n",
"grid.fit(x,y)"
]
},
{
"cell_type": "code",
"execution_count": 150,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"[mean: 0.96000, std: 0.05333, params: {'n_neighbors': 1, 'weights': 'uniform'},\n",
" mean: 0.96000, std: 0.05333, params: {'n_neighbors': 1, 'weights': 'distance'},\n",
" mean: 0.95333, std: 0.05207, params: {'n_neighbors': 2, 'weights': 'uniform'},\n",
" mean: 0.96000, std: 0.05333, params: {'n_neighbors': 2, 'weights': 'distance'},\n",
" mean: 0.96667, std: 0.04472, params: {'n_neighbors': 3, 'weights': 'uniform'},\n",
" mean: 0.96667, std: 0.04472, params: {'n_neighbors': 3, 'weights': 'distance'},\n",
" mean: 0.96667, std: 0.04472, params: {'n_neighbors': 4, 'weights': 'uniform'},\n",
" mean: 0.96667, std: 0.04472, params: {'n_neighbors': 4, 'weights': 'distance'},\n",
" mean: 0.96667, std: 0.04472, params: {'n_neighbors': 5, 'weights': 'uniform'},\n",
" mean: 0.96667, std: 0.04472, params: {'n_neighbors': 5, 'weights': 'distance'},\n",
" mean: 0.96667, std: 0.04472, params: {'n_neighbors': 6, 'weights': 'uniform'},\n",
" mean: 0.96667, std: 0.04472, params: {'n_neighbors': 6, 'weights': 'distance'},\n",
" mean: 0.96667, std: 0.04472, params: {'n_neighbors': 7, 'weights': 'uniform'},\n",
" mean: 0.96667, std: 0.04472, params: {'n_neighbors': 7, 'weights': 'distance'},\n",
" mean: 0.96667, std: 0.04472, params: {'n_neighbors': 8, 'weights': 'uniform'},\n",
" mean: 0.96667, std: 0.04472, params: {'n_neighbors': 8, 'weights': 'distance'},\n",
" mean: 0.97333, std: 0.03266, params: {'n_neighbors': 9, 'weights': 'uniform'},\n",
" mean: 0.97333, std: 0.03266, params: {'n_neighbors': 9, 'weights': 'distance'},\n",
" mean: 0.96667, std: 0.04472, params: {'n_neighbors': 10, 'weights': 'uniform'},\n",
" mean: 0.97333, std: 0.03266, params: {'n_neighbors': 10, 'weights': 'distance'},\n",
" mean: 0.96667, std: 0.04472, params: {'n_neighbors': 11, 'weights': 'uniform'},\n",
" mean: 0.97333, std: 0.03266, params: {'n_neighbors': 11, 'weights': 'distance'},\n",
" mean: 0.97333, std: 0.03266, params: {'n_neighbors': 12, 'weights': 'uniform'},\n",
" mean: 0.97333, std: 0.04422, params: {'n_neighbors': 12, 'weights': 'distance'},\n",
" mean: 0.98000, std: 0.03055, params: {'n_neighbors': 13, 'weights': 'uniform'},\n",
" mean: 0.97333, std: 0.03266, params: {'n_neighbors': 13, 'weights': 'distance'},\n",
" mean: 0.97333, std: 0.04422, params: {'n_neighbors': 14, 'weights': 'uniform'},\n",
" mean: 0.97333, std: 0.03266, params: {'n_neighbors': 14, 'weights': 'distance'},\n",
" mean: 0.97333, std: 0.03266, params: {'n_neighbors': 15, 'weights': 'uniform'},\n",
" mean: 0.98000, std: 0.03055, params: {'n_neighbors': 15, 'weights': 'distance'},\n",
" mean: 0.97333, std: 0.03266, params: {'n_neighbors': 16, 'weights': 'uniform'},\n",
" mean: 0.97333, std: 0.03266, params: {'n_neighbors': 16, 'weights': 'distance'},\n",
" mean: 0.97333, std: 0.03266, params: {'n_neighbors': 17, 'weights': 'uniform'},\n",
" mean: 0.98000, std: 0.03055, params: {'n_neighbors': 17, 'weights': 'distance'},\n",
" mean: 0.98000, std: 0.03055, params: {'n_neighbors': 18, 'weights': 'uniform'},\n",
" mean: 0.97333, std: 0.03266, params: {'n_neighbors': 18, 'weights': 'distance'},\n",
" mean: 0.97333, std: 0.03266, params: {'n_neighbors': 19, 'weights': 'uniform'},\n",
" mean: 0.98000, std: 0.03055, params: {'n_neighbors': 19, 'weights': 'distance'},\n",
" mean: 0.98000, std: 0.03055, params: {'n_neighbors': 20, 'weights': 'uniform'},\n",
" mean: 0.96667, std: 0.04472, params: {'n_neighbors': 20, 'weights': 'distance'},\n",
" mean: 0.96667, std: 0.03333, params: {'n_neighbors': 21, 'weights': 'uniform'},\n",
" mean: 0.96667, std: 0.04472, params: {'n_neighbors': 21, 'weights': 'distance'},\n",
" mean: 0.96667, std: 0.03333, params: {'n_neighbors': 22, 'weights': 'uniform'},\n",
" mean: 0.96667, std: 0.04472, params: {'n_neighbors': 22, 'weights': 'distance'},\n",
" mean: 0.97333, std: 0.03266, params: {'n_neighbors': 23, 'weights': 'uniform'},\n",
" mean: 0.97333, std: 0.03266, params: {'n_neighbors': 23, 'weights': 'distance'},\n",
" mean: 0.96000, std: 0.04422, params: {'n_neighbors': 24, 'weights': 'uniform'},\n",
" mean: 0.97333, std: 0.03266, params: {'n_neighbors': 24, 'weights': 'distance'},\n",
" mean: 0.96667, std: 0.03333, params: {'n_neighbors': 25, 'weights': 'uniform'},\n",
" mean: 0.97333, std: 0.03266, params: {'n_neighbors': 25, 'weights': 'distance'},\n",
" mean: 0.96000, std: 0.04422, params: {'n_neighbors': 26, 'weights': 'uniform'},\n",
" mean: 0.96667, std: 0.04472, params: {'n_neighbors': 26, 'weights': 'distance'},\n",
" mean: 0.96667, std: 0.04472, params: {'n_neighbors': 27, 'weights': 'uniform'},\n",
" mean: 0.98000, std: 0.03055, params: {'n_neighbors': 27, 'weights': 'distance'},\n",
" mean: 0.95333, std: 0.04269, params: {'n_neighbors': 28, 'weights': 'uniform'},\n",
" mean: 0.97333, std: 0.03266, params: {'n_neighbors': 28, 'weights': 'distance'},\n",
" mean: 0.95333, std: 0.04269, params: {'n_neighbors': 29, 'weights': 'uniform'},\n",
" mean: 0.97333, std: 0.03266, params: {'n_neighbors': 29, 'weights': 'distance'},\n",
" mean: 0.95333, std: 0.04269, params: {'n_neighbors': 30, 'weights': 'uniform'},\n",
" mean: 0.96667, std: 0.03333, params: {'n_neighbors': 30, 'weights': 'distance'}]"
]
},
"execution_count": 150,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"grid.grid_scores_"
]
},
{
"cell_type": "code",
"execution_count": 159,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"{'n_neighbors': 1, 'weights': 'uniform'}\n",
"[ 1. 0.93333333 1. 0.93333333 0.86666667 1.\n",
" 0.86666667 1. 1. 1. ]\n",
"0.96\n"
]
}
],
"source": [
"print(grid.grid_scores_[0].parameters)\n",
"print(grid.grid_scores_[0].cv_validation_scores)\n",
"print(grid.grid_scores_[0].mean_validation_score)"
]
},
{
"cell_type": "code",
"execution_count": 164,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"0.98\n",
"{'n_neighbors': 13, 'weights': 'uniform'}\n"
]
}
],
"source": [
"print(grid.best_score_)\n",
"print(grid.best_params_)"
]
},
{
"cell_type": "code",
"execution_count": 172,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"[{'n_neighbors': 13, 'weights': 'uniform'},\n",
" {'n_neighbors': 15, 'weights': 'distance'},\n",
" {'n_neighbors': 17, 'weights': 'distance'},\n",
" {'n_neighbors': 18, 'weights': 'uniform'},\n",
" {'n_neighbors': 19, 'weights': 'distance'},\n",
" {'n_neighbors': 20, 'weights': 'uniform'},\n",
" {'n_neighbors': 27, 'weights': 'distance'}]"
]
},
"execution_count": 172,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"#Program to find every set of parameters for which the accuracy is max\n",
"\n",
"d=[]\n",
"for i in range(len(k_range)*len(options)):\n",
" if(grid.grid_scores_[i].mean_validation_score==grid.best_score_):\n",
" d.append(grid.grid_scores_[i].parameters)\n",
"d"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"#USING BEST PARAMETERS TO MAKE PREDICTIONS"
]
},
{
"cell_type": "code",
"execution_count": 174,
"metadata": {
"collapsed": false
},
"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"
]
},
{
"data": {
"text/plain": [
"array([1])"
]
},
"execution_count": 174,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"#Train the model with the best known parameters\n",
"knn=KNeighborsClassifier(n_neighbors=13, weights='uniform')\n",
"knn.fit(x, y)\n",
"\n",
"#Predictions\n",
"knn.predict([3, 5, 4, 2])"
]
},
{
"cell_type": "code",
"execution_count": 175,
"metadata": {
"collapsed": false
},
"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"
]
},
{
"data": {
"text/plain": [
"array([1])"
]
},
"execution_count": 175,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"#Shortcut: GridSeachCV automatically refits the best model of all time\n",
"grid.predict([3,5,4,2])"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 176,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"#REDUCING COMPUTATIONAL EXPENSE USING RandomizedSearchCV"
]
},
{
"cell_type": "code",
"execution_count": 178,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"from sklearn.grid_search import RandomizedSearchCV"
]
},
{
"cell_type": "code",
"execution_count": 179,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"#specify \"parameter distribution\" rather than \"parameter grid\"\n",
"param_dist = dict(n_neighbors=k_range, weights=options)"
]
},
{
"cell_type": "code",
"execution_count": 183,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"[mean: 0.97333, std: 0.03266, params: {'n_neighbors': 15, 'weights': 'uniform'},\n",
" mean: 0.97333, std: 0.03266, params: {'n_neighbors': 9, 'weights': 'uniform'},\n",
" mean: 0.97333, std: 0.03266, params: {'n_neighbors': 10, 'weights': 'distance'},\n",
" mean: 0.97333, std: 0.03266, params: {'n_neighbors': 29, 'weights': 'distance'},\n",
" mean: 0.96667, std: 0.04472, params: {'n_neighbors': 22, 'weights': 'distance'},\n",
" mean: 0.97333, std: 0.03266, params: {'n_neighbors': 11, 'weights': 'distance'},\n",
" mean: 0.96667, std: 0.04472, params: {'n_neighbors': 4, 'weights': 'uniform'},\n",
" mean: 0.97333, std: 0.03266, params: {'n_neighbors': 25, 'weights': 'distance'},\n",
" mean: 0.96667, std: 0.04472, params: {'n_neighbors': 3, 'weights': 'uniform'},\n",
" mean: 0.96667, std: 0.03333, params: {'n_neighbors': 21, 'weights': 'uniform'}]"
]
},
"execution_count": 183,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"#n_iter: Number of random combinations it would try\n",
"#random_state: Reproducibility/ Set seed\n",
"\n",
"knn=KNeighborsClassifier()\n",
"rand = RandomizedSearchCV(knn, param_grid, cv=10, scoring='accuracy', n_iter=10, random_state=5)\n",
"rand.fit(x, y)\n",
"rand.grid_scores_"
]
},
{
"cell_type": "code",
"execution_count": 185,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"0.973333333333\n",
"{'n_neighbors': 15, 'weights': 'uniform'}\n"
]
}
],
"source": [
"print(rand.best_score_)\n",
"print(rand.best_params_)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 200,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[0.97999999999999998, 0.97999999999999998, 0.97999999999999998, 0.97999999999999998, 0.97999999999999998, 0.97999999999999998, 0.97999999999999998, 0.97999999999999998, 0.97999999999999998, 0.97299999999999998, 0.97999999999999998, 0.97999999999999998, 0.97999999999999998, 0.97299999999999998, 0.97999999999999998, 0.97999999999999998, 0.97999999999999998, 0.97999999999999998, 0.97299999999999998, 0.97999999999999998]\n"
]
}
],
"source": [
"#Run RandomizedSearchCV 20 times (n_iter=10) and record the best score\n",
"\n",
"best_scores=[]\n",
"for i in range(20):\n",
" rand = RandomizedSearchCV(knn, param_dist, cv=10, scoring='accuracy', n_iter=10)\n",
" rand.fit(x, y)\n",
" best_scores.append(round(rand.best_score_,3))\n",
"print(best_score)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
}
],
"metadata": {
"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