1 lines (1 with data), 33.4 kB
{"nbformat":4,"nbformat_minor":0,"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.7.4"},"colab":{"name":"Classifier_SVM_Personal.ipynb","provenance":[]}},"cells":[{"cell_type":"markdown","metadata":{"id":"iA15njZLZAC7"},"source":["# SVM Personal"]},{"cell_type":"code","metadata":{"id":"eCjn8SE3ZAC7"},"source":["import os\n","import numpy as np\n","import pandas as pd\n","from matplotlib import pyplot as plt\n","import scipy\n","import scipy.sparse as sp\n","\n","from sklearn.model_selection import train_test_split\n","from sklearn import preprocessing\n","import sklearn.metrics\n","from sklearn.model_selection import GridSearchCV, StratifiedKFold, cross_val_score\n","from sklearn.ensemble import RandomForestClassifier\n","import sklearn.svm\n","from sklearn import svm\n","from sklearn.model_selection import KFold\n","from sklearn.preprocessing import StandardScaler\n","from sklearn.metrics import f1_score, accuracy_score\n","from sklearn.model_selection import cross_validate\n","from sklearn.metrics import confusion_matrix\n","from sklearn.metrics import classification_report\n","from sklearn.metrics import make_scorer\n","\n","from os import listdir, walk\n","from os.path import isfile, join, relpath\n","\n","import scipy\n","from scipy.io import arff\n","import arff\n","from io import StringIO\n","import math\n","\n","import warnings\n","#warnings.filterwarnings('always') # \"error\", \"ignore\", \"always\", \"default\", \"module\" or \"once\"\n","from prettytable import PrettyTable"],"execution_count":null,"outputs":[]},{"cell_type":"markdown","metadata":{"id":"gpLWv5wBZAC8"},"source":["svm_feature_imp and svm_feature function is used to plot the feature importance graph. Note: Only linear kernel can be used for this.\n","Link Reference: https://stackoverflow.com/questions/41592661/determining-the-most-contributing-features-for-svm-classifier-in-sklearn"]},{"cell_type":"code","metadata":{"id":"dEi2j8BZZAC8"},"source":["def svm_feature_imp(coef, names):\n"," imp = coef\n"," imp,names = zip(*sorted(zip(imp,names)))\n"," #print(imp + names)\n"," #print(names[-10:])\n"," plt.barh(range(len(names)), imp, align='center')\n"," plt.yticks(range(len(names)), names)\n"," plt.show()"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"foxoPePyZAC8"},"source":["def svm_feature(X,y):\n"," features_names = [\"X0\",\"X1\",\"X2\",\"X3\",\"X4\",\"X5\",\"X6\",\"X7\",\"X8\",\"X9\",\"Y0\",\"Y1\",\"Y2\",\"Y3\",\"Y4\",\"Y5\",\"Y6\",\"Y7\",\"Y8\",\"Y9\",\"Z0\",\"Z1\",\"Z2\",\"Z3\",\"Z4\",\"Z5\",\"Z6\",\"Z7\",\"Z8\",\"Z9\",\"XAVG\",\"YAVG\",\"ZAVG\",\"XPEAK\",\"YPEAK\",\"ZPEAK\",\"XABSOLDEV\",\"YABSOLDEV\",\"ZABSOLDEV\",\"XSTANDDEV\",\"YSTANDDEV\",\"ZSTANDDEV\",\"RESULTANT\"] \n"," svm = sklearn.svm.SVC(kernel='linear')\n"," svm.fit(X, y.ravel())\n"," plt.figure(figsize=(20,10))\n"," names = svm_feature_imp(svm.coef_[0], features_names)"],"execution_count":null,"outputs":[]},{"cell_type":"markdown","metadata":{"id":"tLPCRqOUZAC8"},"source":["Read all the files"]},{"cell_type":"code","metadata":{"id":"vAQ-jzJlZAC8"},"source":["file_dict = {0 : \"Phone Accel\" , 1:\"Watch Accel\", 2:\"Phone Gyro\", 3:\"Watch Gyro\"}"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"4XphWjHQZADN","outputId":"1497f248-ee20-4497-b3fa-ae818c6959cf"},"source":["file1 = [\"./data/transformed_data/phone/accel/\" + f for f in listdir(\"./data/transformed_data/phone/accel/\") if f.endswith('.csv')]\n","file2 = [\"./data/transformed_data/watch/accel/\" + f for f in listdir(\"./data/transformed_data/watch/accel/\") if f.endswith('.csv')]\n","file3 = [\"./data/transformed_data/phone/gyro/\" + f for f in listdir(\"./data/transformed_data/phone/gyro/\") if f.endswith('.csv')]\n","file4 = [\"./data/transformed_data/watch/gyro/\" + f for f in listdir(\"./data/transformed_data/watch/gyro/\") if f.endswith('.csv')]\n","files = [file1] + [file2] + [file3] + [file4]\n","print (files)"],"execution_count":null,"outputs":[{"output_type":"stream","text":["[['./data/transformed_data/phone/accel/data_1600_accel_phone.csv', './data/transformed_data/phone/accel/data_1601_accel_phone.csv', './data/transformed_data/phone/accel/data_1602_accel_phone.csv', './data/transformed_data/phone/accel/data_1603_accel_phone.csv', './data/transformed_data/phone/accel/data_1604_accel_phone.csv', './data/transformed_data/phone/accel/data_1605_accel_phone.csv', './data/transformed_data/phone/accel/data_1606_accel_phone.csv', './data/transformed_data/phone/accel/data_1607_accel_phone.csv', './data/transformed_data/phone/accel/data_1608_accel_phone.csv', './data/transformed_data/phone/accel/data_1609_accel_phone.csv', './data/transformed_data/phone/accel/data_1610_accel_phone.csv', './data/transformed_data/phone/accel/data_1611_accel_phone.csv', './data/transformed_data/phone/accel/data_1612_accel_phone.csv', './data/transformed_data/phone/accel/data_1613_accel_phone.csv', './data/transformed_data/phone/accel/data_1615_accel_phone.csv', './data/transformed_data/phone/accel/data_1616_accel_phone.csv', './data/transformed_data/phone/accel/data_1617_accel_phone.csv', './data/transformed_data/phone/accel/data_1618_accel_phone.csv', './data/transformed_data/phone/accel/data_1619_accel_phone.csv', './data/transformed_data/phone/accel/data_1620_accel_phone.csv', './data/transformed_data/phone/accel/data_1621_accel_phone.csv', './data/transformed_data/phone/accel/data_1622_accel_phone.csv', './data/transformed_data/phone/accel/data_1623_accel_phone.csv', './data/transformed_data/phone/accel/data_1624_accel_phone.csv', './data/transformed_data/phone/accel/data_1625_accel_phone.csv', './data/transformed_data/phone/accel/data_1626_accel_phone.csv', './data/transformed_data/phone/accel/data_1627_accel_phone.csv', './data/transformed_data/phone/accel/data_1628_accel_phone.csv', './data/transformed_data/phone/accel/data_1629_accel_phone.csv', './data/transformed_data/phone/accel/data_1630_accel_phone.csv', './data/transformed_data/phone/accel/data_1631_accel_phone.csv', './data/transformed_data/phone/accel/data_1632_accel_phone.csv', './data/transformed_data/phone/accel/data_1633_accel_phone.csv', './data/transformed_data/phone/accel/data_1634_accel_phone.csv', './data/transformed_data/phone/accel/data_1635_accel_phone.csv', './data/transformed_data/phone/accel/data_1636_accel_phone.csv', './data/transformed_data/phone/accel/data_1637_accel_phone.csv', './data/transformed_data/phone/accel/data_1638_accel_phone.csv', './data/transformed_data/phone/accel/data_1639_accel_phone.csv', './data/transformed_data/phone/accel/data_1640_accel_phone.csv', './data/transformed_data/phone/accel/data_1641_accel_phone.csv', './data/transformed_data/phone/accel/data_1642_accel_phone.csv', './data/transformed_data/phone/accel/data_1643_accel_phone.csv', './data/transformed_data/phone/accel/data_1644_accel_phone.csv', './data/transformed_data/phone/accel/data_1645_accel_phone.csv', './data/transformed_data/phone/accel/data_1646_accel_phone.csv', './data/transformed_data/phone/accel/data_1647_accel_phone.csv', './data/transformed_data/phone/accel/data_1648_accel_phone.csv', './data/transformed_data/phone/accel/data_1649_accel_phone.csv', './data/transformed_data/phone/accel/data_1650_accel_phone.csv'], ['./data/transformed_data/watch/accel/data_1600_accel_watch.csv', './data/transformed_data/watch/accel/data_1601_accel_watch.csv', './data/transformed_data/watch/accel/data_1602_accel_watch.csv', './data/transformed_data/watch/accel/data_1603_accel_watch.csv', './data/transformed_data/watch/accel/data_1604_accel_watch.csv', './data/transformed_data/watch/accel/data_1605_accel_watch.csv', './data/transformed_data/watch/accel/data_1606_accel_watch.csv', './data/transformed_data/watch/accel/data_1607_accel_watch.csv', './data/transformed_data/watch/accel/data_1608_accel_watch.csv', './data/transformed_data/watch/accel/data_1609_accel_watch.csv', './data/transformed_data/watch/accel/data_1610_accel_watch.csv', './data/transformed_data/watch/accel/data_1611_accel_watch.csv', './data/transformed_data/watch/accel/data_1612_accel_watch.csv', './data/transformed_data/watch/accel/data_1613_accel_watch.csv', './data/transformed_data/watch/accel/data_1615_accel_watch.csv', './data/transformed_data/watch/accel/data_1616_accel_watch.csv', './data/transformed_data/watch/accel/data_1617_accel_watch.csv', './data/transformed_data/watch/accel/data_1618_accel_watch.csv', './data/transformed_data/watch/accel/data_1619_accel_watch.csv', './data/transformed_data/watch/accel/data_1620_accel_watch.csv', './data/transformed_data/watch/accel/data_1621_accel_watch.csv', './data/transformed_data/watch/accel/data_1622_accel_watch.csv', './data/transformed_data/watch/accel/data_1623_accel_watch.csv', './data/transformed_data/watch/accel/data_1624_accel_watch.csv', './data/transformed_data/watch/accel/data_1625_accel_watch.csv', './data/transformed_data/watch/accel/data_1626_accel_watch.csv', './data/transformed_data/watch/accel/data_1627_accel_watch.csv', './data/transformed_data/watch/accel/data_1628_accel_watch.csv', './data/transformed_data/watch/accel/data_1629_accel_watch.csv', './data/transformed_data/watch/accel/data_1630_accel_watch.csv', './data/transformed_data/watch/accel/data_1631_accel_watch.csv', './data/transformed_data/watch/accel/data_1632_accel_watch.csv', './data/transformed_data/watch/accel/data_1633_accel_watch.csv', './data/transformed_data/watch/accel/data_1634_accel_watch.csv', './data/transformed_data/watch/accel/data_1635_accel_watch.csv', './data/transformed_data/watch/accel/data_1636_accel_watch.csv', './data/transformed_data/watch/accel/data_1637_accel_watch.csv', './data/transformed_data/watch/accel/data_1638_accel_watch.csv', './data/transformed_data/watch/accel/data_1639_accel_watch.csv', './data/transformed_data/watch/accel/data_1640_accel_watch.csv', './data/transformed_data/watch/accel/data_1641_accel_watch.csv', './data/transformed_data/watch/accel/data_1642_accel_watch.csv', './data/transformed_data/watch/accel/data_1643_accel_watch.csv', './data/transformed_data/watch/accel/data_1644_accel_watch.csv', './data/transformed_data/watch/accel/data_1645_accel_watch.csv', './data/transformed_data/watch/accel/data_1646_accel_watch.csv', './data/transformed_data/watch/accel/data_1647_accel_watch.csv', './data/transformed_data/watch/accel/data_1648_accel_watch.csv', './data/transformed_data/watch/accel/data_1649_accel_watch.csv', './data/transformed_data/watch/accel/data_1650_accel_watch.csv'], ['./data/transformed_data/phone/gyro/data_1600_gyro_phone.csv', './data/transformed_data/phone/gyro/data_1601_gyro_phone.csv', './data/transformed_data/phone/gyro/data_1602_gyro_phone.csv', './data/transformed_data/phone/gyro/data_1603_gyro_phone.csv', './data/transformed_data/phone/gyro/data_1604_gyro_phone.csv', './data/transformed_data/phone/gyro/data_1605_gyro_phone.csv', './data/transformed_data/phone/gyro/data_1606_gyro_phone.csv', './data/transformed_data/phone/gyro/data_1607_gyro_phone.csv', './data/transformed_data/phone/gyro/data_1608_gyro_phone.csv', './data/transformed_data/phone/gyro/data_1609_gyro_phone.csv', './data/transformed_data/phone/gyro/data_1610_gyro_phone.csv', './data/transformed_data/phone/gyro/data_1611_gyro_phone.csv', './data/transformed_data/phone/gyro/data_1612_gyro_phone.csv', './data/transformed_data/phone/gyro/data_1613_gyro_phone.csv', './data/transformed_data/phone/gyro/data_1615_gyro_phone.csv', './data/transformed_data/phone/gyro/data_1616_gyro_phone.csv', './data/transformed_data/phone/gyro/data_1617_gyro_phone.csv', './data/transformed_data/phone/gyro/data_1618_gyro_phone.csv', './data/transformed_data/phone/gyro/data_1619_gyro_phone.csv', './data/transformed_data/phone/gyro/data_1620_gyro_phone.csv', './data/transformed_data/phone/gyro/data_1621_gyro_phone.csv', './data/transformed_data/phone/gyro/data_1622_gyro_phone.csv', './data/transformed_data/phone/gyro/data_1623_gyro_phone.csv', './data/transformed_data/phone/gyro/data_1624_gyro_phone.csv', './data/transformed_data/phone/gyro/data_1625_gyro_phone.csv', './data/transformed_data/phone/gyro/data_1626_gyro_phone.csv', './data/transformed_data/phone/gyro/data_1627_gyro_phone.csv', './data/transformed_data/phone/gyro/data_1628_gyro_phone.csv', './data/transformed_data/phone/gyro/data_1629_gyro_phone.csv', './data/transformed_data/phone/gyro/data_1630_gyro_phone.csv', './data/transformed_data/phone/gyro/data_1631_gyro_phone.csv', './data/transformed_data/phone/gyro/data_1632_gyro_phone.csv', './data/transformed_data/phone/gyro/data_1633_gyro_phone.csv', './data/transformed_data/phone/gyro/data_1634_gyro_phone.csv', './data/transformed_data/phone/gyro/data_1635_gyro_phone.csv', './data/transformed_data/phone/gyro/data_1636_gyro_phone.csv', './data/transformed_data/phone/gyro/data_1637_gyro_phone.csv', './data/transformed_data/phone/gyro/data_1638_gyro_phone.csv', './data/transformed_data/phone/gyro/data_1639_gyro_phone.csv', './data/transformed_data/phone/gyro/data_1640_gyro_phone.csv', './data/transformed_data/phone/gyro/data_1641_gyro_phone.csv', './data/transformed_data/phone/gyro/data_1642_gyro_phone.csv', './data/transformed_data/phone/gyro/data_1643_gyro_phone.csv', './data/transformed_data/phone/gyro/data_1644_gyro_phone.csv', './data/transformed_data/phone/gyro/data_1645_gyro_phone.csv', './data/transformed_data/phone/gyro/data_1646_gyro_phone.csv', './data/transformed_data/phone/gyro/data_1647_gyro_phone.csv', './data/transformed_data/phone/gyro/data_1648_gyro_phone.csv', './data/transformed_data/phone/gyro/data_1649_gyro_phone.csv', './data/transformed_data/phone/gyro/data_1650_gyro_phone.csv'], ['./data/transformed_data/watch/gyro/data_1600_gyro_watch.csv', './data/transformed_data/watch/gyro/data_1601_gyro_watch.csv', './data/transformed_data/watch/gyro/data_1602_gyro_watch.csv', './data/transformed_data/watch/gyro/data_1603_gyro_watch.csv', './data/transformed_data/watch/gyro/data_1604_gyro_watch.csv', './data/transformed_data/watch/gyro/data_1605_gyro_watch.csv', './data/transformed_data/watch/gyro/data_1606_gyro_watch.csv', './data/transformed_data/watch/gyro/data_1607_gyro_watch.csv', './data/transformed_data/watch/gyro/data_1608_gyro_watch.csv', './data/transformed_data/watch/gyro/data_1609_gyro_watch.csv', './data/transformed_data/watch/gyro/data_1610_gyro_watch.csv', './data/transformed_data/watch/gyro/data_1611_gyro_watch.csv', './data/transformed_data/watch/gyro/data_1612_gyro_watch.csv', './data/transformed_data/watch/gyro/data_1613_gyro_watch.csv', './data/transformed_data/watch/gyro/data_1615_gyro_watch.csv', './data/transformed_data/watch/gyro/data_1616_gyro_watch.csv', './data/transformed_data/watch/gyro/data_1617_gyro_watch.csv', './data/transformed_data/watch/gyro/data_1618_gyro_watch.csv', './data/transformed_data/watch/gyro/data_1619_gyro_watch.csv', './data/transformed_data/watch/gyro/data_1620_gyro_watch.csv', './data/transformed_data/watch/gyro/data_1621_gyro_watch.csv', './data/transformed_data/watch/gyro/data_1622_gyro_watch.csv', './data/transformed_data/watch/gyro/data_1623_gyro_watch.csv', './data/transformed_data/watch/gyro/data_1624_gyro_watch.csv', './data/transformed_data/watch/gyro/data_1625_gyro_watch.csv', './data/transformed_data/watch/gyro/data_1626_gyro_watch.csv', './data/transformed_data/watch/gyro/data_1627_gyro_watch.csv', './data/transformed_data/watch/gyro/data_1628_gyro_watch.csv', './data/transformed_data/watch/gyro/data_1629_gyro_watch.csv', './data/transformed_data/watch/gyro/data_1630_gyro_watch.csv', './data/transformed_data/watch/gyro/data_1631_gyro_watch.csv', './data/transformed_data/watch/gyro/data_1632_gyro_watch.csv', './data/transformed_data/watch/gyro/data_1633_gyro_watch.csv', './data/transformed_data/watch/gyro/data_1634_gyro_watch.csv', './data/transformed_data/watch/gyro/data_1635_gyro_watch.csv', './data/transformed_data/watch/gyro/data_1636_gyro_watch.csv', './data/transformed_data/watch/gyro/data_1637_gyro_watch.csv', './data/transformed_data/watch/gyro/data_1638_gyro_watch.csv', './data/transformed_data/watch/gyro/data_1639_gyro_watch.csv', './data/transformed_data/watch/gyro/data_1640_gyro_watch.csv', './data/transformed_data/watch/gyro/data_1641_gyro_watch.csv', './data/transformed_data/watch/gyro/data_1642_gyro_watch.csv', './data/transformed_data/watch/gyro/data_1643_gyro_watch.csv', './data/transformed_data/watch/gyro/data_1644_gyro_watch.csv', './data/transformed_data/watch/gyro/data_1645_gyro_watch.csv', './data/transformed_data/watch/gyro/data_1646_gyro_watch.csv', './data/transformed_data/watch/gyro/data_1647_gyro_watch.csv', './data/transformed_data/watch/gyro/data_1648_gyro_watch.csv', './data/transformed_data/watch/gyro/data_1649_gyro_watch.csv', './data/transformed_data/watch/gyro/data_1650_gyro_watch.csv']]\n"],"name":"stdout"}]},{"cell_type":"markdown","metadata":{"id":"_PaldKOYZADN"},"source":["Activity names dictionary for printing the activity specific table"]},{"cell_type":"code","metadata":{"id":"7yl-YZdAZADO"},"source":["activity_names = {\"A\":\"Walking\",\"B\":\"Jogging\",\"C\":\"Stairs\",\"D\":\"Sitting\",\"E\":\"Standing\",\"F\":\"Typing\",\"G\":\"Brushing Teeth\",\"H\":\"Eating Soup\",\"I\":\"Eating Chips\",\"J\":\"Eating Pasta\",\"K\":\"Drinking from Cup\",\"L\":\"Eating Sandwich\",\"M\":\"Kicking Soccer Ball\",\"O\":\"Playing Catch w/Tennis Ball\",\"P\":\"Dribbling (Basketball)\",\"Q\":\"Writing\",\"R\":\"Clapping\",\"S\":\"Folding Clothes\"}"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"aciLx2SRZADO","outputId":"229458b5-7de6-4d9b-a807-8b8cf9665a57"},"source":["print(activity_names)"],"execution_count":null,"outputs":[{"output_type":"stream","text":["{'A': 'Walking', 'B': 'Jogging', 'C': 'Stairs', 'D': 'Sitting', 'E': 'Standing', 'F': 'Typing', 'G': 'Brushing Teeth', 'H': 'Eating Soup', 'I': 'Eating Chips', 'J': 'Eating Pasta', 'K': 'Drinking from Cup', 'L': 'Eating Sandwich', 'M': 'Kicking Soccer Ball', 'O': 'Playing Catch w/Tennis Ball', 'P': 'Dribbling (Basketball)', 'Q': 'Writing', 'R': 'Clapping', 'S': 'Folding Clothes'}\n"],"name":"stdout"}]},{"cell_type":"markdown","metadata":{"id":"_A_1lKkNZADO"},"source":["Calculating the TP, FP, FN, TN from the confusion matrix"]},{"cell_type":"code","metadata":{"id":"4k6IcC1YZADO"},"source":["def calculate_cf(confusion_mat, i=0, to_print=True):\n"," TP = confusion_mat[i,i] \n"," FP = confusion_mat[:,i].sum() - TP \n"," FN = confusion_mat[i,:].sum() - TP \n"," TN = confusion_mat.sum().sum() - TP - FP - FN\n"," return TP, FP, FN, TN"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"93P1B6G7ZADO"},"source":["kf = KFold(shuffle=True, n_splits=10) #Using 10 cross validation\n","\n","#Loop for taking each dataset in sequence\n","\n","for fileindex,filelist in enumerate(files):\n"," overall_acc_dic = {}\n"," overall_precision_dic = {}\n"," overall_recall_dic = {}\n"," overall_f1_dic = {}\n"," overall_acc_list = []\n"," \n"," #For each list of file under each type of data i.e, Phone accel, Watch accel, Phone gyro and Watch gyro\n"," for csvfile in filelist:\n"," print(csvfile)\n"," \n"," #Using pandas to read the content of the CSV file\n"," data = pd.read_csv(csvfile, verbose=False)\n","\n"," \n"," #Selecting only the 43 features which are mentioned in Weiss paper\n"," X1 = data.loc[:, \"X0\":\"ZSTANDDEV\"]\n"," X2 = data.loc[:, 'RESULTANT'] \n"," y = data.loc[:, \"ACTIVITY\"]\n","\n"," \n"," #This will find the subject id from the file name\n"," if (fileindex == 0 or fileindex == 1):\n"," subject_id = (csvfile.split('accel'))[1].split('_')[1]\n"," else:\n"," subject_id = (csvfile.split('gyro'))[1].split('_')[1]\n","\n"," \n"," #Using scalar to scale the training set and label encoder to encode the value for activity which is string\n"," scaler = StandardScaler()\n"," le = preprocessing.LabelEncoder()\n","\n"," \n"," #Using np.column.stack to stack 43 features\n"," X = np.column_stack((np.array(X1),np.array(X2)))\n"," #X = scaler.fit_transform(X)\n","\n"," #X_raw = np.column_stack((np.array(X1),np.array(X2)))\n"," y = le.fit_transform(y)\n","\n"," \n"," #Finding the encoded labels for each activity and storing the details in dictionary to print the table\n"," le_name_mapping = dict(zip(le.transform(le.classes_),le.classes_))\n"," #name_le_mapping = dict(zip(le.classes_,le.transform(le.classes_)))\n"," #print(le_name_mapping)\n","\n"," \n"," #Function to plot feature importance. Removed the code where we column stack only the features which was out put of this function\n"," svm_feature(X,y)\n","\n"," \n"," #Hyperparameter search for the following paramters to train SVM\n"," param_grid={\n"," \"kernel\":('linear', 'rbf','poly','sigmoid'),\n"," \"C\": np.logspace(0, 3, 4),\n"," \"degree\": np.logspace(-2, 1, 4),\n"," \"coef0\": [0.1, 1],\n"," \"gamma\": (\"auto\", \"scale\")\n"," }\n","\n"," #k_fold_model = sklearn.model_selection.StratifiedKFold(10, random_state=0)\n"," SVC = sklearn.svm.SVC()\n"," grid_search_cv = sklearn.model_selection.GridSearchCV(SVC, param_grid, cv=10, n_jobs=10)\n"," grid_search_cv.fit(X, y)\n"," print(grid_search_cv.best_params_)\n"," C_val = grid_search_cv.best_params_['C']\n"," gamma_val = grid_search_cv.best_params_['gamma']\n"," coef0_val = grid_search_cv.best_params_['coef0']\n"," kernel_val = grid_search_cv.best_params_['kernel']\n"," degree_val = grid_search_cv.best_params_['degree']\n"," \n"," \n"," #Initialising some paramters to calculate average scores for 10 cross iterations\n"," accuracies = []\n"," iteration = 1\n"," label_acc_dic = {}\n"," label_precision_dic = {}\n"," label_recall_dic = {}\n"," label_f1_dic = {}\n"," target_name_list = []\n"," y_labels=list(set(y))\n"," for j in y_labels:\n"," #target_name_list.append(activity_names[le_name_mapping[j]])\n"," target_name_list.append(le_name_mapping[j])\n"," #print(target_name_list)\n","\n"," \n"," #Splitting the data into train and test. Train the training set with SVM classifier. Use the grid search output\n"," for train_index, test_index in kf.split(X):\n"," X_train, X_test = X[train_index], X[test_index] \n"," X_train = scaler.fit_transform(X_train)\n"," X_test = scaler.fit_transform(X_test)\n"," y_train, y_test = y[train_index], y[test_index]\n"," clf = svm.SVC(C=C_val, coef0=coef0_val, degree=degree_val, gamma=gamma_val, kernel=kernel_val)\n"," #clf = svm.SVC(C=0.5, coef0=1, degree=10, gamma='scale', kernel='poly')\n"," clf.fit(X_train,y_train)\n"," y_pred = clf.predict(X_test)\n"," acc = sklearn.metrics.accuracy_score(y_test, y_pred)\n","\n"," labels=list(set(y_pred))\n"," \n"," #Print the confusion matrix for each iteration of 10 cross validation\n"," cf = sklearn.metrics.confusion_matrix(y_test, y_pred,labels=labels)\n"," print(cf)\n"," \n"," #Calculate accuracy, precision, recall and f1 measure for each activity \n"," i = 0\n"," for label in labels:\n"," #print('Calculating 2x2 contigency table for label{}'.format(i))\n"," TP, FP, FN, TN = calculate_cf(cf, i, to_print=True)\n"," i +=1\n"," decode_label = le_name_mapping[label]\n"," #print(decode_label)\n"," #print(label_acc_dic)\n"," if decode_label in label_acc_dic:\n"," temp_acc_list = label_acc_dic[decode_label]\n"," temp_precision_list = label_precision_dic[decode_label]\n"," temp_recall_list = label_recall_dic[decode_label]\n"," temp_f1_list = label_f1_dic[decode_label]\n"," label_acc_dic[decode_label] = temp_acc_list + [((TP+TN)/(TP+FP+FN+TN))*100]\n"," #print(label_acc_dic[decode_label])\n"," if TP != 0:\n"," label_precision_dic[decode_label] = temp_precision_list + [(TP)/(TP+FP)]\n"," label_recall_dic[decode_label] = temp_recall_list + [(TP)/(TP+FN)]\n"," label_f1_dic[decode_label] = temp_f1_list + [(TP)/(TP+ (0.5 *(FP+FN)))]\n"," else:\n"," label_precision_dic[decode_label] = temp_precision_list + [0]\n"," label_recall_dic[decode_label] = temp_recall_list + [0]\n"," label_f1_dic[decode_label] = temp_f1_list + [0]\n"," else:\n"," label_acc_dic[decode_label] = [((TP+TN)/(TP+FP+FN+TN))*100]\n"," if TP != 0:\n"," label_precision_dic[decode_label] = [(TP)/(TP+FP)]\n"," label_recall_dic[decode_label] = [(TP)/(TP+FN)]\n"," label_f1_dic[decode_label] = [(TP)/(TP+ (0.5 *(FP+FN)))]\n"," else:\n"," label_precision_dic[decode_label] = [0]\n"," label_recall_dic[decode_label] = [0]\n"," label_f1_dic[decode_label] = [0]\n","\n","\n"," #Print the classification report\n"," print(classification_report(y_test, y_pred))\n"," \n"," #Print the average iteration accuracy\n"," accuracies.append(acc)\n"," print(f\"Iteration {iteration}: {100*acc:.2f} %\")\n"," iteration +=1\n","\n","\n"," #Get the average precision, accuracy, recall and f1-measure for each activity of the iterations\n"," sum_a = 0\n"," for i in accuracies:\n"," sum_a += i\n"," ave_accu = sum_a/len(accuracies)\n"," print(f\"Average accuracy: {(ave_accu*100):.2f} %\")\n","\n"," for key in label_acc_dic:\n"," sum_acc_key = 0\n"," temp_list = label_acc_dic[key]\n"," #print(sum(temp_list))\n"," for i in temp_list:\n"," sum_acc_key += i\n","\n"," if sum_acc_key != 0:\n"," label_acc_dic[key] = round(sum_acc_key/len(temp_list),2)\n"," else:\n"," label_acc_dic[key] = 0\n"," #t = PrettyTable(['Class', 'Accuracy', 'Precision', 'Recall', 'F1-Measure'])\n","\n","\n"," for key in label_precision_dic:\n"," sum_precision_key = 0\n"," temp_list = label_precision_dic[key]\n"," #print(sum(temp_list))\n"," for i in temp_list:\n"," sum_precision_key += i\n"," if sum_precision_key != 0:\n"," label_precision_dic[key] = round(sum_precision_key/len(temp_list),2)\n"," else:\n"," label_precision_dic[key] = 0\n","\n"," for key in label_recall_dic:\n"," sum_recall_key = 0\n"," temp_list = label_recall_dic[key]\n"," #print(temp_list)\n"," for i in temp_list:\n"," sum_recall_key += i\n"," #print(\"sum_recall_key\" + str(sum_recall_key))\n"," #print(\"len(temp_list)\" + str(len(temp_list)))\n"," if sum_recall_key != 0:\n"," label_recall_dic[key] = round(sum_recall_key/len(temp_list),2)\n"," else:\n"," label_recall_dic[key] = 0\n","\n"," #print(label_recall_dic[key])\n","\n"," for key in label_f1_dic:\n"," sum_f1_key = 0\n"," temp_list = label_f1_dic[key]\n"," #print(sum(temp_list))\n"," for i in temp_list:\n"," sum_f1_key += i\n"," if sum_f1_key != 0:\n"," label_f1_dic[key] = round(sum_f1_key/len(temp_list),2)\n"," else:\n"," label_f1_dic[key] = 0\n","\n"," #Print the table with average accuracy for each activity for each subject Id\n"," print(\"Subject ID: \" + subject_id)\n"," t = PrettyTable(['Class', 'Accuracy', 'Precision', 'Recall', 'F1-Measure'])\n"," for activity in dict(sorted(label_acc_dic.items())):\n"," #print(label_recall_dic[activity])\n"," t.add_row([activity_names[activity],str(str(label_acc_dic[activity])+\"%\"),label_precision_dic[activity],label_recall_dic[activity],label_f1_dic[activity]])\n"," #print(type(activity))\n"," #label_code = name_le_mapping[activity]\n"," \n"," #add the scoring values of all the subject to find the overall accuracy\n"," if activity in overall_acc_dic:\n"," temp_acc_list = overall_acc_dic[activity]\n"," temp_pre_list = overall_precision_dic[activity]\n"," temp_re_list = overall_recall_dic[activity]\n"," temp_f1_list = overall_f1_dic[activity]\n"," overall_acc_dic[activity] = temp_acc_list + [round(label_acc_dic[activity],2)]\n"," overall_precision_dic[activity] = temp_pre_list + [round(label_precision_dic[activity],2)]\n"," overall_recall_dic[activity] = temp_re_list + [round(label_recall_dic[activity],2)]\n"," overall_f1_dic[activity] = temp_f1_list + [round(label_f1_dic[activity],2)]\n"," else:\n"," #print(type(overall_acc_dic))\n"," overall_acc_dic[activity] = [round(label_acc_dic[activity],2)]\n"," overall_precision_dic[activity] = [round(label_precision_dic[activity],2)]\n"," overall_recall_dic[activity] = [round(label_recall_dic[activity],2)]\n"," overall_f1_dic[activity] = [round(label_f1_dic[activity],2)]\n","\n"," #print the table for average score details for each subject id\n"," print(t)\n"," \n"," #compute the overall accuracy\n"," overall_acc_list.append((subject_id,(ave_accu*100)))\n"," \n"," #Compute the overall accuracy \n"," avg_accuracy_list=[]\n"," for sub_id,avg_acc in overall_acc_list:\n"," avg_accuracy_list.append(avg_acc)\n"," \n"," overall_accuracy = sum(avg_accuracy_list)/len(overall_acc_list)\n"," \n"," print(\"Overall Accuracy for %s: %.2f%%\"%(file_dict[fileindex],overall_accuracy))\n"," \n"," #Compute overall accuracy for accuracy, precision, recall and f1-measure for each activity\n"," for key in overall_acc_dic:\n"," sum_acc_key = 0\n"," temp_list = overall_acc_dic[key]\n"," for i in temp_list:\n"," sum_acc_key += i\n"," if sum_acc_key != 0:\n"," overall_acc_dic[key] = round(sum_acc_key/len(temp_list),2)\n"," else:\n"," overall_acc_dic[key] = 0\n"," \n"," for key in overall_precision_dic:\n"," sum_precision_key = 0\n"," temp_list = overall_precision_dic[key]\n"," for i in temp_list:\n"," sum_precision_key += i\n"," if sum_precision_key != 0:\n"," overall_precision_dic[key] = round(sum_precision_key/len(temp_list),2)\n"," else:\n"," overall_precision_dic[key] = 0\n"," \n"," \n"," for key in overall_recall_dic:\n"," sum_recall_key = 0\n"," temp_list = overall_recall_dic[key]\n"," #print(temp_list)\n"," for i in temp_list:\n"," sum_recall_key += i\n"," if sum_recall_key != 0:\n"," overall_recall_dic[key] = round(sum_recall_key/len(temp_list),2)\n"," else:\n"," overall_recall_dic[key] = 0\n"," \n"," \n"," for key in overall_f1_dic:\n"," sum_f1_key = 0\n"," temp_list = overall_f1_dic[key]\n"," for i in temp_list:\n"," sum_f1_key += i\n"," if sum_f1_key != 0:\n"," overall_f1_dic[key] = round(sum_f1_key/len(temp_list),2)\n"," else:\n"," overall_f1_dic[key] = 0\n"," \n"," #Print the overall score details for each type of data i.e., Phone accel, watch accel, Phone gyro and watch gyro\n"," print(\"Overall score for %s\"%file_dict[fileindex])\n"," to = PrettyTable(['Class', 'Accuracy', 'Precision', 'Recall', 'F1-Measure'])\n"," for activity in dict(sorted(label_acc_dic.items())):\n"," to.add_row([activity_names[activity],str(str(overall_acc_dic[activity])+\"%\"),overall_precision_dic[activity],overall_recall_dic[activity],overall_f1_dic[activity]])\n","\n"," print(to)\n"," print(\"-----------------------------------------------------------------------------------------\")"],"execution_count":null,"outputs":[]}]}