diff --git a/2017/07-decision-tree/decision_tree_atividade_Lucas_S_Fernandes.ipynb b/2017/07-decision-tree/decision_tree_atividade_Lucas_S_Fernandes.ipynb new file mode 100644 index 0000000..4959928 --- /dev/null +++ b/2017/07-decision-tree/decision_tree_atividade_Lucas_S_Fernandes.ipynb @@ -0,0 +1,291 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Atividade - Árvore de Decisão\n", + "1. Utilizamos a medida de Entropia como fator de decisão (medida de impureza de um nó). Teste o mesmo conjunto randômico de dados para a medida Gini e compare os resultados. Ref1.: http://scikit-learn.org/stable/modules/generated/sklearn.tree.DecisionTreeClassifier.html#sklearn.tree.DecisionTreeClassifier Ref2.: https://en.wikipedia.org/wiki/Decision_tree_learning\n", + "\n", + "2. Faça o balanceamento dos dados contidos em \"train.csv\", aplique o algoritmo de Decision Tree e faça a submissão no kaggle. Tente melhorar o resultado obtido em sala de aula (posição 3100 no leaderboard). Dataset: https://www.kaggle.com/c/porto-seguro-safe-driver-prediction\n", + "\n", + "3. (Opcional) Execute uma Random Forest na competição do Kaggle e veja se a acurácia melhora. Utilize 10, 100 ou 1000 árvores (dependendo de quanto o seu computador aguentar =]): http://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestClassifier.html" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "import os\n", + "import pandas as pd\n", + "import math\n", + "import numpy as np\n", + "from sklearn.tree import DecisionTreeClassifier" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "headers = [\"buying\", \"maint\", \"doors\", \"persons\",\"lug_boot\", \"safety\", \"class\"]\n", + "data = pd.read_csv(\"car_data.csv\", header=None, names=headers)\n", + "\n", + "data = data.sample(frac=1).reset_index(drop=True) # shuffle\n", + "\n", + "for h in headers:\n", + " data[h] = data[h].astype('category')\n", + " data[h] = data[h].cat.codes\n", + "\n", + "data.set_index(\"class\", inplace=True) \n", + "# dados convertidos e utilizáveis" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "size = len(data)\n", + "train_size = int(math.floor(size * 0.7))\n", + "train_data = data[:train_size]\n", + "test_data = data[train_size:]" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Gini score: 0.9672447013487476\n" + ] + } + ], + "source": [ + "d_tree = DecisionTreeClassifier(criterion=\"gini\") \n", + "d_tree.fit(train_data, train_data.index)\n", + "d_tree.predict(test_data.iloc[:, 0:6])\n", + "score = d_tree.score(test_data, test_data.index)\n", + "print(\"Gini score: {}\".format(score))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [] + }, + { + "cell_type": "code", + "execution_count": 122, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "from sklearn.model_selection import train_test_split\n", + "from sklearn.preprocessing import LabelEncoder\n", + "from sklearn.preprocessing import Imputer\n", + "from collections import Counter" + ] + }, + { + "cell_type": "code", + "execution_count": 119, + "metadata": {}, + "outputs": [], + "source": [ + "df = pd.read_csv(\"car_data.csv\")" + ] + }, + { + "cell_type": "code", + "execution_count": 120, + "metadata": {}, + "outputs": [], + "source": [ + "labelencoder_X=LabelEncoder()\n", + "for i in range(0,7):\n", + " df.iloc[:,i] = labelencoder_X.fit_transform(df.iloc[:, i])" + ] + }, + { + "cell_type": "code", + "execution_count": 117, + "metadata": {}, + "outputs": [], + "source": [ + "x = df.iloc[:, 2:]\n", + "y = df.iloc[:, 1]\n", + "\n", + "x_train, x_test, y_train, y_test = train_test_split(x,y,test_size=0.3)" + ] + }, + { + "cell_type": "code", + "execution_count": 125, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Original dataset shape Counter({2: 313, 3: 310, 1: 293, 0: 292})\n" + ] + } + ], + "source": [ + "print('Original dataset shape {}'.format(Counter(y_train))) ## dataset já balanceado, não consegui outro dataset fora esse :/" + ] + }, + { + "cell_type": "code", + "execution_count": 126, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Score: 0.0905587668593449\n" + ] + } + ], + "source": [ + "d_tree = DecisionTreeClassifier(criterion='gini')\n", + "d_tree.fit(x_train, y_train)\n", + "y_hat = d_tree.predict(x_test)\n", + "\n", + "print(\"Score: {}\".format(d_tree.score(x_test, y_test)))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3" + ] + }, + { + "cell_type": "code", + "execution_count": 132, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\nTkSuQmCC\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "from sklearn.ensemble import RandomForestClassifier\n", + "from matplotlib import pyplot as plt\n", + "\n", + "def randomForestScores(limitTrees, train_data):\n", + " scores = []\n", + " for i in range(1, limitTrees):\n", + " toFitTrainData = train_data\n", + " d_tree = RandomForestClassifier(n_estimators=i, criterion='entropy')\n", + " d_tree.fit(toFitTrainData, toFitTrainData.index)\n", + " \n", + " d_tree.predict(test_data.iloc[:, 0:6])\n", + " score = d_tree.score(test_data, test_data.index)\n", + " scores.append(score)\n", + " return scores\n", + "\n", + "headers = [\"buying\", \"maint\", \"doors\", \"persons\",\"lug_boot\", \"safety\", \"class\"]\n", + "data = pd.read_csv(\"car_data.csv\", header=None, names=headers)\n", + "\n", + "data = data.sample(frac=1).reset_index(drop=True) # shuffle\n", + "\n", + "for h in headers:\n", + " data[h] = data[h].astype('category')\n", + " data[h] = data[h].cat.codes\n", + "\n", + "data.set_index(\"class\", inplace=True) \n", + "# dados convertidos e utilizáveis\n", + "\n", + "size = len(data)\n", + "train_size = int(math.floor(size * 0.7))\n", + "train_data = data[:train_size]\n", + "test_data = data[train_size:]\n", + "\n", + "scores = randomForestScores(101, train_data) # teste de 1 a 100 árvores\n", + "\n", + "plt.plot(range(1, 101), scores)\n", + "plt.xlabel('trees')\n", + "plt.ylabel('score')\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.3" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +}