Skip to content

Instantly share code, notes, and snippets.

@akaysh
Created February 12, 2016 10:31
Show Gist options
  • Save akaysh/03d48b4cbf6e636ddeb3 to your computer and use it in GitHub Desktop.
Save akaysh/03d48b4cbf6e636ddeb3 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"import pandas as pd\n",
"import numpy as np\n",
"import sklearn as sk\n",
"from sklearn.cross_validation import train_test_split\n",
"from sklearn.cross_validation import KFold\n",
"import random\n",
"import matplotlib.pyplot as plt\n",
"%matplotlib inline"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"Train = pd.read_csv('/home/student/SPECT.train', header=None)\n",
"Test = pd.read_csv('/home/student/SPECT.test' ,header=None)"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"collapsed": false,
"scrolled": true
},
"outputs": [
{
"data": {
"text/plain": [
"((240, 22),\n",
" array([[1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0],\n",
" [1, 1, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1],\n",
" [0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0],\n",
" [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],\n",
" [1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n",
" [0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0],\n",
" [0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1],\n",
" [1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1],\n",
" [0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1],\n",
" [1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0],\n",
" [0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n",
" [1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1],\n",
" [1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0],\n",
" [1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1],\n",
" [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 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],\n",
" [0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 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],\n",
" [0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1],\n",
" [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, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 1],\n",
" [1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0],\n",
" [0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1],\n",
" [1, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0],\n",
" [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0],\n",
" [0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1],\n",
" [0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0]]),\n",
" array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 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, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0,\n",
" 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1,\n",
" 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1,\n",
" 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1,\n",
" 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n",
" 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1,\n",
" 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0,\n",
" 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1,\n",
" 0, 1, 1, 1, 0, 0, 1, 1, 1, 1]),\n",
" array([0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1,\n",
" 1, 1, 1, 1]))"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"frames = [Train, Test]\n",
"Data = np.array(pd.concat(frames).values)\n",
"Y,X = Data[:,0],Data[:,1:]\n",
"x_train, x_test, y_train, y_test = train_test_split(X,Y,train_size=0.9,test_size=0.1)\n",
"x_train.shape, x_test, y_train, y_test"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[0.03385511869397899, 0.06878489913730873, 0.07029712556220485, 0.0634493722610696, 0.06799944392105774, 0.07949590984370473, 0.04644816506348176, 0.055354324283170935, 0.067042440358336, 0.07758983139760595, 0.06355426822930273, 0.039611520541607596, 0.06814338785741138, 0.026586052976336465, 0.010372187070941386, 0.055822484955270125, 0.010100802025692903, 0.025179590172097695, 0.000509769752051636, 0.023711010123725288, 0.04436187929950815, 0.0017304164741353504]\n"
]
}
],
"source": [
"input_array = x_train\n",
"weights = [random.random() for x in range(22)]\n",
"s = sum(weights)\n",
"n_weights = [x/s for x in weights]\n",
"weights = n_weights\n",
"threshold = 0.5\n",
"actual_result = 1\n",
"learning_rate = 0.5\n",
"\n",
"print(weights)"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"def percept(input_array,y_train,weights,lr):\n",
" n = len(input_array)\n",
" m = len(input_array[0])\n",
" error_flag = 0\n",
" for i in range(n):\n",
" \n",
" actual_result = y_train[i]\n",
" inputs = input_array[i]\n",
" pred_op = sum([x*w for x,w in zip(inputs,weights)])\n",
" if pred_op > threshold:\n",
" OP = 1\n",
" else:\n",
" OP = 0\n",
" pred_op = OP\n",
" error = actual_result - pred_op\n",
" if error > 0:\n",
" error_flag = 1\n",
" \n",
" \n",
"\n",
" for j in range(m):\n",
" weights[j] = weights[j] + lr*(actual_result-pred_op)*inputs[j]\n",
" #pred_op = sum([x*w for x,w in zip(inputs,weigts)])\n",
" return error_flag, weights\n",
"\n",
" \n",
" \n",
"\n",
"def Predict(weights,vector,my_res):\n",
" t = len(vector)\n",
" for it in range(t):\n",
" if np.array(vector[it]).dot(np.array(weights)) > threshold:\n",
" int_dot = 1\n",
" else:\n",
" int_dot = 0\n",
" my_res = np.append(my_res,int_dot)\n",
" return my_res\n",
" "
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"\n",
"error_flag = 1\n",
"weights_ = np.array([])\n",
"\n",
"acc = np.array([])\n",
"for threshold in np.arange(0.3,0.7,0.1):\n",
" accuracy = np.array([])\n",
" for learning_rate in np.arange(0.1,1,0.1):\n",
" my_res = np.array([])\n",
" #print(learning_rate)\n",
" it = 0\n",
" while it < 500:\n",
" error_flag_,weights_ = percept(input_array,y_train,weights,learning_rate)\n",
" #if it == 499:\n",
" #print(weights)\n",
" it += 1\n",
"\n",
" my_res = Predict(weights_,x_test,my_res)\n",
" #print(len(my_res),len(y_test))\n",
" \n",
" accuracy = np.append(accuracy,sk.metrics.accuracy_score(y_test,my_res,normalize=True,sample_weight=None))\n",
" #print(accuracy.shape)\n",
" acc = np.concatenate((acc, accuracy), axis=0)\n",
"#print(weights) \n"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[ 0.88888889 0.81481481 0.77777778 0.85185185 0.81481481 0.81481481\n",
" 0.81481481 0.81481481 0.81481481 0.85185185 0.81481481 0.77777778\n",
" 0.81481481 0.77777778 0.77777778 0.81481481 0.85185185 0.81481481\n",
" 0.77777778 0.81481481 0.81481481 0.74074074 0.77777778 0.85185185\n",
" 0.77777778 0.77777778 0.81481481 0.85185185 0.88888889 0.85185185\n",
" 0.81481481 0.81481481 0.81481481 0.77777778 0.77777778 0.81481481]\n"
]
},
{
"data": {
"text/plain": [
"(36,)"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"print(acc)\n",
"acc.shape"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"array([[ 0.88888889, 0.81481481, 0.77777778, 0.85185185, 0.81481481,\n",
" 0.81481481, 0.81481481, 0.81481481, 0.81481481],\n",
" [ 0.85185185, 0.81481481, 0.77777778, 0.81481481, 0.77777778,\n",
" 0.77777778, 0.81481481, 0.85185185, 0.81481481],\n",
" [ 0.77777778, 0.81481481, 0.81481481, 0.74074074, 0.77777778,\n",
" 0.85185185, 0.77777778, 0.77777778, 0.81481481],\n",
" [ 0.85185185, 0.88888889, 0.85185185, 0.81481481, 0.81481481,\n",
" 0.81481481, 0.77777778, 0.77777778, 0.81481481]])"
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"acc_th = np.reshape(acc,(-1,9))\n",
"acc_th"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"max accuracy = 0.888888888889 with threshold = 0.4 and learning rate = 0.8\n"
]
}
],
"source": [
"thresholds = [0.3,0.4,0.5,0.6]\n",
"print('max accuracy =',max(acc),'with threshold =',0.4,'and learning rate =',0.8)"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "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\nAAAASUVORK5CYII=\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7f66a7e8a668>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"x_axis = np.arange(0.1,1,0.1)\n",
"plt.gca().set_prop_cycle('color',['red','green','blue','yellow'])\n",
"\n",
"plt.plot(x_axis,acc_th[0])\n",
"plt.plot(x_axis,acc_th[1])\n",
"plt.plot(x_axis,acc_th[2])\n",
"plt.plot(x_axis,acc_th[3])\n",
"plt.legend(['th=0.3','th=0.4','th=0.5','th=0.6'], loc='lower right')\n",
"plt.ylabel('accuracy')\n",
"plt.xlabel('learning rate')\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 51,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"kf = KFold(267,n_folds=10)\n",
"acc = 0\n",
"totcmat = np.zeros((2,2))\n",
"totacc = 0\n",
"totpre = 0\n",
"totrec = 0\n",
"error_flag = 1\n",
"weights_ = np.array([])\n",
"weights = [random.random() for x in range(22)]\n",
"s = sum(weights)\n",
"n_weights = [x/s for x in weights]\n",
"weights = n_weights\n",
"\n",
"for train_index, test_index in kf:\n",
" my_res = np.array([])\n",
" #print(\"TRAIN:\", train_index, \"TEST:\", test_index)\n",
" X_train, X_test = X[train_index], X[test_index]\n",
" y_train, y_test = Y[train_index], Y[test_index]\n",
" it = 0\n",
" while it < 500:\n",
" error_flag_,weights_ = percept(X_train,y_train,weights,learning_rate)\n",
" #if it == 499:\n",
" #print(weights)\n",
" it += 1\n",
" my_res = Predict(weights_,X_test,my_res)\n",
" cmat = sk.metrics.confusion_matrix(y_test,my_res,[1,0])\n",
" totacc += (cmat[0][0]+cmat[1][1])/np.sum(cmat)\n",
" totcmat += cmat\n",
" totpre += (cmat[0][0])/(cmat[0][0]+cmat[0][1])\n",
" totrec += (cmat[0][0])/(cmat[0][0]+cmat[1][0])\n",
" acc = acc + np.sum(my_res == y_test)/len(my_res)"
]
},
{
"cell_type": "code",
"execution_count": 52,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"avgacc = totacc/10\n",
"avgcmat = totcmat/10\n",
"avgpre = totpre/10\n",
"avgrec = totrec/10"
]
},
{
"cell_type": "code",
"execution_count": 53,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"0.568376068376\n",
"[[ 11.4 9.8]\n",
" [ 1.7 3.8]]\n",
"0.502874902875\n",
"0.808823529412\n"
]
}
],
"source": [
"\n",
"sk.metrics.confusion_matrix(y_test,my_res)\n",
"print(avgacc)\n",
"print(avgcmat)\n",
"print(avgpre)\n",
"print(avgrec)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"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.5.1"
}
},
"nbformat": 4,
"nbformat_minor": 0
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment