{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load\n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\n# Input data files are available in the read-only \"../input/\" directory\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))\n\n# You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\" \n# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2021-06-09T15:31:41.339439Z","iopub.execute_input":"2021-06-09T15:31:41.339980Z","iopub.status.idle":"2021-06-09T15:31:41.346362Z","shell.execute_reply.started":"2021-06-09T15:31:41.339903Z","shell.execute_reply":"2021-06-09T15:31:41.345576Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Definindo train.csv como df ","metadata":{}},{"cell_type":"code","source":"df = pd.read_csv(\"../input/digit-recognizer/train.csv\")\ndf","metadata":{"execution":{"iopub.status.busy":"2021-06-09T15:31:41.350621Z","iopub.execute_input":"2021-06-09T15:31:41.350959Z","iopub.status.idle":"2021-06-09T15:31:44.822563Z","shell.execute_reply.started":"2021-06-09T15:31:41.350934Z","shell.execute_reply":"2021-06-09T15:31:44.821860Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Data Exploration","metadata":{}},{"cell_type":"code","source":"df.describe()","metadata":{"execution":{"iopub.status.busy":"2021-06-09T15:31:44.824166Z","iopub.execute_input":"2021-06-09T15:31:44.824443Z","iopub.status.idle":"2021-06-09T15:31:46.804947Z","shell.execute_reply.started":"2021-06-09T15:31:44.824418Z","shell.execute_reply":"2021-06-09T15:31:46.804153Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df.head()","metadata":{"execution":{"iopub.status.busy":"2021-06-09T15:31:46.806451Z","iopub.execute_input":"2021-06-09T15:31:46.806858Z","iopub.status.idle":"2021-06-09T15:31:46.822931Z","shell.execute_reply.started":"2021-06-09T15:31:46.806817Z","shell.execute_reply":"2021-06-09T15:31:46.822109Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Separando a coluna aonde so tem as \"respostas\"","metadata":{}},{"cell_type":"code","source":"df[\"label\"]","metadata":{"execution":{"iopub.status.busy":"2021-06-09T15:31:46.824011Z","iopub.execute_input":"2021-06-09T15:31:46.824271Z","iopub.status.idle":"2021-06-09T15:31:46.837361Z","shell.execute_reply.started":"2021-06-09T15:31:46.824247Z","shell.execute_reply":"2021-06-09T15:31:46.836337Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Media das \"respostas\"","metadata":{}},{"cell_type":"code","source":"df[\"label\"].mean()","metadata":{"execution":{"iopub.status.busy":"2021-06-09T15:31:46.840753Z","iopub.execute_input":"2021-06-09T15:31:46.840990Z","iopub.status.idle":"2021-06-09T15:31:46.849506Z","shell.execute_reply.started":"2021-06-09T15:31:46.840967Z","shell.execute_reply":"2021-06-09T15:31:46.848736Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Valor Maximo que pode se encontrar na coluna das \"respostas\" ","metadata":{}},{"cell_type":"code","source":"df[\"label\"].max()","metadata":{"execution":{"iopub.status.busy":"2021-06-09T15:31:46.851816Z","iopub.execute_input":"2021-06-09T15:31:46.852040Z","iopub.status.idle":"2021-06-09T15:31:46.860585Z","shell.execute_reply.started":"2021-06-09T15:31:46.852018Z","shell.execute_reply":"2021-06-09T15:31:46.859658Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Valor Minimo que pode se encontrar na coluna das \"respostas\" ","metadata":{}},{"cell_type":"code","source":"df[\"label\"].min()","metadata":{"execution":{"iopub.status.busy":"2021-06-09T15:31:46.861841Z","iopub.execute_input":"2021-06-09T15:31:46.862323Z","iopub.status.idle":"2021-06-09T15:31:46.870699Z","shell.execute_reply.started":"2021-06-09T15:31:46.862285Z","shell.execute_reply":"2021-06-09T15:31:46.869980Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Criando um gráfico para poder visualizar melhor a variação das \"respostas\" e ter uma visualização mais ampla dos dados ","metadata":{}},{"cell_type":"code","source":"pd.options.plotting.backend = \"plotly\"\ndf[\"label\"].hist()","metadata":{"execution":{"iopub.status.busy":"2021-06-09T15:31:46.871349Z","iopub.execute_input":"2021-06-09T15:31:46.871590Z","iopub.status.idle":"2021-06-09T15:31:49.289714Z","shell.execute_reply.started":"2021-06-09T15:31:46.871557Z","shell.execute_reply":"2021-06-09T15:31:49.288820Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Criando uma forma de conseguir acessar apenas um valor das \"respostas\" ","metadata":{}},{"cell_type":"code","source":"zero   = df.where(df[\"label\"] == 0).dropna(subset=[\"label\"])\num     = df.where(df[\"label\"] == 1).dropna(subset=[\"label\"])\ndois   = df.where(df[\"label\"] == 2).dropna(subset=[\"label\"])\ntres   = df.where(df[\"label\"] == 3).dropna(subset=[\"label\"])\nquatro = df.where(df[\"label\"] == 4).dropna(subset=[\"label\"])\ncinco  = df.where(df[\"label\"] == 5).dropna(subset=[\"label\"])\nseis   = df.where(df[\"label\"] == 6).dropna(subset=[\"label\"])\nsete   = df.where(df[\"label\"] == 7).dropna(subset=[\"label\"])\noito   = df.where(df[\"label\"] == 8).dropna(subset=[\"label\"])\nnove   = df.where(df[\"label\"] == 9).dropna(subset=[\"label\"])\n\nnove","metadata":{"execution":{"iopub.status.busy":"2021-06-09T15:31:49.290803Z","iopub.execute_input":"2021-06-09T15:31:49.291043Z","iopub.status.idle":"2021-06-09T15:31:54.769002Z","shell.execute_reply.started":"2021-06-09T15:31:49.291019Z","shell.execute_reply":"2021-06-09T15:31:54.768204Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Test of Predictions with DecisionTreeRegressor Without Dividing the Data","metadata":{}},{"cell_type":"markdown","source":"### Definindo as colunas aonde so tem dados dos pixeis como \"pixeis\" ","metadata":{}},{"cell_type":"code","source":"pixels = df.columns[1:]\nprint(pixels)","metadata":{"execution":{"iopub.status.busy":"2021-06-09T15:31:54.770297Z","iopub.execute_input":"2021-06-09T15:31:54.770617Z","iopub.status.idle":"2021-06-09T15:31:54.775380Z","shell.execute_reply.started":"2021-06-09T15:31:54.770590Z","shell.execute_reply":"2021-06-09T15:31:54.774181Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Definindo \"pixeis\" como X ","metadata":{}},{"cell_type":"code","source":"X = df[pixels]\nprint (X.shape)","metadata":{"execution":{"iopub.status.busy":"2021-06-09T15:31:54.776745Z","iopub.execute_input":"2021-06-09T15:31:54.777108Z","iopub.status.idle":"2021-06-09T15:31:54.869389Z","shell.execute_reply.started":"2021-06-09T15:31:54.777071Z","shell.execute_reply":"2021-06-09T15:31:54.868321Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Definindo a coluna das \"respostas\" como Y ","metadata":{}},{"cell_type":"code","source":"y = df.label","metadata":{"execution":{"iopub.status.busy":"2021-06-09T15:31:54.870801Z","iopub.execute_input":"2021-06-09T15:31:54.871160Z","iopub.status.idle":"2021-06-09T15:31:54.877434Z","shell.execute_reply.started":"2021-06-09T15:31:54.871120Z","shell.execute_reply":"2021-06-09T15:31:54.876562Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.tree import DecisionTreeRegressor\ndr_model = DecisionTreeRegressor(random_state=1)\ndr_model.fit(X, y)","metadata":{"execution":{"iopub.status.busy":"2021-06-09T15:31:54.878709Z","iopub.execute_input":"2021-06-09T15:31:54.879087Z","iopub.status.idle":"2021-06-09T15:32:07.230040Z","shell.execute_reply.started":"2021-06-09T15:31:54.879051Z","shell.execute_reply":"2021-06-09T15:32:07.229129Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"predictions = dr_model.predict(X)\nprint(predictions)","metadata":{"execution":{"iopub.status.busy":"2021-06-09T15:32:07.231194Z","iopub.execute_input":"2021-06-09T15:32:07.231463Z","iopub.status.idle":"2021-06-09T15:32:07.343067Z","shell.execute_reply.started":"2021-06-09T15:32:07.231436Z","shell.execute_reply":"2021-06-09T15:32:07.342212Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.metrics import mean_absolute_error\nmean_absolute_error(y,predictions)","metadata":{"execution":{"iopub.status.busy":"2021-06-09T15:32:07.344394Z","iopub.execute_input":"2021-06-09T15:32:07.344692Z","iopub.status.idle":"2021-06-09T15:32:07.351063Z","shell.execute_reply.started":"2021-06-09T15:32:07.344666Z","shell.execute_reply":"2021-06-09T15:32:07.350029Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Media do erro Absoluto da 0 pois foi usado os mesmos dados para treinar o modelos e para fazer a testar por isso ele não erra ","metadata":{}},{"cell_type":"markdown","source":"# Test","metadata":{}},{"cell_type":"code","source":"from sklearn.model_selection import train_test_split\n\ntrain_X, val_X, train_y, val_y = train_test_split(X, y, random_state = 0)\ndr_modelvII = DecisionTreeRegressor(random_state=1)\ndr_modelvII.fit(train_X, train_y) \n\nval_predictions = dr_modelvII.predict(val_X)\nprint(mean_absolute_error(val_y, val_predictions))","metadata":{"execution":{"iopub.status.busy":"2021-06-09T15:32:07.352538Z","iopub.execute_input":"2021-06-09T15:32:07.352907Z","iopub.status.idle":"2021-06-09T15:32:15.080011Z","shell.execute_reply.started":"2021-06-09T15:32:07.352853Z","shell.execute_reply":"2021-06-09T15:32:15.078962Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Agora para que o modelo seja realmente testado o data e dividido em (train_X, val_X, train_y, val_y) aonde train é para treinar o modelo e val é para testar o modelo aonde ele so rescebe os pixeis (val_X) e tenta prever a coluna das repostas (val_Y)\n\n### Apos isso é calculado o a media do erro absoluto do modelo (MAE)","metadata":{}},{"cell_type":"markdown","source":"# Parameter Adjustment","metadata":{}},{"cell_type":"markdown","source":"### Criando uma função aonde ela calcula a média do erro absoluto (MAE) de uma forma automatizada","metadata":{}},{"cell_type":"code","source":"def get_mae(max_leaf_nodes, train_X, val_X, train_y, val_y):\n    modelvIII = DecisionTreeRegressor(max_leaf_nodes = max_leaf_nodes, random_state = 0)\n    modelvIII.fit(train_X, train_y)\n    preds_val = modelvIII.predict(val_X)\n    mae = mean_absolute_error(val_y, preds_val)\n    return(mae)    ","metadata":{"execution":{"iopub.status.busy":"2021-06-09T15:32:15.081494Z","iopub.execute_input":"2021-06-09T15:32:15.082108Z","iopub.status.idle":"2021-06-09T15:32:15.087254Z","shell.execute_reply.started":"2021-06-09T15:32:15.082069Z","shell.execute_reply":"2021-06-09T15:32:15.086610Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Tentando otimizar o modelo experimentando qual a quantidade de \"nos de folha\" (leaf_nodes) ideal e qual traria menor média do erro absoluto (MAE)","metadata":{}},{"cell_type":"code","source":"max_leaf_nodes = [500, 1_000, 1_500, 2_000, 2_500, 3_000, 3_500, 4_000]\n\npoints = {\n    leaf_size: get_mae(leaf_size, train_X, val_X, train_y, val_y) \n    for leaf_size in max_leaf_nodes\n}\nbest_leaf_size = min(points, key = points.get)\nprint(best_leaf_size)","metadata":{"execution":{"iopub.status.busy":"2021-06-09T15:32:15.088249Z","iopub.execute_input":"2021-06-09T15:32:15.088501Z","iopub.status.idle":"2021-06-09T15:33:19.516139Z","shell.execute_reply.started":"2021-06-09T15:32:15.088475Z","shell.execute_reply":"2021-06-09T15:33:19.515309Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Test of Parameter Adjustment","metadata":{}},{"cell_type":"code","source":"train_X, val_X, train_y, val_y = train_test_split(X, y, random_state = 0)\ndr_final_model = DecisionTreeRegressor(max_leaf_nodes = 3000, random_state=1)\ndr_final_model.fit(train_X, train_y) \n\nval_predictions = dr_final_model.predict(val_X)\nprint(mean_absolute_error(val_y, val_predictions))","metadata":{"execution":{"iopub.status.busy":"2021-06-09T15:33:19.517346Z","iopub.execute_input":"2021-06-09T15:33:19.517615Z","iopub.status.idle":"2021-06-09T15:33:28.719028Z","shell.execute_reply.started":"2021-06-09T15:33:19.517589Z","shell.execute_reply":"2021-06-09T15:33:28.718130Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Podemos perceber que o modelo usado (DecisionTreeRegressor) com a utilização dos leaf nodes o modelo perde em presizão so que ganha em abrangencia fazendo com que ele englobe mais variedades","metadata":{}},{"cell_type":"markdown","source":"# Test of Predictions with Random Forests","metadata":{}},{"cell_type":"code","source":"from sklearn.ensemble import RandomForestRegressor\n\nrf_model = RandomForestRegressor(random_state = 0)\nrf_model.fit(train_X, train_y)\nrf_predt = rf_model.predict(val_X)\nprint(rf_predt)\nprint(mean_absolute_error(val_y, rf_predt))","metadata":{"execution":{"iopub.status.busy":"2021-06-09T15:33:28.719987Z","iopub.execute_input":"2021-06-09T15:33:28.720245Z","iopub.status.idle":"2021-06-09T15:40:38.664995Z","shell.execute_reply.started":"2021-06-09T15:33:28.720221Z","shell.execute_reply":"2021-06-09T15:40:38.664197Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Testando outro modelo e logo percebemos que o MAE é menor do que o modelo anterior logo sua precisão é melhor","metadata":{}},{"cell_type":"code","source":"print (rf_predt)","metadata":{"execution":{"iopub.status.busy":"2021-06-09T15:40:38.666227Z","iopub.execute_input":"2021-06-09T15:40:38.666488Z","iopub.status.idle":"2021-06-09T15:40:38.670961Z","shell.execute_reply.started":"2021-06-09T15:40:38.666462Z","shell.execute_reply":"2021-06-09T15:40:38.670219Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Cross-Validation","metadata":{}},{"cell_type":"code","source":"from sklearn.pipeline import Pipeline\nfrom sklearn.impute import SimpleImputer\nfrom sklearn.model_selection import cross_val_score","metadata":{"execution":{"iopub.status.busy":"2021-06-09T15:40:38.672319Z","iopub.execute_input":"2021-06-09T15:40:38.672633Z","iopub.status.idle":"2021-06-09T15:40:38.689944Z","shell.execute_reply.started":"2021-06-09T15:40:38.672608Z","shell.execute_reply":"2021-06-09T15:40:38.689161Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Criando uma função aonde tem uma Pipeline aonde tem uma pré processador de dados e o modelo que aceita o número que é dado pela função, após isso é feito o a cross-validation e é obtido o MEA logo após","metadata":{}},{"cell_type":"code","source":"def gs(n_estimators):\n    mp = Pipeline(steps=[\n        (\"preprocessor\", SimpleImputer()),\n        (\"model\", RandomForestRegressor(n_estimators, random_state=0))\n    ])\n    scores = -1 * cross_val_score(mp, X, y,\n                                 cv=8,\n                                 scoring=\"neg_mean_absolute_error\")\n    return scores.mean()","metadata":{"execution":{"iopub.status.busy":"2021-06-09T15:40:38.691351Z","iopub.execute_input":"2021-06-09T15:40:38.691913Z","iopub.status.idle":"2021-06-09T15:40:38.696477Z","shell.execute_reply.started":"2021-06-09T15:40:38.691879Z","shell.execute_reply":"2021-06-09T15:40:38.695819Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Criando um loop para substituir o número automaticamente assim poder fazer teste de uma forma ágil ","metadata":{}},{"cell_type":"code","source":"results = {}\nfor i in range(1,9):\n    results[50*i] = gs(50*i)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Criando um gráfico do MAE por n_estimators (números dados que função que criamos) para podermos visualizar melhor os resultados e ver de uma forma ampla","metadata":{}},{"cell_type":"code","source":"import matplotlib.pyplot as plt\n%matplotlib inline\n\nplt.plot(list(results.keys()), list(results.values()))\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2021-06-09T15:43:11.074847Z","iopub.status.idle":"2021-06-09T15:43:11.075264Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Podemos ver a partir dos resultados que o melhor de n_estimators = 400 e que mesmo assim o MAE é maior que MAE do modelo de Random Forests, o que não o torna nescessariamente pior ele fica mais abrangente mais em consequecia perde em presizão","metadata":{}}]}