robitalhazmi/genetic_algorithm
0
1{2 "cells": [3 {4 "cell_type": "code",5 "execution_count": 43,6 "metadata": {7 "id": "l8Y_Fz5_VKUf"8 },9 "outputs": [],10 "source": [11 "import numpy as np\n",12 "import pandas as pd\n",13 "import seaborn as sns\n",14 "import matplotlib.pyplot as plt\n",15 "%matplotlib inline\n",16 "from random import randint\n",17 "from joblib import dump, load\n",18 "import warnings\n",19 "warnings.filterwarnings(\"ignore\")\n",20 "\n",21 "from sklearn.model_selection import train_test_split\n",22 "from sklearn import tree\n",23 "from sklearn.tree import DecisionTreeClassifier\n",24 "from sklearn.metrics import accuracy_score\n",25 "\n",26 "import graphviz"27 ]28 },29 {30 "cell_type": "code",31 "execution_count": 20,32 "metadata": {33 "id": "mIqh1kxmVQ9o"34 },35 "outputs": [],36 "source": [37 "classifiers = ['DecisionTree']\n",38 "\n",39 "models = [DecisionTreeClassifier(random_state=0)]\n",40 "\n",41 "def split(df,label):\n",42 " X_train, X_test, Y_train, Y_test = train_test_split(df, label, test_size=0.25, random_state=42, stratify=label)\n",43 " return X_train, X_test, Y_train, Y_test\n",44 "\n",45 "def acc_score(df,label):\n",46 " score = pd.DataFrame({\"Classifier\":classifiers})\n",47 " acc = []\n",48 " X_train,X_test,Y_train,Y_test = split(df,label)\n",49 " for i in models:\n",50 " model = i\n",51 " model.fit(X_train,Y_train)\n",52 " predictions = model.predict(X_test)\n",53 " acc.append(accuracy_score(Y_test,predictions))\n",54 " score[\"Accuracy\"] = acc\n",55 " score.sort_values(by=\"Accuracy\", ascending=False,inplace = True)\n",56 " score.reset_index(drop=True, inplace=True)\n",57 " return score\n",58 "\n",59 "def plot(score,x,y,c = \"b\"):\n",60 " gen = [1,2,3,4,5]\n",61 " plt.figure(figsize=(6,4))\n",62 " ax = sns.pointplot(x=gen, y=score,color = c )\n",63 " ax.set(xlabel=\"Generation\", ylabel=\"Accuracy\")\n",64 " plt.show()"65 ]66 },67 {68 "cell_type": "code",69 "execution_count": 21,70 "metadata": {71 "id": "SYWqktBJVQ7I"72 },73 "outputs": [],74 "source": [75 "def initilization_of_population(size,n_feat):\n",76 " population = []\n",77 " for i in range(size):\n",78 " chromosome = np.ones(n_feat, bool)\n",79 " chromosome[:int(0.3*n_feat)]=False\n",80 " np.random.shuffle(chromosome)\n",81 " population.append(chromosome)\n",82 " return population\n",83 "\n",84 "def fitness_score(population):\n",85 " scores = []\n",86 " models = []\n",87 " for chromosome in population:\n",88 " logmodel = DecisionTreeClassifier(random_state=0)\n",89 " logmodel.fit(X_train.iloc[:,chromosome], Y_train)\n",90 " predictions = logmodel.predict(X_test.iloc[:,chromosome])\n",91 " scores.append(accuracy_score(Y_test,predictions))\n",92 " models.append(logmodel)\n",93 " scores, population, models = np.array(scores), np.array(population), np.array(models)\n",94 " inds = np.argsort(scores)\n",95 " return list(scores[inds][::-1]), list(population[inds,:][::-1]), list(models[inds][::-1])\n",96 "\n",97 "def selection(pop_after_fit, n_parents):\n",98 " population_nextgen = []\n",99 " for i in range(n_parents):\n",100 " population_nextgen.append(pop_after_fit[i])\n",101 " return population_nextgen\n",102 "\n",103 "def crossover(pop_after_sel):\n",104 " pop_nextgen = pop_after_sel\n",105 " for i in range(0,len(pop_after_sel),2):\n",106 " new_par = []\n",107 " child_1 , child_2 = pop_nextgen[i] , pop_nextgen[i+1]\n",108 " new_par = np.concatenate((child_1[:len(child_1)//2],child_2[len(child_1)//2:]))\n",109 " pop_nextgen.append(new_par)\n",110 " return pop_nextgen\n",111 "\n",112 "def mutation(pop_after_cross, mutation_rate, n_feat):\n",113 " mutation_range = int(mutation_rate * n_feat)\n",114 " for n in range(64, len(pop_after_cross)):\n",115 " chromo = pop_after_cross[n]\n",116 " rand_posi = []\n",117 " for i in range(0, mutation_range):\n",118 " pos = randint(0, n_feat-1)\n",119 " rand_posi.append(pos)\n",120 " for j in rand_posi:\n",121 " chromo[j] = not chromo[j]\n",122 " pop_after_cross[n] = chromo\n",123 " return pop_after_cross\n",124 "\n",125 "def generations(df, label, size, n_feat, n_parents, mutation_rate, n_gen, X_train, X_test, Y_train, Y_test):\n",126 " best_chromo = []\n",127 " best_score = []\n",128 " best_models = []\n",129 " population_nextgen=initilization_of_population(size,n_feat)\n",130 " for i in range(n_gen):\n",131 " scores, pop_after_fit, models = fitness_score(population_nextgen)\n",132 " print('Best score in generation',i+1,':',scores[:1])\n",133 "\n",134 " pop_after_sel = selection(pop_after_fit, n_parents)\n",135 " pop_after_cross = crossover(pop_after_sel)\n",136 " population_nextgen = mutation(pop_after_cross, mutation_rate, n_feat)\n",137 "\n",138 " best_score.append(scores[0])\n",139 " best_chromo.append(pop_after_fit[0])\n",140 " best_models.append(models[0])\n",141 "\n",142 " return best_chromo, best_score, best_models"143 ]144 },145 {146 "cell_type": "code",147 "execution_count": 22,148 "metadata": {149 "colab": {150 "base_uri": "https://localhost:8080/",151 "height": 273152 },153 "id": "X3Ww2R2wVQ44",154 "outputId": "ccd8b6d6-f6ce-4bf5-c476-8e28c11cc0ee"155 },156 "outputs": [157 {158 "name": "stdout",159 "output_type": "stream",160 "text": [161 "(920, 23)\n"162 ]163 },164 {165 "data": {166 "text/html": [167 "<div>\n",168 "<style scoped>\n",169 " .dataframe tbody tr th:only-of-type {\n",170 " vertical-align: middle;\n",171 " }\n",172 "\n",173 " .dataframe tbody tr th {\n",174 " vertical-align: top;\n",175 " }\n",176 "\n",177 " .dataframe thead th {\n",178 " text-align: right;\n",179 " }\n",180 "</style>\n",181 "<table border=\"1\" class=\"dataframe\">\n",182 " <thead>\n",183 " <tr style=\"text-align: right;\">\n",184 " <th></th>\n",185 " <th>age</th>\n",186 " <th>trestbps</th>\n",187 " <th>chol</th>\n",188 " <th>thalach</th>\n",189 " <th>oldpeak</th>\n",190 " <th>ca</th>\n",191 " <th>sex</th>\n",192 " <th>fbs</th>\n",193 " <th>exang</th>\n",194 " <th>cp_1.0</th>\n",195 " <th>...</th>\n",196 " <th>restecg_0</th>\n",197 " <th>restecg_1</th>\n",198 " <th>restecg_2</th>\n",199 " <th>slope_1</th>\n",200 " <th>slope_2</th>\n",201 " <th>slope_3</th>\n",202 " <th>thal_3.0</th>\n",203 " <th>thal_6.0</th>\n",204 " <th>thal_7.0</th>\n",205 " <th>num</th>\n",206 " </tr>\n",207 " </thead>\n",208 " <tbody>\n",209 " <tr>\n",210 " <th>0</th>\n",211 " <td>63.0</td>\n",212 " <td>145.0</td>\n",213 " <td>233.0</td>\n",214 " <td>150.0</td>\n",215 " <td>2.3</td>\n",216 " <td>0.0</td>\n",217 " <td>1.0</td>\n",218 " <td>1</td>\n",219 " <td>0</td>\n",220 " <td>1.0</td>\n",221 " <td>...</td>\n",222 " <td>0.0</td>\n",223 " <td>0.0</td>\n",224 " <td>1.0</td>\n",225 " <td>0.0</td>\n",226 " <td>0.0</td>\n",227 " <td>1.0</td>\n",228 " <td>0.0</td>\n",229 " <td>1.0</td>\n",230 " <td>0.0</td>\n",231 " <td>0</td>\n",232 " </tr>\n",233 " <tr>\n",234 " <th>1</th>\n",235 " <td>67.0</td>\n",236 " <td>160.0</td>\n",237 " <td>286.0</td>\n",238 " <td>108.0</td>\n",239 " <td>1.5</td>\n",240 " <td>3.0</td>\n",241 " <td>1.0</td>\n",242 " <td>0</td>\n",243 " <td>1</td>\n",244 " <td>0.0</td>\n",245 " <td>...</td>\n",246 " <td>0.0</td>\n",247 " <td>0.0</td>\n",248 " <td>1.0</td>\n",249 " <td>0.0</td>\n",250 " <td>1.0</td>\n",251 " <td>0.0</td>\n",252 " <td>1.0</td>\n",253 " <td>0.0</td>\n",254 " <td>0.0</td>\n",255 " <td>1</td>\n",256 " </tr>\n",257 " <tr>\n",258 " <th>2</th>\n",259 " <td>67.0</td>\n",260 " <td>120.0</td>\n",261 " <td>229.0</td>\n",262 " <td>129.0</td>\n",263 " <td>2.6</td>\n",264 " <td>2.0</td>\n",265 " <td>1.0</td>\n",266 " <td>0</td>\n",267 " <td>1</td>\n",268 " <td>0.0</td>\n",269 " <td>...</td>\n",270 " <td>0.0</td>\n",271 " <td>0.0</td>\n",272 " <td>1.0</td>\n",273 " <td>0.0</td>\n",274 " <td>1.0</td>\n",275 " <td>0.0</td>\n",276 " <td>0.0</td>\n",277 " <td>0.0</td>\n",278 " <td>1.0</td>\n",279 " <td>1</td>\n",280 " </tr>\n",281 " <tr>\n",282 " <th>3</th>\n",283 " <td>37.0</td>\n",284 " <td>130.0</td>\n",285 " <td>250.0</td>\n",286 " <td>187.0</td>\n",287 " <td>3.5</td>\n",288 " <td>0.0</td>\n",289 " <td>1.0</td>\n",290 " <td>0</td>\n",291 " <td>0</td>\n",292 " <td>0.0</td>\n",293 " <td>...</td>\n",294 " <td>1.0</td>\n",295 " <td>0.0</td>\n",296 " <td>0.0</td>\n",297 " <td>0.0</td>\n",298 " <td>0.0</td>\n",299 " <td>1.0</td>\n",300 " <td>1.0</td>\n",301 " <td>0.0</td>\n",302 " <td>0.0</td>\n",303 " <td>0</td>\n",304 " </tr>\n",305 " <tr>\n",306 " <th>4</th>\n",307 " <td>41.0</td>\n",308 " <td>130.0</td>\n",309 " <td>204.0</td>\n",310 " <td>172.0</td>\n",311 " <td>1.4</td>\n",312 " <td>0.0</td>\n",313 " <td>0.0</td>\n",314 " <td>0</td>\n",315 " <td>0</td>\n",316 " <td>0.0</td>\n",317 " <td>...</td>\n",318 " <td>0.0</td>\n",319 " <td>0.0</td>\n",320 " <td>1.0</td>\n",321 " <td>1.0</td>\n",322 " <td>0.0</td>\n",323 " <td>0.0</td>\n",324 " <td>1.0</td>\n",325 " <td>0.0</td>\n",326 " <td>0.0</td>\n",327 " <td>0</td>\n",328 " </tr>\n",329 " </tbody>\n",330 "</table>\n",331 "<p>5 rows × 23 columns</p>\n",332 "</div>"333 ],334 "text/plain": [335 " age trestbps chol thalach oldpeak ca sex fbs exang cp_1.0 ... \\\n",336 "0 63.0 145.0 233.0 150.0 2.3 0.0 1.0 1 0 1.0 ... \n",337 "1 67.0 160.0 286.0 108.0 1.5 3.0 1.0 0 1 0.0 ... \n",338 "2 67.0 120.0 229.0 129.0 2.6 2.0 1.0 0 1 0.0 ... \n",339 "3 37.0 130.0 250.0 187.0 3.5 0.0 1.0 0 0 0.0 ... \n",340 "4 41.0 130.0 204.0 172.0 1.4 0.0 0.0 0 0 0.0 ... \n",341 "\n",342 " restecg_0 restecg_1 restecg_2 slope_1 slope_2 slope_3 thal_3.0 \\\n",343 "0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 \n",344 "1 0.0 0.0 1.0 0.0 1.0 0.0 1.0 \n",345 "2 0.0 0.0 1.0 0.0 1.0 0.0 0.0 \n",346 "3 1.0 0.0 0.0 0.0 0.0 1.0 1.0 \n",347 "4 0.0 0.0 1.0 1.0 0.0 0.0 1.0 \n",348 "\n",349 " thal_6.0 thal_7.0 num \n",350 "0 1.0 0.0 0 \n",351 "1 0.0 0.0 1 \n",352 "2 0.0 1.0 1 \n",353 "3 0.0 0.0 0 \n",354 "4 0.0 0.0 0 \n",355 "\n",356 "[5 rows x 23 columns]"357 ]358 },359 "execution_count": 22,360 "metadata": {},361 "output_type": "execute_result"362 }363 ],364 "source": [365 "data_hd = pd.read_csv('./encoded_heart_disease.csv')\n",366 "\n",367 "print(data_hd.shape)\n",368 "data_hd.head()"369 ]370 },371 {372 "cell_type": "code",373 "execution_count": 23,374 "metadata": {375 "colab": {376 "base_uri": "https://localhost:8080/",377 "height": 273378 },379 "id": "Zu6Gr1HGiS6Q",380 "outputId": "deec92ca-74f3-4e15-c89e-c0bb9858e586"381 },382 "outputs": [383 {384 "name": "stdout",385 "output_type": "stream",386 "text": [387 "(920, 23)\n"388 ]389 },390 {391 "data": {392 "text/html": [393 "<div>\n",394 "<style scoped>\n",395 " .dataframe tbody tr th:only-of-type {\n",396 " vertical-align: middle;\n",397 " }\n",398 "\n",399 " .dataframe tbody tr th {\n",400 " vertical-align: top;\n",401 " }\n",402 "\n",403 " .dataframe thead th {\n",404 " text-align: right;\n",405 " }\n",406 "</style>\n",407 "<table border=\"1\" class=\"dataframe\">\n",408 " <thead>\n",409 " <tr style=\"text-align: right;\">\n",410 " <th></th>\n",411 " <th>age</th>\n",412 " <th>trestbps</th>\n",413 " <th>chol</th>\n",414 " <th>thalach</th>\n",415 " <th>oldpeak</th>\n",416 " <th>ca</th>\n",417 " <th>sex</th>\n",418 " <th>fbs</th>\n",419 " <th>exang</th>\n",420 " <th>cp_1.0</th>\n",421 " <th>...</th>\n",422 " <th>restecg_0</th>\n",423 " <th>restecg_1</th>\n",424 " <th>restecg_2</th>\n",425 " <th>slope_1</th>\n",426 " <th>slope_2</th>\n",427 " <th>slope_3</th>\n",428 " <th>thal_3.0</th>\n",429 " <th>thal_6.0</th>\n",430 " <th>thal_7.0</th>\n",431 " <th>num</th>\n",432 " </tr>\n",433 " </thead>\n",434 " <tbody>\n",435 " <tr>\n",436 " <th>0</th>\n",437 " <td>63.0</td>\n",438 " <td>145.0</td>\n",439 " <td>233.0</td>\n",440 " <td>150.0</td>\n",441 " <td>2.3</td>\n",442 " <td>0.0</td>\n",443 " <td>1.0</td>\n",444 " <td>1</td>\n",445 " <td>0</td>\n",446 " <td>1.0</td>\n",447 " <td>...</td>\n",448 " <td>0.0</td>\n",449 " <td>0.0</td>\n",450 " <td>1.0</td>\n",451 " <td>0.0</td>\n",452 " <td>0.0</td>\n",453 " <td>1.0</td>\n",454 " <td>0.0</td>\n",455 " <td>1.0</td>\n",456 " <td>0.0</td>\n",457 " <td>0</td>\n",458 " </tr>\n",459 " <tr>\n",460 " <th>1</th>\n",461 " <td>67.0</td>\n",462 " <td>160.0</td>\n",463 " <td>286.0</td>\n",464 " <td>108.0</td>\n",465 " <td>1.5</td>\n",466 " <td>3.0</td>\n",467 " <td>1.0</td>\n",468 " <td>0</td>\n",469 " <td>1</td>\n",470 " <td>0.0</td>\n",471 " <td>...</td>\n",472 " <td>0.0</td>\n",473 " <td>0.0</td>\n",474 " <td>1.0</td>\n",475 " <td>0.0</td>\n",476 " <td>1.0</td>\n",477 " <td>0.0</td>\n",478 " <td>1.0</td>\n",479 " <td>0.0</td>\n",480 " <td>0.0</td>\n",481 " <td>1</td>\n",482 " </tr>\n",483 " <tr>\n",484 " <th>2</th>\n",485 " <td>67.0</td>\n",486 " <td>120.0</td>\n",487 " <td>229.0</td>\n",488 " <td>129.0</td>\n",489 " <td>2.6</td>\n",490 " <td>2.0</td>\n",491 " <td>1.0</td>\n",492 " <td>0</td>\n",493 " <td>1</td>\n",494 " <td>0.0</td>\n",495 " <td>...</td>\n",496 " <td>0.0</td>\n",497 " <td>0.0</td>\n",498 " <td>1.0</td>\n",499 " <td>0.0</td>\n",500 " <td>1.0</td>\n",501 " <td>0.0</td>\n",502 " <td>0.0</td>\n",503 " <td>0.0</td>\n",504 " <td>1.0</td>\n",505 " <td>1</td>\n",506 " </tr>\n",507 " <tr>\n",508 " <th>3</th>\n",509 " <td>37.0</td>\n",510 " <td>130.0</td>\n",511 " <td>250.0</td>\n",512 " <td>187.0</td>\n",513 " <td>3.5</td>\n",514 " <td>0.0</td>\n",515 " <td>1.0</td>\n",516 " <td>0</td>\n",517 " <td>0</td>\n",518 " <td>0.0</td>\n",519 " <td>...</td>\n",520 " <td>1.0</td>\n",521 " <td>0.0</td>\n",522 " <td>0.0</td>\n",523 " <td>0.0</td>\n",524 " <td>0.0</td>\n",525 " <td>1.0</td>\n",526 " <td>1.0</td>\n",527 " <td>0.0</td>\n",528 " <td>0.0</td>\n",529 " <td>0</td>\n",530 " </tr>\n",531 " <tr>\n",532 " <th>4</th>\n",533 " <td>41.0</td>\n",534 " <td>130.0</td>\n",535 " <td>204.0</td>\n",536 " <td>172.0</td>\n",537 " <td>1.4</td>\n",538 " <td>0.0</td>\n",539 " <td>0.0</td>\n",540 " <td>0</td>\n",541 " <td>0</td>\n",542 " <td>0.0</td>\n",543 " <td>...</td>\n",544 " <td>0.0</td>\n",545 " <td>0.0</td>\n",546 " <td>1.0</td>\n",547 " <td>1.0</td>\n",548 " <td>0.0</td>\n",549 " <td>0.0</td>\n",550 " <td>1.0</td>\n",551 " <td>0.0</td>\n",552 " <td>0.0</td>\n",553 " <td>0</td>\n",554 " </tr>\n",555 " </tbody>\n",556 "</table>\n",557 "<p>5 rows × 23 columns</p>\n",558 "</div>"559 ],560 "text/plain": [561 " age trestbps chol thalach oldpeak ca sex fbs exang cp_1.0 ... \\\n",562 "0 63.0 145.0 233.0 150.0 2.3 0.0 1.0 1 0 1.0 ... \n",563 "1 67.0 160.0 286.0 108.0 1.5 3.0 1.0 0 1 0.0 ... \n",564 "2 67.0 120.0 229.0 129.0 2.6 2.0 1.0 0 1 0.0 ... \n",565 "3 37.0 130.0 250.0 187.0 3.5 0.0 1.0 0 0 0.0 ... \n",566 "4 41.0 130.0 204.0 172.0 1.4 0.0 0.0 0 0 0.0 ... \n",567 "\n",568 " restecg_0 restecg_1 restecg_2 slope_1 slope_2 slope_3 thal_3.0 \\\n",569 "0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 \n",570 "1 0.0 0.0 1.0 0.0 1.0 0.0 1.0 \n",571 "2 0.0 0.0 1.0 0.0 1.0 0.0 0.0 \n",572 "3 1.0 0.0 0.0 0.0 0.0 1.0 1.0 \n",573 "4 0.0 0.0 1.0 1.0 0.0 0.0 1.0 \n",574 "\n",575 " thal_6.0 thal_7.0 num \n",576 "0 1.0 0.0 0 \n",577 "1 0.0 0.0 1 \n",578 "2 0.0 1.0 1 \n",579 "3 0.0 0.0 0 \n",580 "4 0.0 0.0 0 \n",581 "\n",582 "[5 rows x 23 columns]"583 ]584 },585 "execution_count": 23,586 "metadata": {},587 "output_type": "execute_result"588 }589 ],590 "source": [591 "print(data_hd.shape)\n",592 "data_hd.head()"593 ]594 },595 {596 "cell_type": "code",597 "execution_count": 24,598 "metadata": {599 "colab": {600 "base_uri": "https://localhost:8080/"601 },602 "id": "LJWVXyIwVQ2Q",603 "outputId": "72b73b8f-5709-495a-9f81-d4f9926700a5"604 },605 "outputs": [606 {607 "data": {608 "text/plain": [609 "Index(['age', 'trestbps', 'chol', 'thalach', 'oldpeak', 'ca', 'sex', 'fbs',\n",610 " 'exang', 'cp_1.0', 'cp_2.0', 'cp_3.0', 'cp_4.0', 'restecg_0',\n",611 " 'restecg_1', 'restecg_2', 'slope_1', 'slope_2', 'slope_3', 'thal_3.0',\n",612 " 'thal_6.0', 'thal_7.0', 'num'],\n",613 " dtype='object')"614 ]615 },616 "execution_count": 24,617 "metadata": {},618 "output_type": "execute_result"619 }620 ],621 "source": [622 "data_hd.columns"623 ]624 },625 {626 "cell_type": "code",627 "execution_count": 25,628 "metadata": {629 "colab": {630 "base_uri": "https://localhost:8080/",631 "height": 443632 },633 "id": "cbByJdLxkSls",634 "outputId": "48b3ba1d-8b66-4393-9400-1068e51e780f"635 },636 "outputs": [637 {638 "data": {639 "text/html": [640 "<div>\n",641 "<style scoped>\n",642 " .dataframe tbody tr th:only-of-type {\n",643 " vertical-align: middle;\n",644 " }\n",645 "\n",646 " .dataframe tbody tr th {\n",647 " vertical-align: top;\n",648 " }\n",649 "\n",650 " .dataframe thead th {\n",651 " text-align: right;\n",652 " }\n",653 "</style>\n",654 "<table border=\"1\" class=\"dataframe\">\n",655 " <thead>\n",656 " <tr style=\"text-align: right;\">\n",657 " <th></th>\n",658 " <th>age</th>\n",659 " <th>trestbps</th>\n",660 " <th>chol</th>\n",661 " <th>thalach</th>\n",662 " <th>oldpeak</th>\n",663 " <th>ca</th>\n",664 " <th>sex</th>\n",665 " <th>fbs</th>\n",666 " <th>exang</th>\n",667 " <th>cp_1.0</th>\n",668 " <th>...</th>\n",669 " <th>cp_4.0</th>\n",670 " <th>restecg_0</th>\n",671 " <th>restecg_1</th>\n",672 " <th>restecg_2</th>\n",673 " <th>slope_1</th>\n",674 " <th>slope_2</th>\n",675 " <th>slope_3</th>\n",676 " <th>thal_3.0</th>\n",677 " <th>thal_6.0</th>\n",678 " <th>thal_7.0</th>\n",679 " </tr>\n",680 " </thead>\n",681 " <tbody>\n",682 " <tr>\n",683 " <th>0</th>\n",684 " <td>63.0</td>\n",685 " <td>145.0</td>\n",686 " <td>233.0</td>\n",687 " <td>150.0</td>\n",688 " <td>2.3</td>\n",689 " <td>0.0</td>\n",690 " <td>1.0</td>\n",691 " <td>1</td>\n",692 " <td>0</td>\n",693 " <td>1.0</td>\n",694 " <td>...</td>\n",695 " <td>0.0</td>\n",696 " <td>0.0</td>\n",697 " <td>0.0</td>\n",698 " <td>1.0</td>\n",699 " <td>0.0</td>\n",700 " <td>0.0</td>\n",701 " <td>1.0</td>\n",702 " <td>0.0</td>\n",703 " <td>1.0</td>\n",704 " <td>0.0</td>\n",705 " </tr>\n",706 " <tr>\n",707 " <th>1</th>\n",708 " <td>67.0</td>\n",709 " <td>160.0</td>\n",710 " <td>286.0</td>\n",711 " <td>108.0</td>\n",712 " <td>1.5</td>\n",713 " <td>3.0</td>\n",714 " <td>1.0</td>\n",715 " <td>0</td>\n",716 " <td>1</td>\n",717 " <td>0.0</td>\n",718 " <td>...</td>\n",719 " <td>1.0</td>\n",720 " <td>0.0</td>\n",721 " <td>0.0</td>\n",722 " <td>1.0</td>\n",723 " <td>0.0</td>\n",724 " <td>1.0</td>\n",725 " <td>0.0</td>\n",726 " <td>1.0</td>\n",727 " <td>0.0</td>\n",728 " <td>0.0</td>\n",729 " </tr>\n",730 " <tr>\n",731 " <th>2</th>\n",732 " <td>67.0</td>\n",733 " <td>120.0</td>\n",734 " <td>229.0</td>\n",735 " <td>129.0</td>\n",736 " <td>2.6</td>\n",737 " <td>2.0</td>\n",738 " <td>1.0</td>\n",739 " <td>0</td>\n",740 " <td>1</td>\n",741 " <td>0.0</td>\n",742 " <td>...</td>\n",743 " <td>1.0</td>\n",744 " <td>0.0</td>\n",745 " <td>0.0</td>\n",746 " <td>1.0</td>\n",747 " <td>0.0</td>\n",748 " <td>1.0</td>\n",749 " <td>0.0</td>\n",750 " <td>0.0</td>\n",751 " <td>0.0</td>\n",752 " <td>1.0</td>\n",753 " </tr>\n",754 " <tr>\n",755 " <th>3</th>\n",756 " <td>37.0</td>\n",757 " <td>130.0</td>\n",758 " <td>250.0</td>\n",759 " <td>187.0</td>\n",760 " <td>3.5</td>\n",761 " <td>0.0</td>\n",762 " <td>1.0</td>\n",763 " <td>0</td>\n",764 " <td>0</td>\n",765 " <td>0.0</td>\n",766 " <td>...</td>\n",767 " <td>0.0</td>\n",768 " <td>1.0</td>\n",769 " <td>0.0</td>\n",770 " <td>0.0</td>\n",771 " <td>0.0</td>\n",772 " <td>0.0</td>\n",773 " <td>1.0</td>\n",774 " <td>1.0</td>\n",775 " <td>0.0</td>\n",776 " <td>0.0</td>\n",777 " </tr>\n",778 " <tr>\n",779 " <th>4</th>\n",780 " <td>41.0</td>\n",781 " <td>130.0</td>\n",782 " <td>204.0</td>\n",783 " <td>172.0</td>\n",784 " <td>1.4</td>\n",785 " <td>0.0</td>\n",786 " <td>0.0</td>\n",787 " <td>0</td>\n",788 " <td>0</td>\n",789 " <td>0.0</td>\n",790 " <td>...</td>\n",791 " <td>0.0</td>\n",792 " <td>0.0</td>\n",793 " <td>0.0</td>\n",794 " <td>1.0</td>\n",795 " <td>1.0</td>\n",796 " <td>0.0</td>\n",797 " <td>0.0</td>\n",798 " <td>1.0</td>\n",799 " <td>0.0</td>\n",800 " <td>0.0</td>\n",801 " </tr>\n",802 " <tr>\n",803 " <th>...</th>\n",804 " <td>...</td>\n",805 " <td>...</td>\n",806 " <td>...</td>\n",807 " <td>...</td>\n",808 " <td>...</td>\n",809 " <td>...</td>\n",810 " <td>...</td>\n",811 " <td>...</td>\n",812 " <td>...</td>\n",813 " <td>...</td>\n",814 " <td>...</td>\n",815 " <td>...</td>\n",816 " <td>...</td>\n",817 " <td>...</td>\n",818 " <td>...</td>\n",819 " <td>...</td>\n",820 " <td>...</td>\n",821 " <td>...</td>\n",822 " <td>...</td>\n",823 " <td>...</td>\n",824 " <td>...</td>\n",825 " </tr>\n",826 " <tr>\n",827 " <th>915</th>\n",828 " <td>54.0</td>\n",829 " <td>127.0</td>\n",830 " <td>333.0</td>\n",831 " <td>154.0</td>\n",832 " <td>0.0</td>\n",833 " <td>0.0</td>\n",834 " <td>0.0</td>\n",835 " <td>1</td>\n",836 " <td>0</td>\n",837 " <td>0.0</td>\n",838 " <td>...</td>\n",839 " <td>1.0</td>\n",840 " <td>0.0</td>\n",841 " <td>1.0</td>\n",842 " <td>0.0</td>\n",843 " <td>0.0</td>\n",844 " <td>1.0</td>\n",845 " <td>0.0</td>\n",846 " <td>1.0</td>\n",847 " <td>0.0</td>\n",848 " <td>0.0</td>\n",849 " </tr>\n",850 " <tr>\n",851 " <th>916</th>\n",852 " <td>62.0</td>\n",853 " <td>130.0</td>\n",854 " <td>139.0</td>\n",855 " <td>140.0</td>\n",856 " <td>0.5</td>\n",857 " <td>0.0</td>\n",858 " <td>1.0</td>\n",859 " <td>0</td>\n",860 " <td>0</td>\n",861 " <td>1.0</td>\n",862 " <td>...</td>\n",863 " <td>0.0</td>\n",864 " <td>0.0</td>\n",865 " <td>1.0</td>\n",866 " <td>0.0</td>\n",867 " <td>0.0</td>\n",868 " <td>1.0</td>\n",869 " <td>0.0</td>\n",870 " <td>1.0</td>\n",871 " <td>0.0</td>\n",872 " <td>0.0</td>\n",873 " </tr>\n",874 " <tr>\n",875 " <th>917</th>\n",876 " <td>55.0</td>\n",877 " <td>122.0</td>\n",878 " <td>223.0</td>\n",879 " <td>100.0</td>\n",880 " <td>0.0</td>\n",881 " <td>0.0</td>\n",882 " <td>1.0</td>\n",883 " <td>1</td>\n",884 " <td>0</td>\n",885 " <td>0.0</td>\n",886 " <td>...</td>\n",887 " <td>1.0</td>\n",888 " <td>0.0</td>\n",889 " <td>1.0</td>\n",890 " <td>0.0</td>\n",891 " <td>0.0</td>\n",892 " <td>1.0</td>\n",893 " <td>0.0</td>\n",894 " <td>0.0</td>\n",895 " <td>1.0</td>\n",896 " <td>0.0</td>\n",897 " </tr>\n",898 " <tr>\n",899 " <th>918</th>\n",900 " <td>58.0</td>\n",901 " <td>130.0</td>\n",902 " <td>385.0</td>\n",903 " <td>140.0</td>\n",904 " <td>0.5</td>\n",905 " <td>0.0</td>\n",906 " <td>1.0</td>\n",907 " <td>1</td>\n",908 " <td>0</td>\n",909 " <td>0.0</td>\n",910 " <td>...</td>\n",911 " <td>1.0</td>\n",912 " <td>0.0</td>\n",913 " <td>0.0</td>\n",914 " <td>1.0</td>\n",915 " <td>0.0</td>\n",916 " <td>1.0</td>\n",917 " <td>0.0</td>\n",918 " <td>1.0</td>\n",919 " <td>0.0</td>\n",920 " <td>0.0</td>\n",921 " </tr>\n",922 " <tr>\n",923 " <th>919</th>\n",924 " <td>62.0</td>\n",925 " <td>120.0</td>\n",926 " <td>254.0</td>\n",927 " <td>93.0</td>\n",928 " <td>0.0</td>\n",929 " <td>0.0</td>\n",930 " <td>1.0</td>\n",931 " <td>0</td>\n",932 " <td>1</td>\n",933 " <td>0.0</td>\n",934 " <td>...</td>\n",935 " <td>0.0</td>\n",936 " <td>0.0</td>\n",937 " <td>0.0</td>\n",938 " <td>1.0</td>\n",939 " <td>0.0</td>\n",940 " <td>1.0</td>\n",941 " <td>0.0</td>\n",942 " <td>1.0</td>\n",943 " <td>0.0</td>\n",944 " <td>0.0</td>\n",945 " </tr>\n",946 " </tbody>\n",947 "</table>\n",948 "<p>920 rows × 22 columns</p>\n",949 "</div>"950 ],951 "text/plain": [952 " age trestbps chol thalach oldpeak ca sex fbs exang cp_1.0 \\\n",953 "0 63.0 145.0 233.0 150.0 2.3 0.0 1.0 1 0 1.0 \n",954 "1 67.0 160.0 286.0 108.0 1.5 3.0 1.0 0 1 0.0 \n",955 "2 67.0 120.0 229.0 129.0 2.6 2.0 1.0 0 1 0.0 \n",956 "3 37.0 130.0 250.0 187.0 3.5 0.0 1.0 0 0 0.0 \n",957 "4 41.0 130.0 204.0 172.0 1.4 0.0 0.0 0 0 0.0 \n",958 ".. ... ... ... ... ... ... ... ... ... ... \n",959 "915 54.0 127.0 333.0 154.0 0.0 0.0 0.0 1 0 0.0 \n",960 "916 62.0 130.0 139.0 140.0 0.5 0.0 1.0 0 0 1.0 \n",961 "917 55.0 122.0 223.0 100.0 0.0 0.0 1.0 1 0 0.0 \n",962 "918 58.0 130.0 385.0 140.0 0.5 0.0 1.0 1 0 0.0 \n",963 "919 62.0 120.0 254.0 93.0 0.0 0.0 1.0 0 1 0.0 \n",964 "\n",965 " ... cp_4.0 restecg_0 restecg_1 restecg_2 slope_1 slope_2 slope_3 \\\n",966 "0 ... 0.0 0.0 0.0 1.0 0.0 0.0 1.0 \n",967 "1 ... 1.0 0.0 0.0 1.0 0.0 1.0 0.0 \n",968 "2 ... 1.0 0.0 0.0 1.0 0.0 1.0 0.0 \n",969 "3 ... 0.0 1.0 0.0 0.0 0.0 0.0 1.0 \n",970 "4 ... 0.0 0.0 0.0 1.0 1.0 0.0 0.0 \n",971 ".. ... ... ... ... ... ... ... ... \n",972 "915 ... 1.0 0.0 1.0 0.0 0.0 1.0 0.0 \n",973 "916 ... 0.0 0.0 1.0 0.0 0.0 1.0 0.0 \n",974 "917 ... 1.0 0.0 1.0 0.0 0.0 1.0 0.0 \n",975 "918 ... 1.0 0.0 0.0 1.0 0.0 1.0 0.0 \n",976 "919 ... 0.0 0.0 0.0 1.0 0.0 1.0 0.0 \n",977 "\n",978 " thal_3.0 thal_6.0 thal_7.0 \n",979 "0 0.0 1.0 0.0 \n",980 "1 1.0 0.0 0.0 \n",981 "2 0.0 0.0 1.0 \n",982 "3 1.0 0.0 0.0 \n",983 "4 1.0 0.0 0.0 \n",984 ".. ... ... ... \n",985 "915 1.0 0.0 0.0 \n",986 "916 1.0 0.0 0.0 \n",987 "917 0.0 1.0 0.0 \n",988 "918 1.0 0.0 0.0 \n",989 "919 1.0 0.0 0.0 \n",990 "\n",991 "[920 rows x 22 columns]"992 ]993 },994 "execution_count": 25,995 "metadata": {},996 "output_type": "execute_result"997 }998 ],999 "source": [1000 "data_hd.iloc[:, :-1]"1001 ]1002 },1003 {1004 "cell_type": "code",1005 "execution_count": 26,1006 "metadata": {1007 "colab": {1008 "base_uri": "https://localhost:8080/",1009 "height": 801010 },1011 "id": "c7JNfRKoVQz4",1012 "outputId": "3d8e474f-eb2a-44ac-e958-5a9afc5f041f"1013 },1014 "outputs": [1015 {1016 "data": {1017 "text/html": [1018 "<div>\n",1019 "<style scoped>\n",1020 " .dataframe tbody tr th:only-of-type {\n",1021 " vertical-align: middle;\n",1022 " }\n",1023 "\n",1024 " .dataframe tbody tr th {\n",1025 " vertical-align: top;\n",1026 " }\n",1027 "\n",1028 " .dataframe thead th {\n",1029 " text-align: right;\n",1030 " }\n",1031 "</style>\n",1032 "<table border=\"1\" class=\"dataframe\">\n",1033 " <thead>\n",1034 " <tr style=\"text-align: right;\">\n",1035 " <th></th>\n",1036 " <th>Classifier</th>\n",1037 " <th>Accuracy</th>\n",1038 " </tr>\n",1039 " </thead>\n",1040 " <tbody>\n",1041 " <tr>\n",1042 " <th>0</th>\n",1043 " <td>DecisionTree</td>\n",1044 " <td>0.717391</td>\n",1045 " </tr>\n",1046 " </tbody>\n",1047 "</table>\n",1048 "</div>"1049 ],1050 "text/plain": [1051 " Classifier Accuracy\n",1052 "0 DecisionTree 0.717391"1053 ]1054 },1055 "execution_count": 26,1056 "metadata": {},1057 "output_type": "execute_result"1058 }1059 ],1060 "source": [1061 "score1 = acc_score(data_hd.iloc[:, :-1], data_hd['num'])\n",1062 "score1"1063 ]1064 },1065 {1066 "cell_type": "code",1067 "execution_count": 34,1068 "metadata": {1069 "colab": {1070 "base_uri": "https://localhost:8080/"1071 },1072 "id": "DdSzy-GbX0ER",1073 "outputId": "a98e5841-1d78-4f19-8052-928ba716f992"1074 },1075 "outputs": [1076 {1077 "name": "stdout",1078 "output_type": "stream",1079 "text": [1080 "(690, 22) (230, 22) (690,) (230,)\n",1081 "Best score in generation 1 : [0.8]\n",1082 "Best score in generation 2 : [0.808695652173913]\n",1083 "Best score in generation 3 : [0.8130434782608695]\n",1084 "Best score in generation 4 : [0.8217391304347826]\n",1085 "Best score in generation 5 : [0.8217391304347826]\n"1086 ]1087 }1088 ],1089 "source": [1090 "X_train, X_test, Y_train, Y_test = split(data_hd.iloc[:, :-1], data_hd['num'])\n",1091 "print(X_train.shape, X_test.shape, Y_train.shape, Y_test.shape)\n",1092 "chromo_df, score, best_models = generations(data_hd.iloc[:, :-1],\n",1093 " data_hd['num'],\n",1094 " size=96,\n",1095 " n_feat = data_hd.iloc[:, :-1].shape[1],\n",1096 " n_parents=64,\n",1097 " mutation_rate=0.20,\n",1098 " n_gen=5,\n",1099 " X_train = X_train,\n",1100 " X_test = X_test,\n",1101 " Y_train = Y_train,\n",1102 " Y_test = Y_test)"1103 ]1104 },1105 {1106 "cell_type": "code",1107 "execution_count": 35,1108 "metadata": {1109 "colab": {1110 "base_uri": "https://localhost:8080/",1111 "height": 3881112 },1113 "id": "I5rtmJGvX14N",1114 "outputId": "d97250f0-9eed-4cce-dfb0-3a929c47ac34"1115 },1116 "outputs": [1117 {1118 "data": {1119 "image/png": "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n0ycOJHg4OAGt/nxF/7NN99MQUEBH3zwAZmZmVx22WVcc801HDlypG7bffv2sXr1at577z3ee+89NmzYwJNPPll3f1paGn/5y1948cUX+eabb5g2bRq/+c1v2LBhg9NrTp8+nSeffJJdu3bRo0cPysrKGDp0KOvWreOLL77g+uuvJyUlhaysLABWrlxJx44deeyxx8jNzSU3N7fB97Jq1SqmTJnCAw88wNdff829997L+PHj+de//uW03bx587jlllvYuXMnQ4cO5fbbb3d6nyLSCIaIyDn47LPPDMBYuXKl07xDhw5GcHCwERwcbPz+9783/v3vfxuhoaFGRUWF03bnnXee8dJLLxmGYRhz58412rRpY5SUlNTd/9BDDxlJSUmGYRhGRUWF0aZNG+M///mP03PcddddxqhRowzDMIx//etfBmCsXr36jNkvueQS44UXXqj7uXPnzsazzz7rtM2yZcuMsLCwup8HDBhg3HPPPU7b3HzzzcbQoUPrfgaMWbNm1f1cVlZmAMYHH3xwxkwi4qBzUkSkWWzduhWbzcbtt99OZWUlX375JWVlZXTo0MFpu+PHj7Nv3766nxMTEwkJCan7OTY2loKCAgD27t3LsWPHuPbaa52eo6qqit69ezvN+vbt6/RzWVkZjz76KGvXriU3N5eamhqOHz9etyelsXbt2sWECROcZgMHDuS5555zmvXo0aPun4ODgwkNDa17HyLSOCopInJOzj//fCwWC3v27HGad+3aFaDupNOysjJiY2NZv359vec4+ZwPPz8/p/ssFgs2m63uOQDWrl1LfHy803YBAQFOP//00NODDz7IRx99xDPPPMP5559PUFAQN910E1VVVY18p6453fsQkcZRSRGRc9KhQweuvfZaFi1axOTJk095Xspll11GXl4evr6+JCYmntVrXXzxxQQEBJCVlcUvfvELlx776aefMm7cOEaMGAHYC8/333/vtI2/vz+1tbWnfZ6LLrqITz/9lLFjxzo998UXX+xSHhE5M5UUETlnS5YsYeDAgfTt25dHH32UHj16YLVa+fzzz9m9ezd9+vQhOTmZ/v37M3z4cJ566il+9rOfkZOTw9q1axkxYkS9wzMNCQkJ4cEHH2TatGnYbDYGDRpEcXExn376KaGhoU7F4acuuOACVq5cSUpKChaLhdmzZ9fbs5GYmMjGjRu57bbbCAgIICIiot7zPPTQQ9xyyy307t2b5ORk3n33XVauXOm0UkhEmoZKioics/POO48vvviCBQsWMGPGDA4ePEhAQAAXX3wxDz74IL/73e+wWCy8//77PPLII4wfP55Dhw4RExPDlVdeSXR0dKNfa/78+URGRpKWlsb+/ftp164dl112GTNnzjzt4xYuXMidd97JgAEDiIiI4OGHH6akpMRpm8cee4x7772X8847j8rKSgzDqPc8w4cP57nnnuOZZ55hypQpdOnShWXLlnHVVVc1+j2ISONYjIb+FIqIiIiYTNdJEREREbekkiIiIiJuSSVFRERE3JJKioiIiLgllRQRERFxSyopIiIi4pZUUkRERMQtqaSIiIiIW1JJEREREbekkiIiIiJuSSVFRERE3JJKioiIiLil/wdauKD/OF62IwAAAABJRU5ErkJggg==",1120 "text/plain": [1121 "<Figure size 600x400 with 1 Axes>"1122 ]1123 },1124 "metadata": {},1125 "output_type": "display_data"1126 }1127 ],1128 "source": [1129 "plot(score, 0.9, 1.0,c = \"gold\")"1130 ]1131 },1132 {1133 "cell_type": "code",1134 "execution_count": 36,1135 "metadata": {1136 "id": "HQrzrFeuz0yG"1137 },1138 "outputs": [],1139 "source": [1140 "for index, clf in enumerate(best_models):\n",1141 " dump(clf, 'model-{}.joblib'.format(index))"1142 ]1143 },1144 {1145 "cell_type": "code",1146 "execution_count": 37,1147 "metadata": {1148 "id": "fGbUe1WJYbxp"1149 },1150 "outputs": [],1151 "source": [1152 "clf = load('model-3.joblib')"1153 ]1154 },1155 {1156 "cell_type": "code",1157 "execution_count": 38,1158 "metadata": {1159 "colab": {1160 "base_uri": "https://localhost:8080/",1161 "height": 4231162 },1163 "id": "bA8Qf-orbDnu",1164 "outputId": "409bf4c6-5668-4f58-ff16-5f597771fb28"1165 },1166 "outputs": [1167 {1168 "data": {1169 "text/html": [1170 "<div>\n",1171 "<style scoped>\n",1172 " .dataframe tbody tr th:only-of-type {\n",1173 " vertical-align: middle;\n",1174 " }\n",1175 "\n",1176 " .dataframe tbody tr th {\n",1177 " vertical-align: top;\n",1178 " }\n",1179 "\n",1180 " .dataframe thead th {\n",1181 " text-align: right;\n",1182 " }\n",1183 "</style>\n",1184 "<table border=\"1\" class=\"dataframe\">\n",1185 " <thead>\n",1186 " <tr style=\"text-align: right;\">\n",1187 " <th></th>\n",1188 " <th>sex</th>\n",1189 " <th>exang</th>\n",1190 " <th>cp_1.0</th>\n",1191 " <th>cp_2.0</th>\n",1192 " <th>cp_3.0</th>\n",1193 " <th>cp_4.0</th>\n",1194 " <th>restecg_1</th>\n",1195 " <th>slope_1</th>\n",1196 " <th>slope_2</th>\n",1197 " <th>thal_3.0</th>\n",1198 " <th>thal_6.0</th>\n",1199 " <th>thal_7.0</th>\n",1200 " </tr>\n",