Skip to content

Instantly share code, notes, and snippets.

@veb-101
Created April 17, 2020 21:52
Show Gist options
  • Save veb-101/d747d5841eba9ae9fe51ff9bacddfa42 to your computer and use it in GitHub Desktop.
Save veb-101/d747d5841eba9ae9fe51ff9bacddfa42 to your computer and use it in GitHub Desktop.
Feature Selection.ipynb
Display the source blob
Display the rendered blob
Raw
{
"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.6"
},
"toc": {
"base_numbering": 1,
"nav_menu": {},
"number_sections": true,
"sideBar": true,
"skip_h1_title": false,
"title_cell": "Table of Contents",
"title_sidebar": "Contents",
"toc_cell": false,
"toc_position": {},
"toc_section_display": true,
"toc_window_display": false
},
"varInspector": {
"cols": {
"lenName": 16,
"lenType": 16,
"lenVar": 40
},
"kernels_config": {
"python": {
"delete_cmd_postfix": "",
"delete_cmd_prefix": "del ",
"library": "var_list.py",
"varRefreshCmd": "print(var_dic_list())"
},
"r": {
"delete_cmd_postfix": ") ",
"delete_cmd_prefix": "rm(",
"library": "var_list.r",
"varRefreshCmd": "cat(var_dic_list()) "
}
},
"types_to_exclude": [
"module",
"function",
"builtin_function_or_method",
"instance",
"_Feature"
],
"window_display": false
},
"colab": {
"name": "Feature Selection.ipynb",
"provenance": [],
"collapsed_sections": [],
"include_colab_link": true
}
},
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "view-in-github",
"colab_type": "text"
},
"source": [
"<a href=\"https://colab.research.google.com/gist/veb-101/d747d5841eba9ae9fe51ff9bacddfa42/feature-selection.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
]
},
{
"cell_type": "code",
"metadata": {
"id": "hx-k-wxEmaNx",
"colab_type": "code",
"colab": {}
},
"source": [
"import pandas as pd\n",
"import numpy as np\n",
"from numpy import set_printoptions\n",
"from sklearn.feature_selection import SelectKBest\n",
"from sklearn.feature_selection import f_classif, chi2\n",
"from sklearn.model_selection import train_test_split\n",
"from sklearn.metrics import accuracy_score as acc\n",
"from sklearn.linear_model import LogisticRegression\n",
"\n",
"import warnings\n",
"warnings.filterwarnings(\"ignore\")\n",
"import seaborn as sns\n",
"import matplotlib.pyplot as plt"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"ExecuteTime": {
"end_time": "2020-04-17T17:58:44.074634Z",
"start_time": "2020-04-17T17:58:44.066536Z"
},
"id": "8XG3q6sGlhJW",
"colab_type": "text"
},
"source": [
"# Filter based methods"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "_-4K9Al4-MEa",
"colab_type": "text"
},
"source": [
"## Feature Selection with Univariate Statistical Tests"
]
},
{
"cell_type": "code",
"metadata": {
"id": "p0hLX9hDmaQb",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 196
},
"outputId": "1a77cb07-f90f-4827-89b7-3f42803b4c8f"
},
"source": [
"# Feature Selection with Univariate Statistical Tests\n",
"\n",
"# load data\n",
"filename = '/content/diabetes_data.csv'\n",
"names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']\n",
"\n",
"dataframe = pd.read_csv(filename, skiprows=1, names=names)\n",
"dataframe.head()"
],
"execution_count": 2,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>preg</th>\n",
" <th>plas</th>\n",
" <th>pres</th>\n",
" <th>skin</th>\n",
" <th>test</th>\n",
" <th>mass</th>\n",
" <th>pedi</th>\n",
" <th>age</th>\n",
" <th>class</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>6</td>\n",
" <td>148</td>\n",
" <td>72</td>\n",
" <td>35</td>\n",
" <td>0</td>\n",
" <td>33.6</td>\n",
" <td>0.627</td>\n",
" <td>50</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1</td>\n",
" <td>85</td>\n",
" <td>66</td>\n",
" <td>29</td>\n",
" <td>0</td>\n",
" <td>26.6</td>\n",
" <td>0.351</td>\n",
" <td>31</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>8</td>\n",
" <td>183</td>\n",
" <td>64</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>23.3</td>\n",
" <td>0.672</td>\n",
" <td>32</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>1</td>\n",
" <td>89</td>\n",
" <td>66</td>\n",
" <td>23</td>\n",
" <td>94</td>\n",
" <td>28.1</td>\n",
" <td>0.167</td>\n",
" <td>21</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>0</td>\n",
" <td>137</td>\n",
" <td>40</td>\n",
" <td>35</td>\n",
" <td>168</td>\n",
" <td>43.1</td>\n",
" <td>2.288</td>\n",
" <td>33</td>\n",
" <td>1</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" preg plas pres skin test mass pedi age class\n",
"0 6 148 72 35 0 33.6 0.627 50 1\n",
"1 1 85 66 29 0 26.6 0.351 31 0\n",
"2 8 183 64 0 0 23.3 0.672 32 1\n",
"3 1 89 66 23 94 28.1 0.167 21 0\n",
"4 0 137 40 35 168 43.1 2.288 33 1"
]
},
"metadata": {
"tags": []
},
"execution_count": 2
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "WpYnRpv8maTL",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 33
},
"outputId": "1772be25-10a6-41f9-dc69-4119aabfa60f"
},
"source": [
"array = dataframe.values\n",
"X = array[:,0:8]\n",
"Y = array[:,8]\n",
"\n",
"# feature extraction using SelectKBest\n",
"\n",
"# selecting the best 5 features based in f_classif criteria\n",
"test = SelectKBest(score_func=chi2, k=6)\n",
"feature_set = test.fit(X, Y)\n",
"\n",
"# summarize scores\n",
"np.set_printoptions(precision=3)\n",
"print(feature_set.scores_)\n",
"\n",
"# new X based on 5 best features\n",
"X_new = feature_set.transform(X)"
],
"execution_count": 3,
"outputs": [
{
"output_type": "stream",
"text": [
"[ 111.52 1411.887 17.605 53.108 2175.565 127.669 5.393 181.304]\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "plbDaZHWmaWt",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 50
},
"outputId": "b10e941c-09ac-4eb8-f161-de03bad88cae"
},
"source": [
"# untransformed\n",
"X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.2, stratify=Y, random_state=42)\n",
"\n",
"lr = LogisticRegression()\n",
"lr.fit(X_train, y_train)\n",
"y_pred = lr.predict(X_test)\n",
"print(f\"Whole Acc: {acc(y_test, y_pred)}\")\n",
"\n",
"# using transformed X for prediction\n",
"\n",
"X_train_trans, X_test_trans, y_train, y_test = train_test_split(X_new, Y, test_size=0.2, stratify=Y, random_state=42)\n",
"\n",
"lr = LogisticRegression()\n",
"lr.fit(X_train_trans, y_train)\n",
"y_pred = lr.predict(X_test_trans)\n",
"print(f\"Transformed Acc: {acc(y_test, y_pred)}\")"
],
"execution_count": 4,
"outputs": [
{
"output_type": "stream",
"text": [
"Whole Acc: 0.7142857142857143\n",
"Transformed Acc: 0.7077922077922078\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "5eStirSe_SK6",
"colab_type": "text"
},
"source": [
"# Wrapper Method"
]
},
{
"cell_type": "code",
"metadata": {
"id": "OCkkEsyJ_U6i",
"colab_type": "code",
"colab": {}
},
"source": [
"# load data\n",
"filename = '/content/diabetes_data.csv'\n",
"names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']\n",
"\n",
"dataframe = pd.read_csv(filename, skiprows=1, names=names)\n",
"\n",
"X = dataframe[dataframe.columns[:-1]]\n",
"Y = dataframe[dataframe.columns[-1]]\n",
"X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.2, stratify=Y, random_state=42)"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "0TrwwU2n_U8s",
"colab_type": "code",
"colab": {}
},
"source": [
"# Forward Feature Selection"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "cY-d_KsT_VBD",
"colab_type": "code",
"colab": {}
},
"source": [
"!pip install mlxtend -q"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "fXQqSTAv_VEY",
"colab_type": "code",
"colab": {}
},
"source": [
"from mlxtend.feature_selection import SequentialFeatureSelector\n",
"from sklearn.ensemble import RandomForestClassifier"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "2fKAkCiA_VPn",
"colab_type": "code",
"colab": {}
},
"source": [
"sfs = SequentialFeatureSelector(RandomForestClassifier(), \n",
" k_features=5, \n",
" forward=True, \n",
" floating=False,\n",
" scoring='accuracy',\n",
" cv=3)"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "RDa-yp0T_VTl",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 50
},
"outputId": "3608d7e7-26e9-4a23-c5c0-db1337c7e85f"
},
"source": [
"# fit the object to the training data.\n",
"sfs = sfs.fit(X_train, y_train)\n",
"\n",
"# print the selected features.\n",
"selected_features = X_train.columns[list(sfs.k_feature_idx_)]\n",
"print(selected_features)\n",
"\n",
"# print the final prediction score.\n",
"print(sfs.k_score_)\n",
"\n",
"# transform to the newly selected features.\n",
"x_train_sfs = sfs.transform(X_train)\n",
"x_test_sfs = sfs.transform(X_test)"
],
"execution_count": 10,
"outputs": [
{
"output_type": "stream",
"text": [
"Index(['preg', 'plas', 'mass', 'pedi', 'age'], dtype='object')\n",
"0.7752829587119402\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "Di7gCn5o_VW-",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 33
},
"outputId": "5f335902-aa60-4597-fbd9-7f43ba7e6f61"
},
"source": [
"rnd_clf = RandomForestClassifier()\n",
"rnd_clf.fit(x_train_sfs, y_train)\n",
"y_pred = rnd_clf.predict(x_test_sfs)\n",
"print(f\"Transformed Acc: {acc(y_test, y_pred)}\")"
],
"execution_count": 11,
"outputs": [
{
"output_type": "stream",
"text": [
"Transformed Acc: 0.7337662337662337\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "0sACnPxSBSLa",
"colab_type": "text"
},
"source": [
"# Embedded"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "Dqqu1RmoBhsl",
"colab_type": "text"
},
"source": [
"## L1- based feature selection"
]
},
{
"cell_type": "code",
"metadata": {
"id": "4IIahgWLBfEt",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 50
},
"outputId": "b8372a75-5af0-49fb-fad9-03e9e0791a66"
},
"source": [
"from sklearn.svm import LinearSVC\n",
"from sklearn.datasets import load_iris\n",
"from sklearn.feature_selection import SelectFromModel\n",
"\n",
"X, y = load_iris(return_X_y=True)\n",
"print(X.shape)\n",
"\n",
"lsvc = LinearSVC().fit(X, y)\n",
"model = SelectFromModel(lsvc, prefit=True)\n",
"X_new = model.transform(X)\n",
"print(X_new.shape)"
],
"execution_count": 12,
"outputs": [
{
"output_type": "stream",
"text": [
"(150, 4)\n",
"(150, 3)\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "RcKy0I7DBfIA",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 33
},
"outputId": "b560cce2-17d5-4f9f-918c-7327f776abf1"
},
"source": [
"X_train, X_test, y_train, y_test = train_test_split(X_new, y, test_size=0.15, stratify=y, random_state=42)\n",
"lin_svm = LinearSVC()\n",
"lin_svm.fit(X_train, y_train)\n",
"print(f\"Transformed Accuracy: {acc(y_test, lin_svm.predict(X_test))}\")"
],
"execution_count": 13,
"outputs": [
{
"output_type": "stream",
"text": [
"Transformed Accuracy: 0.9130434782608695\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "TMp99c7LDpYD",
"colab_type": "text"
},
"source": [
"# Hybrid"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "_koJ8y3ODq4L",
"colab_type": "text"
},
"source": [
"## Recursive feature elimination"
]
},
{
"cell_type": "code",
"metadata": {
"ExecuteTime": {
"end_time": "2020-04-17T18:33:03.523356Z",
"start_time": "2020-04-17T18:33:03.515292Z"
},
"id": "c0gslvTYlhJh",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 382
},
"outputId": "41ae04f8-807d-45e1-8b13-327b18c948f0"
},
"source": [
"# Feature Extraction with RFE\n",
"from sklearn.svm import SVC\n",
"from sklearn.model_selection import StratifiedKFold\n",
"from sklearn.feature_selection import RFECV\n",
"\n",
"\n",
"# load data\n",
"filename = '/content/diabetes_data.csv'\n",
"names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']\n",
"\n",
"dataframe = pd.read_csv(filename, skiprows=1, names=names)\n",
"\n",
"X = dataframe[dataframe.columns[:-1]]\n",
"Y = dataframe[dataframe.columns[-1]]\n",
"\n",
"# feature extraction\n",
"svc = SVC(kernel=\"linear\")\n",
"\n",
"rfecv = RFECV(estimator=svc, step=2, cv=StratifiedKFold(3),\n",
" scoring='accuracy')\n",
"fit = rfecv.fit(X, Y)\n",
"\n",
"print(\"Num Features: %d\" % fit.n_features_)\n",
"print(dataframe.columns)\n",
"print(\"Selected Features: %s\" % fit.support_)\n",
"print(\"Feature Ranking: %s\" % fit.ranking_)\n",
"print(\"Optimal number of features : %d\" % rfecv.n_features_)\n",
"\n",
"# Plot number of features VS. cross-validation scores\n",
"plt.figure()\n",
"plt.xlabel(\"Number of features selected\")\n",
"plt.ylabel(\"Cross validation score (nb of correct classifications)\")\n",
"plt.plot(range(1, len(fit.grid_scores_) + 1), fit.grid_scores_)\n",
"plt.show()"
],
"execution_count": 14,
"outputs": [
{
"output_type": "stream",
"text": [
"Num Features: 6\n",
"Index(['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class'], dtype='object')\n",
"Selected Features: [ True True True False False True True True]\n",
"Feature Ranking: [1 1 1 2 2 1 1 1]\n",
"Optimal number of features : 6\n"
],
"name": "stdout"
},
{
"output_type": "display_data",
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAYgAAAEaCAYAAAAL7cBuAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+j8jraAAAgAElEQVR4nO3deXwV9b3/8dc7CWHfd9kCCOIKalzYFHvdWrW21gWXq9haqr3V7vfWrmrb23vrr3bxWhAX3LVWq6XUilYFFVEBARUUS0IIAZF9X7J9fn/MRE/TQ84EMpmT5PN8PM4jZ7Yz7wxkvme2z1dmhnPOOVdbTtIBnHPOZSdvIJxzzqXlDYRzzrm0vIFwzjmXljcQzjnn0vIGwjnnXFreQDjnnEvLGwjnnHNp5UWZSVIhMB44BNgDvAs8b2ZbYszmnHMuQXUeQUi6WtJbwI1AW2A5sB4YB/xd0v2SBsYf0znnXGPLdATRDhhrZnvSTZQ0ChgGlDZ0MOecc8mS12JyzjmXTqSL1JJ+KamTpFaSXpC0QdIVcYdzzjmXnKh3MZ1pZtuBc4ES4FDgu3GFcs45l7yoDUTNtYpzgD+a2baY8jjnnMsSkW5zBWZKep/gFtfrJPUE9sYXyznnXNIiX6SW1A3YZmZVktoBncxsXazpnHPOJSbqEQTACKBAUuoyDzRwHuecc1ki6pPUDwJDgcVAVTja8AbCOeearUinmCS9Bxxh/tCEc861GFHvYnoX6BNnEOecc9kl6jWIHsAySW8C+2pGmtlnY0nlnHMucVEbiJviDOGccy771Oc2197ACeHgm2a2PrZUzjnnEhe1FtPFwJvARcDFwBuSLowzmHPOuWRFvYtpCXBGzVFD+CT1381sZMz5IuvRo4cVFBQkHcM555qUhQsXbjSznummRb0GkVPrlNImsqy70oKCAhYsWJB0DOeca1IkrdrftKgNxLOSZgGPhsOXAM8cbDDnnHPZK1IDYWbflfQFYGw4apqZPRVfLOecc0mLXIvJzJ4Enowxi3POuSxSZwMh6VUzGydpB0HtpY8nAWZmnWJN55xzLjF1NhBmNi782bFx4jjnnMsWUZ+DeDDKOOecc81H1FtVj0wdCPuEOD7TQpLOlrRc0gpJ30sz/deSFoevDyRtTZk2UNJzkt6TtExSQcSszjnnGkCmaxA3At8H2kraXjMaKAemZVg2F7gDOAMoA+ZLmmFmy2rmMbNvpsx/PXBsykc8APzczJ6X1AGojvxbOeeapL0VVcx8+0NKN+1KOkqT0qdzWy47aWCDf26maxC/AH4h6RdmdmM9P/tEYIWZFQNIegw4H1i2n/kvBX4SznsEkGdmz4c5dtZz3c65JuTDbXt46PVVPPJGKVt2VwAgJRyqCRk1oEvjNxA1zOxGSV2BYUCblPEv17FYP2B1ynAZcFK6GSUNAgYDL4ajhgNbJf0pHP934HtmVlVrucnAZICBAxt+4zjn4mNmvFW6lelzV/Lsu+uoMuOMw3tz9djBnDykG/IWInFRuxy9Bvg60J+g29GTgXnApxoox0TgiZQGIA8YT3DKqRT4AzAJuCd1ITObRniqq7Cw0Hu7c64JKK+s5pl3PmT63JUsKdtGxzZ5XD22gCtHFzCgW7uk47kUUR+U+zpBqe/Xzew0SSOA/86wzBpgQMpw/3BcOhOB/0gZLgMWp5yeepqgUbonzbLOuSZg4859PPx6KQ+9sYoNO/YxpGd7fnr+kVxwXH/at478zK5rRFH/Vfaa2V5JSGptZu9LOizDMvOBYZIGEzQME4HLas8UNjZdCY5IUpftIqmnmW0gOFLxSnzONUHvrtnG9Lkl/GXJWsqrqjl1eE+uvrCAU4b1JCfHTyNls6gNRJmkLsDTwPOStgD7rQAIYGaVkr4GzAJygXvNbKmkW4AFZjYjnHUi8Jil1B03sypJ3wFeUHAiciFwV71+M+dcYiqrqnl+2UdMn1vCmyWbaZefyyUnDOCqMQUc2qtD0vFcRJF7lPt4AelUoDPwrJmVx5LqABQWFpqX+3YuWVt3l/PY/NU8OG8Va7buoX/XtkwaU8BFhQPo3LZV0vFcGpIWmllhumlRL1KfDCw1sx1mNkdSJ4ILyG80YE7nXBP1j492MP21Ev70Vhl7K6o5eUg3fnzeEZx+eG9y/TRSkxX1FNMU4LiU4Z1pxjnnWpDqamP2B+uZPreEV/6xkfy8HD4/qh+TxhZweF+v49kcRG0gVOsaQXVYbsM518Ls2FvBEwvLuP+1Eko27aZ3p9Z896zDuPTEgXRrn590PNeAou7kiyXdQHDUAPBVoDieSM65bLRq0y7ue62EPy4oY+e+So4d2IVvnXkYnz6qD61ys6oHYtdAojYQ1wK/A35I0C/EC4RPMDvnmi8zY+6KTUyfu5IXl68nV+KcY/py9djBjBrQJel4LmZRS22sJ7gd1TnXAuwpr+KpRWu477WVfPDRTrq3z+f60w7l8pMH0btTm8wf4JqFTNVc/9PMfinpdv65RzkAzOyG2JI55xrd2q17eGDeKh6bX8rW3RUc0bcTt154DOeNPIQ2rXKTjucaWaYjiJrKq/6AgXPNlJmxYNUWps9dyaylH2FmnHVkH64eO5gTCrp60bwWLFMDcQkwE+hiZr9thDzOuUayr7KKmUs+ZPprK3l3zXY6tcnjmnGD+ffRg+jf1YvmucwNxPGSDgG+KOkBgs6CPmZmm2NL5pyLxfode3n49VIefqOUjTv3cWivDvzsc0dxwXH9aJfvd6+7T2T63zCV4I6lIQT1kFIbCAvHO+eagLfLtjJ9bgkz315LRZXxqRG9uHpsAeMO7eGnkVxamXqU+x3wO0lTzOy6RsrknGsgFVXVzFq6julzS1i4agvt83O5/KRBXDWmgME92icdz2W5THcxdTKz7cAPJHWrPd1PMTmXnbbsKufR+aU8OG8VH27by8Bu7fjRuUdwUWF/OrXxonkumkynmB4BziU4vWT4KSbnstr767Zz39wSnlq0hn2V1Yw9tDs/Pf8oThvRy4vmuXrLdIrp3PDn4MaJ45yrr6pq48X31zN97kpeK9pE67wcLjiuH5PGDOawPh2TjueasKjlvscSdAG6S9IVBFVcf2NmpbGmc87t1/a9FTw+fzUPzFtF6ebd9O3chv86ewQTTxhAVy+a5xpAfcp9j5Q0Evg2cDfwIHBqXMGcc+kVb9jJ/a+V8MTCMnaVV1E4qCv/dfYIzjqyN3leNM81oKgNRKWZmaTzgf8zs3skfSnOYM65T5gZL/9jI9PnrmT28g20yhXnHXMIV48dzNH9OycdzzVTURuIHZJuBK4ATpGUA/itEM7FbHd5JU++tYb75q6kaMMuenTI5+v/NozLTx5Ir45eNM/FK2oDcQlwGfAlM1snaSBwa3yxnGvZyrbsDormvVnK9r2VHN2vM7ddPJJzjulL6zwvmucaR+QjCOC3ZlYlaTgwAng0vljOtTxmxhsrN3Pf3BKeW7YOSZx9ZB+uHlvA8YO8aJ5rfFEbiJeB8ZK6As8B8wmOKi6PK5hzLcXeiipmLFnL9LklvPfhdrq0a8XkU4Zy5ehBHNKlbdLxXAtWnz6pd4cXpn8f9hGxJM5gzjV3H23fy0Ovr+KRN0rZtKuc4b078IsLjuZzo/rRNt9PI7nkRW4gJI0mOGKouXvJ76dz7gAsKt3C9LklPPPOh1SZ8W8jenH12MGMGdrdTyO5rBK1gfg6cCPwlJktlTQEeCm+WM41LxVV1TzzzodMn1vC4tVb6dA6jytHF3Dl6EEUeNE8l6Wi9kn9MsF1iJrhYsC7G3UugkffLOU3f/+Aj7bvo6B7O2467wguLBxAh9be94LLblFLbfQE/hM4Evj45msz+1RMuZxrFko27uIHT73DqAFd+MUFRzNheC9yvGieayKiXkd4GHgfGAzcDJQQ3MlUJ0lnS1ouaYWk76WZ/mtJi8PXB5K21preSVKZpP+LmNO5rDLtlWLycnOYesXxfGpEb28cXJMS9Ri3e1he4+tmNgeYI6nOBkJSLnAHcAZQBsyXNMPMltXMY2bfTJn/euDYWh/zU1JObTnXlKzfvpcnFpRxYWF/enXyp55d0xP1CKIi/PmhpHMkHQv8SwdCtZwIrDCzYjMrBx4Dzq9j/ktJefhO0vFAb4LnLpxrcu6dW0JldTWTx3u3Ka5pinoE8TNJnQkqud4OdAK+Wfci9ANWpwyXASelm1HSIILTVy+GwznArwhqP52+vxVImgxMBhg4cGCU38O5RrF9bwUPv76KTx/d1+9Sck1W1LuYZoZvtwGnxZBjIvCEmVWFw18FnjGzsrruCzezacA0gMLCQoshl3MH5KHXV7FjXyXXnTo06SjOHbBMfVLfTtC1aFpmVtetrmuAASnD/cNx6UwE/iNleDRBaY+vAh2AfEk7zexfLnQ7l232VlRx76sljB/Wg6P6eSlu13RlOoJYcBCfPR8YJmkwQcMwkaAi7D+RNALoCsyrGWdml6dMnwQUeuPgmoonFpaxcec+rpswKukozh2UTH1S33+gH2xmlZK+BswCcoF7w6ewbwEWmNmMcNaJwGNm5qeIXJNXWVXNtJeLGTmgC6OHdE86jnMHJeqDcs8DF5nZ1nC4K8FO/ay6ljOzZ4Bnao37ca3hmzJ8xn3AfVFyOpe0Z95dR+nm3Xz/M4d7XSXX5EW9zbVnTeMAYGZbgF7xRHKuaTIzpswuYkjP9px5RO+k4zh30KI2EFVhL3LAx7el+ikh51LM+WAD7324nWtPHepPTLtmIepzED8AXpU0BxAwnvD5A+dcYMrsIvp0asPnRvVLOopzDSLqcxDPSjoOODkc9Q0z2xhfLOealrdKt/DGys388JzDyc/zrlJc8xC53nDYIMzMOKNzLdDU2UV0btuKS0/0J/pd8+FfdZw7SCvW7+C5ZR9x1ZgC2nsfD64Z8QbCuYM0dU4xbVrlMGlMQdJRnGtQkRoISQ9GGedcS7N26x6eXrSGiScMpFv7/KTjONegoh5BHJk6EPb1cHzDx3Guabn7lZUAXDN+cMJJnGt4dTYQkm6UtAM4RtL28LUDWA/8uVESOpeltuwq59E3S/nsqEPo37Vd0nGca3B1NhBm9gsz6wjcamadwldHM+tuZjc2UkbnstL980rYU1HFtV7S2zVTUU8xvRl2GASApC6SPhdTJuey3u7ySu57rYTTD+/N8N4dk47jXCyiNhA/MbNtNQNhXaafxBPJuez32Jur2bq7gusm+NGDa76iNhDp5vMbvl2LVF5Zzd2vFHPi4G4cP6hr0nGci03UBmKBpNskDQ1ftwEL4wzmXLaasWQta7ft9aMH1+xFbSCuB8qBPwCPAXv55y5CnWsRqquNqXOKGNGnIxOG90w6jnOxilqsbxfwPUntw/fOtUh/f+8jVqzfyW8njvIOgVyzF/VJ6jGSlgHvhcMjJf0+1mTOZRkz4/ezixjQrS3nHN036TjOxS7qKaZfA2cBmwDMbAlwSlyhnMtGb6zczOLVW5l8ylDycr2MmWv+Iv8vN7PVtUZVNXAW57LalNlF9OiQz0XH9086inONImoDsVrSGMAktZL0HcLTTc61BEvXbmPOBxu4euxg2rTKTTqOc40iagNxLcFdS/2ANcAo/C4m14JMnVNMh9Z5XHHyoKSjONdoMt7FFFZu/a2ZXd4IeZzLOqs27eKvb6/ly6cMoXPbVknHca7RZDyCMLMqYJAkL3bvWqRpLxeTl5PDl8Z6SW/XskQtl1EMzJU0A/j4OQgzuy2WVM5lifU79vLHhWV84fj+9OrUJuk4zjWqqA1EUfjKAbx0pWsxps8tobKqmq+cMiTpKM41uqjXIIb7NQjX0mzfW8FD81bx6aP6UtCjfdJxnGt0sV6DkHS2pOWSVkj6Xprpv5a0OHx9IGlrOH6UpHmSlkp6W9Il9V23cwfr4ddL2bGv0jsEci1WbNcgwiOPO4AzgDJgvqQZZrYsZflvpsx/PXBsOLgbuNLM/iHpEGChpFlhPxTOxW5vRRX3vLqS8cN6cHT/zpkXcK4ZivMaxInACjMrBpD0GHA+sGw/819K2AmRmX1QM9LM1kpaD/QEvIFwjeLJt8rYuHMf1506KukoziUmajXXmwEkdQiHd0ZYrB+QWp6jDDgp3YySBgGDgRfTTDsRyCdooGpPmwxMBhg4cGCESM5lVlVtTHu5mJH9OzN6aPek4ziXmKjVXI+StAhYCiyVtFDSkQ2YYyLwRHi9I3W9fYEHgavNrLr2QmY2zcwKzaywZ0+vze8axt/e/ZBVm3Zz3YShXtLbtWhRS21MA75lZoPMbBDwbeCuDMusAQakDPcPx6UzEXg0dYSkTsBfgR+Y2esRczp3UMyMKbOLGNKzPWce0SfpOM4lKmoD0d7MXqoZMLPZQKb7/uYDwyQNDu+AmgjMqD2TpBFAV2Beyrh84CngATN7ImJG5w7aK//YyNK127n2lKHk5PjRg2vZojYQxZJ+JKkgfP2Q4M6m/TKzSuBrwCyCyq+Pm9lSSbdI+mzKrBOBx8zMUsZdTNDfxKSU22D9aqGL3ZTZRfTp1Ibzjz0k6SjOJS7qXUxfBG4G/gQY8Eo4rk5m9gzwTK1xP641fFOa5R4CHoqYzbkGsah0C/OKN/HDcw6ndZ6X9HYu6l1MW4AbYs7iXKKmzimic9tWTDzR74hzDqLfxfS8pC4pw10lzYovlnONa8X6Hcxa+hFXjR5Eh9ZRD6yda96iXoPokfoUc3hE0SueSM41vjvnFNOmVQ5XjSlIOopzWSNqA1Et6ePj7vDBNqtjfueajLVb9/D04jVMPGEg3Tu0TjqOc1kj6rH0D4BXJc0BBIwnfILZuabunldXUm1wzXjvEMi5VFEvUj8r6Tjg5HDUN8xsY3yxnGscW3aV8+ibpZw/8hD6d22XdBznskrkq3FhgzAzxizONboH5q1id3kVX/GS3s79i6jXIJxrdnaXV3Lfays5/fBeHNbHO0p0rrY6GwhJflLWNVt/mL+aLbsruG6CHz04l06mI4gnACS90AhZnGs0FVXV3PVyMScWdOP4Qd2SjuNcVsp0DSJH0veB4ZK+VXtiXT3KOZfNZixey9pte/n5549OOopzWSvTEcREoIqgIemY5uVck1NdbUydU8SIPh2ZcJj3I+Lc/tR5BGFmy4H/lfS2mf2tkTI5F6sX3l/PP9bv5LcTR3mHQM7VIepdTK9Juk3SgvD1K0nek7trcsyM389eQf+ubTnn6L5Jx3Euq0VtIO4FdhD003AxsB2YHlco5+Ly5srNLCrdyldOGUJert/l7Vxdoj4oN9TMvpAyfLOkxXEEci5OU+YU0b19PhcVDsg8s3MtXNSvUHskjasZkDQW2BNPJOfisWztdmYv38AXxw2mTSvvEMi5TKIeQVwLPJBy3WELcFU8kZyLx9Q5RXRonccVJw9KOopzTULUYn1LgJGSOoXD22NN5VwDK920m5lvr+XL44fQuW2rpOM41yTUq+ssbxhcUzXtlSLycnL44jivHuNcVH4bh2v2NuzYx+MLyvjC8f3o3alN0nGcazK8gXDN3vS5K6moqmbyKV6Uz7n6iHSKSVIb4KvAOIKuRl8FppjZ3hizOXfQduyt4MHXV/Hpo/owuEf7pOM416REvQbxAMGDcreHw5cBDwIXxRHKuYbyyBul7NhbybXeIZBz9Ra1gTjKzI5IGX5J0rI4AjnXUPZWVHH3qysZd2gPjunfJek4zjU5Ua9BvCWppj9qJJ0ELIgnknMN46lFa9iwY593COTcAarzCELSOwTXHFoRFOwrDYcHAe/HH8+5A1NVbdw5p4hj+ndmzNDuScdxrknKdIrp3IP5cElnA78FcoG7zex/ak3/NXBaONgO6GVmXcJpVwE/DKf9zMzuP5gsrmV59t11lGzazZTLj/OS3s4doEz9QayqeS8pF+idaZla898BnAGUAfMlzTCzj69dmNk3U+a/Hjg2fN8N+AlQSHDEsjBcdkvE38u1YGbGlDkrGNKjPWce2SfpOM41WZGuQYQ774+A54G/hq+ZGRY7EVhhZsVmVg48Bpxfx/yXAo+G788CnjezzWGj8DxwdpSszr26YiPvrtnOV04dQm6OHz04d6Ci3sX0deAwM9tUj8/uB6xOGS4DTko3o6RBwGDgxTqW7ZdmucnAZICBAwfWI5przqbMLqJ3p9Z87th/+S/jnKuHqHcxrQa2xZhjIvCEmVXVZyEzm2ZmhWZW2LOn9y3sYPHqrbxWtIlrxg2hdZ6X9HbuYEQ9gigGZkv6K7CvZqSZ3VbHMmuA1F5Z+ofj0pkI/EetZSfUWnZ2xKyuBZs6u4hObfK49CQ/onTuYEU9gigluA6QD3RMedVlPjBM0mBJ+QSNwIzaM0kaAXQF5qWMngWcKamrpK7AmeE45/ZrxfqdzFq2jqvGFNChdb0KFTvn0ojaH8TN9f1gM6uU9DWCHXsucK+ZLZV0C7DAzGoai4nAY2ZmKctulvRTgkYG4BYz21zfDK5lmfZyEa3zcpg0piDpKM41C5kelLsL+J2ZvZNmWnvgEmCfmT2cbnkzewZ4pta4H9cavmk/y94L3FtXPudqfLhtD08tWsNlJw6ke4fWScdxrlnIdARxB/AjSUcD7wIbgDbAMKATwQ48bePgXGO655WVVBtcM35I0lGcazYyPSi3GLhYUgeCh9b6AnuA98xseSPkcy6jrbvLeeTNUj478hAGdGuXdBznmo2o1yB24ncRuSz1wLxV7C6v4iun+tGDcw3Je5RzTdru8kqmz13Jv43oxYg+nZKO41yz4g2Ea9Ien7+aLbsrvKS3czGoVwMhyU/wuqxRUVXNXa+s5ISCrhQWdEs6jnPNTtRifWPCHuTeD4dHSvp9rMmcy+AvS9ayZuseP3pwLiZRjyB+TVBhdROAmS0BTokrlHOZVFcbU+cUcVjvjpx2WK+k4zjXLEU+xWRmq2uNqldhPeca0ovvr+eDj3Zy3YSh3iGQczGJWrBmtaQxgElqRVD++734Yjm3f2bG72evoH/Xtpx7TN+k4zjXbEU9griWoNpqP4JKq6P45+qrzjWa+SVbeKt0K5NPGUJert+I51xcMh5BhF2H/tbMLm+EPM5lNGX2Crq3z+ei4wdkntk5d8Ayfv0KO/EZFJbsdi5R7324nZeWb+DqsQW0zfcOgZyLU306DJoraQawq2Zkhg6DnGtwU+cU0T4/l38/uSDpKM41e1EbiKLwlUPmjoKci8Xqzbv5y5K1XDN+CJ3btUo6jnPNXr06DAqrutYU73OuUd31SjF5OTl8adzgpKM41yJEfZL6KEmLgKXAUkkLJR0ZbzTnPrFx5z7+MH81FxzXj96d2iQdx7kWIeo9gtOAb5nZIDMbBHwbuCu+WM79s/vmllBeVc3kU7ykt3ONJWoD0d7MXqoZMLPZQPtYEjlXy469FTwwr4Szj+zDkJ4dko7jXIsR+S4mST8CHgyHryC4s8m52D36Zinb91Zy7alelM+5xhT1COKLQE/gT8CTQI9wnHOx2ldZxd2vrGTsod0ZOaBL0nGca1Gi3sW0Bbgh5izO/Yun3lrD+h37uO3iUUlHca7FiXoX0/OSuqQMd5U0K75YzkFVtXHny8Uc3a8zYw/tnnQc51qcqKeYepjZ1pqB8IjCi/C7WM1auo6VG3d5SW/nEhK1gaiWNLBmQNIgwOKJ5FxQ0nvK7CIG92jPWUf2STqOcy1S1LuYfgC8KmkOIGA8MDm2VK7Fm7tiE++s2cb/XHA0uTl+9OBcEqJepH5W0nHAyeGob5jZxvhiuZZuypwV9OrYms8f1y/pKM61WFEvUo8F9pjZTKAL8P3wNFOm5c6WtFzSCknf2888F0taJmmppEdSxv8yHPeepN/JT0K3GEtWb2Xuik1cM34wrfO8pLdzSYl6DWIKsFvSSOBbBJVdH6hrgbCjoTuATwNHAJdKOqLWPMOAG4GxZnYk8I1w/BhgLHAMcBRwAnBqxKyuiZs6p4hObfK49MSBmWd2zsUmagNRaWYGnA/cYWZ3kLns94nACjMrNrNy4LFw+VRfDj9vC4CZrQ/HG9AGyAdaA62AjyJmdU1Y0YadPLt0HVeOLqBjGy/p7VySojYQOyTdSFBi46+Scgh22nXpB6xOGS4Lx6UaDgyXNFfS65LOBjCzecBLwIfha5aZvRcxq2vCps0pJj83h0ljC5KO4lyLF7WBuATYB3zJzNYB/YFbG2D9ecAwYAJwKXCXpC6SDgUOD9fTD/iUpPG1F5Y0WdICSQs2bNjQAHFcktZt28ufFpVxyQkD6NGhddJxnGvxIjUQZrbOzG4zs1fC4VIzq/MaBLAGSO1Vvn84LlUZMMPMKsxsJfABQYPxeeB1M9sZdk70N2B0mlzTzKzQzAp79uwZ5VdxWeyeV4upNvjyeC/p7Vw2iHoEcSDmA8MkDZaUD0wEZtSa52mCowck9SA45VQMlAKnSsqT1IrgArWfYmrGtu4u55E3SjnvmL4M6NYu6TjOOWJsIMysEvgaMItg5/64mS2VdIukz4azzQI2SVpGcM3hu2a2CXiC4E6pd4AlwBIz+0tcWV3yHpy3il3lVVw7wUt6O5ctFNyc1PQVFhbaggULko7hDsCe8irG/u+LjBrQhXsnnZB0HOdaFEkLzaww3bRIT1KHD8rdBAwKlxFgZuYni91Be3zBajbvKuc6P3pwLqtErcV0D/BNYCFQFV8c19JUVFUz7eViCgd15YSCbknHcc6liNpAbDOzv8WaxLVIM99ey5qte7jl/COTjuKcqyVqA/GSpFsJuhzdVzPSzN6KJZVrEaqrg5Leh/XuyGmHefcizmWbqA3ESeHP1AsZBnyqYeO4luSl5ev54KOd/PqSkeR4SW/nsk7Uct+nxR3EtTxTZhfRr0tbzj3mkKSjOOfSiFruu7Ok22rKWkj6laTOcYdzzdf8ks0sWLWFyacMoVVunM9rOucOVNS/zHuBHcDF4Ws7MD2uUK75mzq7iG7t87m4cEDmmZ1ziYh6DWKomX0hZfhmSYvjCOSav/fXbeeF99fz7TOG0zbfOwRyLltFPYLYI2lczUBND3PxRHLN3Z1zimmfn8uVowuSjuKcq0PUI4jrgPvD6w4CNgOT4grlmq/VmxbXBpkAABKASURBVHczY8lavji2gM7tvEMg57JZ1LuYFgMjJXUKh7fHmso1W3e/UkyO4EvjvEqLc9muzgZC0hVm9pCkb9UaD4CZ3RZjNtfMbNy5j8fmr+aCY/vTp3ObpOM45zLIdATRPvyZrv/p5lEG1jWa+18robyqmsmn+tGDc01BnQ2Emd0Zvv27mc1NnRZeqHYukp37Krn/tRLOOqIPQ3t2SDqOcy6CqHcx3R5xnHNpPfpGKdv3VnqHQM41IZmuQYwGxgA9a12H6AT4Dewukn2VVdz9ajFjhnZn1IAuScdxzkWU6QgiH+hA0JB0THltBy6MN5prLp5etIaPtu/zDoGca2IyXYOYA8yRdJ+ZrWqkTK4Zqao27pxTzFH9OjHu0B5Jx3HO1UPUB+V2h/1BHAl8fH+imXm5b1en55auo3jjLu647LiPb492zjUNUS9SPwy8DwwGbgZKgPkxZXLNhJkxZU4RBd3bcfZRfZKO45yrp6gNRHczuweoMLM5ZvZFvLMgl8FrRZt4u2wbXzl1KLneIZBzTU7UU0wV4c8PJZ0DrAW8h3lXpymzi+jVsTUXHNcv6SjOuQMQtYH4WVio79sEzz90Ar4ZWyrX5L1dtpVXV2zkxk+PoHWe3xHtXFMUtVjfzPDtNsC7H3UZTZ1TRMc2eVx20sCkozjnDlCmB+Vup46aS2Z2Q4Mnck1e8Yad/O3ddXx1wlA6tvGS3s41VZkuUi8AFhLc2noc8I/wNYrgITrn/sW0l4vJz81h0pjBSUdxzh2ETA/K3Q8g6TpgnJlVhsNTgVfij+eamnXb9vLkW2VMPGEgPTu2TjqOc+4gRL3NtSvBhekaHcJxdZJ0tqTlklZI+t5+5rlY0jJJSyU9kjJ+oKTnJL0XTi+ImNUl6N65K6k2mHyKl/R2rqmLehfT/wCLJL1E0OXoKcBNdS0gKRe4AzgDKAPmS5phZstS5hkG3AiMNbMtknqlfMQDwM/N7HlJHYDqiFldQrbtruDh11dx7jF9GdCtXdJxnHMHKepdTNMl/Q04KRz1X2a2LsNiJwIrzKwYQNJjwPnAspR5vgzcYWZbwvWsD+c9Asgzs+fD8Tsj/j4uQQ++XsKu8iquPdWL8jnXHNR5iknSiPDnccAhwOrwdUg4ri79wnlrlIXjUg0HhkuaK+l1SWenjN8q6U+SFkm6NTwiqZ1vsqQFkhZs2LAhQxwXpz3lVUyfW8Jph/Xk8L6dMi/gnMt6mY4gvk3wLf9XaaYZB19uIw8YBkwA+gMvSzo6HD8eOBYoBf4ATALu+acAZtOAaQCFhYXeBWqC/rhwNZt2lXPdhEOTjuKcayCZ7mL6cvjzQB6OWwMMSBnuH45LVQa8YWYVwEpJHxA0GGXA4pTTU08DJ1OrgXDZobKqmmkvF3P8oK6cUJDx3gXnXBOR6UG5C+qabmZ/qmPyfGCYpMEEDcNE4LJa8zwNXApMl9SD4NRSMbAV6CKpp5ltIDhSWVBXFpecv77zIWVb9nDTeUd6SW/nmpFMp5jOq2OaAfttIMysUtLXgFkE3ZPea2ZLJd0CLDCzGeG0MyUtA6qA75rZJgBJ3wFeULDHWQjcFfWXco3HzJgyu4jhvTvwqRG9Mi/gnGsyMp1iuvpgPtzMngGeqTXuxynvDfhW+Kq97PPAMQezfhe/2cs38P66Hdx28UhyvKS3c81K1OcgCMt81+5R7pY4QrmmY8rsIvp1act5Iw9JOopzroFFepI6LK1xCXA9wYNyFwGDYszlmoAFJZt5s2QzXx4/mFa5UR/Kd841FVH/qseY2ZXAFjO7GRhNcEHZtWBT5xTRrX0+l5zgJb2da46iNhB7wp+7JR1C0MNc33giuaZg+bod/P299UwaU0DbfO8QyLnmKOo1iJmSugC3Am8R3MHkdxW1YHfOKaJdfi5XjvYzjc41V1FrMf00fPukpJlAGzPbFl8sl83Ktuzmz0vWcvWYArq0825BnGuuIjUQkt4GHgP+YGZFwL5YU7msYGaUV1Wzr7KafRXVwfuKKu6cU0yO4EvjvUMg55qzqKeYziO4i+lxSdUEtZEeN7PS2JI5qqvDHXRFNfsqq4IddWUVeyuqP35fe+cdjA+npZnvk8+ppnw/41M/Z38uLuxP385tG3FrOOcaW9RTTKuAXwK/DPtw+BHwvwRPSDdblTXfnlN2uOl22Jl3xNHmS90xl1cG6zpY+Xk5tM7LoXVebvCz1Sfv8/Ny6NA6j+7tc8Px6edrnfoZ4fixh3ZvgC3snMtm9XlQbhDBUcQlBGUx/jOuUI1p865yJk6bl3aHXVV9cAViJWiT968739Sddtf2+XXsmHM/mbf2DrtVbpodd81nh+vJzfGnm51zByzqNYg3gFbA48BFNVVWm4P8vBwO7dXhX3a++blpdsy1dt7pdsqpO++8HHnxOudckxX1COJKM1sea5KEdGidx+8vPz7pGM45l3UiPSjXXBsH55xz++cFdJxzzqXlDYRzzrm0olZzvUhSx/D9DyX9SdJx8UZzzjmXpKhHED8ysx2SxgGnE/QNPSW+WM4555IWtYGoCn+eA0wzs78CXoTHOeeasagNxBpJdxI8JPeMpNb1WNY551wTFHUnfzEwCzjLzLYC3YDvxpbKOedc4mSWuZyEpKFAmZntkzQBOAZ4IGwssoKkDcCqg/iIHsDGBorTkDxX/Xiu+vFc9dMccw0ys57pJkRtIBYDhUAB8AzwZ+BIM/vMAQbKOpIWmFlh0jlq81z147nqx3PVT0vLFfUUU7WZVQIXALeb2XfxLkedc65Zi9pAVEi6FLgSmBmOaxVPJOecc9kgagNxNTAa+LmZrZQ0GHgwvliJmJZ0gP3wXPXjuerHc9VPi8oV6RoEgKR8YHg4uNzMKuII5JxzLjtEvUg9AbgfKAEEDACuMrOX4wznnHMuOVEbiIXAZTVlvyUNBx41M+9IwTnnmqmo1yBapfYJYWYf0AQvUku6V9J6Se/uZ7ok/U7SCklvN1ZBwgi5JkjaJmlx+PpxI+UaIOklScskLZX09TTzNPo2i5ir0beZpDaS3pS0JMx1c5p5Wkv6Q7i93pBUkCW5JknakLK9rok7V8q6cyUtkjQzzbRG314RMiW5rUokvROud0Ga6Q3792hmGV/AdOBuYEL4ugu4N8qy2fQCTgGOA97dz/TPAH8jOI12MvBGluSaAMxMYHv1BY4L33cEPgCOSHqbRczV6Nss3AYdwvetgDeAk2vN81Vgavh+IvCHLMk1Cfi/xv4/Fq77W8Aj6f69ktheETIlua1KgB51TG/Qv8eoRxDXAsuAG8LXMuC6iMtmDQuumWyuY5bzCZ4QNzN7HegiKfbnPSLkSoSZfWhmb4XvdwDvAf1qzdbo2yxirkYXboOd4WCr8FX7HO75BNfzAJ4A/k0xd1weMVciJPUnKAJ6935mafTtFSFTNmvQv8eMDYSkXGCJmd1mZheEr1+b2b4DXWkW6wesThkuIwt2PKHR4SmCv0k6srFXHh7aH0vw7TNVotusjlyQwDYLT00sBtYDz5vZfreXBQ+fbgO6Z0EugC+EpyWekDQg7kyh3wD/CVTvZ3oS2ytTJkhmW0HQsD8naaGkyWmmN+jfY8YGwsyqgOWSBh7oStxBe4ugXspI4Hbg6cZcuaQOwJPAN8xse2Ouuy4ZciWyzcysysxGAf2BEyUd1RjrzSRCrr8ABWZ2DPA8n3xrj42kc4H1ZrYw7nVFFTFTo2+rFOPM7Djg08B/SDolzpVFPcXUFVgq6QVJM2pecQZLyBqCW3hr9A/HJcrMttecIjCzZ4BWkno0xroltSLYCT9sZn9KM0si2yxTriS3WbjOrcBLwNm1Jn28vSTlAZ2BTUnnMrNNKWcF7gYa4w7FscBnJZUAjwGfkvRQrXkae3tlzJTQtqpZ95rw53rgKeDEWrM06N9j5B7lgHOBW4BfpbyamxnAleGdACcD28zsw6RDSepTc95V0okE/26x71TCdd4DvGdmt+1ntkbfZlFyJbHNJPWU1CV83xY4A3i/1mwzgKvC9xcCL1p4dTHJXLXOU3+W4LpOrMzsRjPrb2YFBBegXzSzK2rN1qjbK0qmJLZVuN72+qTr5/bAmUDtOx8b9O8xL0OgQ4HeZjan1vhxQOI7zvqS9CjB3S09JJUBPyG8XdfMphJUqv0MsALYTVBiJBtyXQhcJ6kS2ANMjHunEhoL/DvwTnj+GuD7wMCUbElssyi5kthmfYH7w+t2OcDjZjZT0i3AAjObQdCwPShpBcGNCRNjzhQ11w2SPgtUhrkmNUKutLJge2XKlNS26g08FX7vyQMeMbNnJV0L8fw91vmgnIJ7gG80s3dqjT8a+G8zO+9gVu6ccy57ZTrF1Lt24wAQjiuIJZFzzrmskKmB6FLHtLYNGcQ551x2ydRALJD05dojFTxanjW3pjnnnGt4ma5B9Ca4laqcTxqEQiAf+LyZrYs9oXPOuUREreZ6GlDzYM1SM3sx1lTOOecSF+k5CDN7ycxuD1/eOLj9kmSSfpUy/B1JNzXQZ98n6cKG+KwM67lI0nuSXkoz7VYFFVFvPYDPHSXpMw2TsuEpqID7L9VLIy77DUntGmt9rnFEfVDOuaj2ARc05lPLUYRP4Ub1JeDLZnZammmTgWPM7LsHEGMUwT3qkYUPPDWFv9NvAPVqIFz2awr/8VzTUknQP+43a0+ofQQgaWf4c4KkOZL+LKlY0v9IulxBHwbvSBqa8jGnS1og6YOwbk5NIbpbJc1XUEDtKymf+4qCsjDL0uS5NPz8dyX9bzjux8A44J7aRwnh53QAFkq6JHxC+clwvfMljQ3nO1HSPAX9Cbwm6TAFXfbeAlyioJb/JZJukvSdlM9/V1JB+Fou6QGCJ2UHSPpuyu93czh/e0l/VVCQ8F1Jl6T5HW9Q0G/G25IeS1nu3nD7LpJ0fprl0s4Tbuv/F67vbUnXS7oBOAR4qeaoS9KZ4TZ4S9IfFdTNQtLZkt6X9BZwQe31uixTu/63v/x1MC9gJ9CJoG59Z+A7wE3htPuAC1PnDX9OALYSPPHbmqB2zM3htK8Dv0lZ/lmCLzbDCCpVtiH4Vv/DcJ7WwAJgcPi5u4DBaXIeApQCPQmeSn0R+Fw4bTZQuL/fL+X9IwTF0yB4ivu98H0nIC98fzrwZPh+Ein9CAA3Ad9JGX6X4PmiAoJKoieH488kaHQV/u4zCfoQ+QJwV8ryndPkXQu0Dt93CX/+N3BFzTiC/jTak9KHRh3zXEdQdrvm9+sW/iwh7KcA6AG8DLQPh/8L+HH4b7U6/LcT8DgJ9HPir+iv+hx2OxeJmW0Pv/3eQFDmIor5FtaMkVQEPBeOfwdIPdXzuJlVA/+QVAyMINiBHpNydNKZYCdUDrxpZivTrO8EYLaZbQjX+TDBTrc+VV9PB47QJ90TdAq/KXcmKG0xjKA884H0vrjKgnr+EPx+ZwKLwuEOBL/fK8CvwqOfmWb2SprPeRt4WNLTfPK7nUlQkK7m6KUNYZmSFPub53SCDnwqAcwsXT8mJwNHAHPDbZMPzCP4t1ppZv8AUFAEL13JapclvIFwcfkNQcnt6SnjKglPa4bn1fNTpqX2L1KdMlzNP/8/rX3bnRF8G73ezGalTpA0geAIIi45BN/y99Za7/8BL5nZ5xX0VzF7P8t/vD1CbVLep+YW8Aszu7P2ByjoUvIzwM8kvWBmt9Sa5RyChu884AcKyuQI+IKldCMcflbvWutMN89+fpV/jkXQ58SltZYdFWVhlz38GoSLRfjN8nGCC741SvikNPJnObBv1hdJygmvSwwBlgOzCArztQKQNFxBtcu6vAmcKqmHgiJ2lwJzMixT23PA9TUDKTvAznxSYnlSyvw7CLpIrVFC0NVszY5+8H7WMwv4Ysp5/H6Sekk6BNhtZg8Bt9Z8VkqeHGCAmb1EcJqnM8HRxyzgeunjarfH7med6eZ5HviKwov+krql+d1eB8YqKPZZcz1jOEEF2YKUa0r/1IC47OMNhIvTrwjOR9e4i2CnvAQYzYF9uy8l2Ln/Dbg2/PZ+N8FF6LckvQvcSYaj4/B01vcI+kZYAiw0sz/XM8sNQGF4sXYZQde8AL8EfiFpUa0cLxGcklocXlB+EugmaSnwNYLz/OmyPkdwvWOepHcIrgF0BI4G3lRQ0fYnwM9qLZoLPBQuswj4nQX9QfyUoHF+O1z3T9Osdn/z3E3wb/B2+O94WTh+GvCspJfC03aTgEclvU14ein8t5oM/DW8SL0+3e/rskekB+Wcc861PH4E4ZxzLi1vIJxzzqXlDYRzzrm0vIFwzjmXljcQzjnn0vIGwjnnXFreQDjnnEvr/wONQsfAYposnQAAAABJRU5ErkJggg==\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"tags": [],
"needs_background": "light"
}
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "2Nckjew3GL2v",
"colab_type": "text"
},
"source": [
"# Tree Based"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "AcqQy_SoGPf7",
"colab_type": "text"
},
"source": [
"## Feature importance"
]
},
{
"cell_type": "code",
"metadata": {
"ExecuteTime": {
"end_time": "2020-04-17T18:33:36.916676Z",
"start_time": "2020-04-17T18:33:36.912199Z"
},
"id": "rC2fDzjZlhJj",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 150
},
"outputId": "5cc844fc-1d07-4b06-de64-3df3f42f73b5"
},
"source": [
"from sklearn.ensemble import ExtraTreesClassifier\n",
"\n",
"# load data\n",
"filename = '/content/diabetes_data.csv'\n",
"names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']\n",
"\n",
"dataframe = pd.read_csv(filename, skiprows=1, names=names)\n",
"\n",
"X = dataframe[dataframe.columns[:-1]]\n",
"Y = dataframe[dataframe.columns[-1]]\n",
"\n",
"model = ExtraTreesClassifier(n_estimators=10)\n",
"model.fit(X, Y)\n",
"\n",
"for score, name in sorted(zip(model.feature_importances_, dataframe.columns), reverse=True):\n",
" print(f\"{name}: {score}\")"
],
"execution_count": 15,
"outputs": [
{
"output_type": "stream",
"text": [
"plas: 0.2099093726365222\n",
"age: 0.14819210935381139\n",
"mass: 0.13157244530019407\n",
"preg: 0.12348960652746636\n",
"pedi: 0.11552694358738022\n",
"pres: 0.10794313979850405\n",
"skin: 0.0829651270073681\n",
"test: 0.08040125578875357\n"
],
"name": "stdout"
}
]
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment