{ "cells": [ { "cell_type": "markdown", "id": "liquid-rental", "metadata": {}, "source": [ "## Background\n", "\n", "Dataset taken from https://archive.ics.uci.edu/ml/datasets/Contraceptive+Method+Choice" ] }, { "cell_type": "markdown", "id": "proved-chemical", "metadata": {}, "source": [ "## Loading data" ] }, { "cell_type": "code", "execution_count": 1, "id": "daily-springfield", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
wife_agewife_eduhusb_educhildrenwife_relwife_iswhusb_ocusol_indexmedia_expmethod_used
024233112301
1451310113401
243237113401
342329113301
436338113201
\n", "
" ], "text/plain": [ " wife_age wife_edu husb_edu children wife_rel wife_isw husb_ocu \\\n", "0 24 2 3 3 1 1 2 \n", "1 45 1 3 10 1 1 3 \n", "2 43 2 3 7 1 1 3 \n", "3 42 3 2 9 1 1 3 \n", "4 36 3 3 8 1 1 3 \n", "\n", " sol_index media_exp method_used \n", "0 3 0 1 \n", "1 4 0 1 \n", "2 4 0 1 \n", "3 3 0 1 \n", "4 2 0 1 " ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import pandas as pd\n", "\n", "column_names = [\n", " 'wife_age',\n", " 'wife_edu',\n", " 'husb_edu',\n", " 'children',\n", " 'wife_rel',\n", " 'wife_isw',\n", " 'husb_ocu',\n", " 'sol_index',\n", " 'media_exp',\n", " 'method_used'\n", "]\n", "\n", "df = pd.read_csv('cmc.data', names=column_names)\n", "df.head()" ] }, { "cell_type": "markdown", "id": "anonymous-portland", "metadata": {}, "source": [ "## Preparing Data" ] }, { "cell_type": "code", "execution_count": 2, "id": "warming-sacramento", "metadata": {}, "outputs": [], "source": [ "features = [col for col in column_names if col != 'method_used']\n", "\n", "X = df[features]\n", "y = df['method_used']" ] }, { "cell_type": "markdown", "id": "found-feature", "metadata": {}, "source": [ "### Scaling" ] }, { "cell_type": "markdown", "id": "private-paradise", "metadata": {}, "source": [ "I'm using a StandardScaler" ] }, { "cell_type": "code", "execution_count": 3, "id": "eleven-hello", "metadata": {}, "outputs": [], "source": [ "from sklearn.preprocessing import StandardScaler\n", "\n", "scaler = StandardScaler()\n", "X = scaler.fit_transform(X)" ] }, { "cell_type": "markdown", "id": "premium-cooperative", "metadata": {}, "source": [ "### Feature selection\n", "First I'd like to see how balanced are the target classes" ] }, { "cell_type": "code", "execution_count": 4, "id": "respiratory-heart", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
method_usedmedia_exp
01629
12333
23511
\n", "
" ], "text/plain": [ " method_used media_exp\n", "0 1 629\n", "1 2 333\n", "2 3 511" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.loc[:, ['media_exp', 'method_used']]\\\n", " .groupby('method_used')\\\n", " .count()\\\n", " .reset_index()" ] }, { "cell_type": "code", "execution_count": 5, "id": "renewable-tracy", "metadata": {}, "outputs": [], "source": [ "# Install a pip package in the current Jupyter kernel\n", "#import sys\n", "#!{sys.executable} -m pip install -U imbalanced-learn" ] }, { "cell_type": "code", "execution_count": 6, "id": "every-yahoo", "metadata": {}, "outputs": [], "source": [ "from imblearn.over_sampling import SMOTE\n", "\n", "smote = SMOTE(sampling_strategy='all')\n", "X, y = smote.fit_resample(X, y)" ] }, { "cell_type": "markdown", "id": "intimate-hazard", "metadata": {}, "source": [ "Now I'm using SelectKBest method to get the best 5 features" ] }, { "cell_type": "code", "execution_count": 7, "id": "married-personality", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Top 9 features: ['wife_age' 'wife_edu' 'husb_edu' 'children' 'wife_rel' 'wife_isw'\n", " 'husb_ocu' 'sol_index' 'media_exp']\n" ] } ], "source": [ "from sklearn.feature_selection import SelectKBest, f_classif\n", "\n", "N = 9\n", "fs = SelectKBest(f_classif, k=N)\n", "X_selected = fs.fit_transform(X, y)\n", "cols = fs.get_support(indices=True)\n", "df_improved = df.iloc[:, cols]\n", "feature_names = df.iloc[:, cols].columns.values\n", "\n", "print(\"Top {} features: {}\".format(N, feature_names))" ] }, { "cell_type": "markdown", "id": "protected-vulnerability", "metadata": {}, "source": [ "### Create training/test sets" ] }, { "cell_type": "code", "execution_count": 8, "id": "played-engineering", "metadata": {}, "outputs": [], "source": [ "from sklearn.model_selection import train_test_split\n", "\n", "X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)" ] }, { "cell_type": "markdown", "id": "continuing-strategy", "metadata": {}, "source": [ "## Model creation" ] }, { "cell_type": "code", "execution_count": 9, "id": "roman-ecuador", "metadata": {}, "outputs": [], "source": [ "from sklearn.svm import SVC\n", "from sklearn.linear_model import LogisticRegression\n", "from sklearn.neighbors import KNeighborsClassifier\n", "from sklearn.tree import DecisionTreeClassifier\n", "from sklearn.ensemble import RandomForestClassifier\n", "from sklearn.ensemble import AdaBoostClassifier\n", "from sklearn.svm import LinearSVC\n", "\n", "classifiers = [\n", " {\n", " 'classifier': SVC(),\n", " 'params': {\n", " 'C': [1, 5, 10, 20, 30, 40]\n", " }\n", " },\n", " {\n", " 'classifier': LogisticRegression(),\n", " 'params': {\n", " 'C': [1, 5, 10, 20, 30, 40],\n", " 'solver': ['newton-cg', 'saga']\n", " }\n", " },\n", " {\n", " 'classifier': KNeighborsClassifier(),\n", " 'params': {\n", " 'n_neighbors': [5, 10, 15, 20]\n", " }\n", " },\n", " {\n", " 'classifier': DecisionTreeClassifier(),\n", " 'params': {\n", " 'max_depth': [3, 4, 5, 6]\n", " }\n", " },\n", " {\n", " 'classifier': RandomForestClassifier(),\n", " 'params': {\n", " 'max_depth': [3, 4, 5, 6] \n", " }\n", " },\n", " {\n", " 'classifier': AdaBoostClassifier(),\n", " 'params': {\n", " 'n_estimators': [50, 60, 75, 100]\n", " }\n", " }\n", "] " ] }, { "cell_type": "code", "execution_count": 10, "id": "moral-consistency", "metadata": {}, "outputs": [], "source": [ "from sklearn.model_selection import GridSearchCV\n", "\n", "def resolve_best_params(classifier_entry, X_param, y_param):\n", " clsf_instance = classifier_entry['classifier']\n", " clsf_params = classifier_entry['params']\n", " grid_search = GridSearchCV(\n", " clsf_instance, \n", " cv=5,\n", " param_grid=clsf_params, \n", " # https://scikit-learn.org/stable/modules/model_evaluation.html#scoring-parameter\n", " scoring='precision_macro')\n", " grid_result = grid_search.fit(X_param, y_param)\n", " \n", " return grid_result.best_params_" ] }, { "cell_type": "code", "execution_count": 11, "id": "specified-electric", "metadata": { "scrolled": true }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "from sklearn.metrics import confusion_matrix\n", "import seaborn as sns\n", "import matplotlib.pyplot as plt\n", "\n", "f, ax = plt.subplots(2, 3, figsize=(15, 10))\n", "cols = 0\n", "rows = 0\n", "\n", "for clsf in classifiers: \n", " best_params = resolve_best_params(clsf, X, y)\n", " classifier = clsf['classifier'].set_params(**best_params).fit(X, y)\n", " clsf_name = type(classifier).__name__\n", " \n", " y_predicted = classifier.predict(X_test)\n", " matrix = confusion_matrix(y_test, y_predicted)\n", " dataframe = pd.DataFrame(matrix, index=[1, 2, 3], columns=[1, 2, 3])\n", "\n", " ax[rows, cols].title.set_text(clsf_name)\n", " sns.heatmap(dataframe, cbar=False, square=True, annot=True, fmt='g',ax=ax[rows, cols])\n", " if cols < 2:\n", " cols += 1\n", " else:\n", " cols = 0\n", " rows +=1\n", "\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 12, "id": "informational-beauty", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "SVC -- {'C': 40}\n", "-------------------------------------------------------\n", "\n", " precision recall f1-score support\n", "\n", " 1 0.92 0.76 0.83 161\n", " 2 0.72 0.88 0.79 161\n", " 3 0.76 0.72 0.74 150\n", "\n", " accuracy 0.79 472\n", " macro avg 0.80 0.79 0.79 472\n", "weighted avg 0.80 0.79 0.79 472\n", "\n", "\n", "\n", "LogisticRegression -- {'C': 1, 'solver': 'newton-cg'}\n", "-------------------------------------------------------\n", "\n", " precision recall f1-score support\n", "\n", " 1 0.58 0.55 0.57 161\n", " 2 0.56 0.61 0.59 161\n", " 3 0.45 0.43 0.44 150\n", "\n", " accuracy 0.53 472\n", " macro avg 0.53 0.53 0.53 472\n", "weighted avg 0.53 0.53 0.53 472\n", "\n", "\n", "\n", "KNeighborsClassifier -- {'n_neighbors': 5}\n", "-------------------------------------------------------\n", "\n", " precision recall f1-score support\n", "\n", " 1 0.73 0.65 0.68 161\n", " 2 0.68 0.86 0.76 161\n", " 3 0.70 0.58 0.63 150\n", "\n", " accuracy 0.70 472\n", " macro avg 0.70 0.69 0.69 472\n", "weighted avg 0.70 0.70 0.69 472\n", "\n", "\n", "\n", "DecisionTreeClassifier -- {'max_depth': 6}\n", "-------------------------------------------------------\n", "\n", " precision recall f1-score support\n", "\n", " 1 0.65 0.75 0.70 161\n", " 2 0.71 0.68 0.69 161\n", " 3 0.63 0.55 0.59 150\n", "\n", " accuracy 0.66 472\n", " macro avg 0.66 0.66 0.66 472\n", "weighted avg 0.66 0.66 0.66 472\n", "\n", "\n", "\n", "RandomForestClassifier -- {'max_depth': 6}\n", "-------------------------------------------------------\n", "\n", " precision recall f1-score support\n", "\n", " 1 0.79 0.65 0.71 161\n", " 2 0.66 0.76 0.71 161\n", " 3 0.60 0.62 0.61 150\n", "\n", " accuracy 0.68 472\n", " macro avg 0.68 0.68 0.68 472\n", "weighted avg 0.69 0.68 0.68 472\n", "\n", "\n", "\n", "AdaBoostClassifier -- {'n_estimators': 75}\n", "-------------------------------------------------------\n", "\n", " precision recall f1-score support\n", "\n", " 1 0.72 0.60 0.66 161\n", " 2 0.63 0.70 0.66 161\n", " 3 0.55 0.58 0.56 150\n", "\n", " accuracy 0.63 472\n", " macro avg 0.63 0.63 0.63 472\n", "weighted avg 0.64 0.63 0.63 472\n", "\n", "\n" ] } ], "source": [ "from sklearn.metrics import classification_report\n", "\n", "for clsf in classifiers: \n", " best_params = resolve_best_params(clsf, X, y)\n", " classifier = clsf['classifier'].set_params(**best_params).fit(X, y)\n", " clsf_name = type(classifier).__name__\n", " y_predicted = classifier.predict(X_test)\n", " report_result = classification_report(y_test, y_predicted)\n", " \n", " print()\n", " print(\"{} -- {}\".format(clsf_name, best_params))\n", " print('-------------------------------------------------------')\n", " print()\n", " print(report_result)\n", " print()" ] }, { "cell_type": "code", "execution_count": null, "id": "classical-series", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.6" } }, "nbformat": 4, "nbformat_minor": 5 }