{"cells":[{"metadata":{"_uuid":"cf15e9cc-dd1a-4b36-8a49-c3a4c37f27c1","_cell_guid":"b0acac80-ea5a-472f-9e6f-e5cd3087bd37","trusted":true},"cell_type":"code","source":"'''\nOrientações de execução:\n- Ao executar esse notebook, será gerado o modelo 'modelo_final_v8.pkl' no diretório 'output'\n- Após, esse modelo deve ser importado nos dados do notebook de submissão (link: https://www.kaggle.com/miriampizzattocolpo/notebooksubmissao),\natravés da funcionalidade \"Add Data>Notebook Output Files>Your Work\" do Kaggle**. Assim, o modelo poderá ser carregado e executado no notebook\nde submissão, realizando a previsão dos rótulos das imagens de teste e, consequentemente, a geração do .csv, a ser avaliado na submissão dos\nresultados.\n\n** Caso o modelo seja gerado a partir do notebook de experimentos (Colab), ele precisará ser adicionado a um \"dataset\" (\"Add Data>Datasets>\nYour Dataset>Upload\"), a ser incluído no diretório input do notebook de submissão.\n'''\n\n! [ -e /content ] && pip install -Uqq fastai\n\n\nimport numpy as np\nimport pandas as pd\nfrom fastai.vision.all import *\nimport seaborn as sns\n\n# carrega os dados\ndata_dir = \"../input/cassava-leaf-disease-classification/\"\ndata = pd.read_csv(data_dir+\"train.csv\")\n\n\nfrom imblearn.over_sampling import RandomOverSampler\n\n# proporção = percentual da classe majoritária a ser considerado na sobreamostragem das demais classes\n# pc_val =  percentual da base de treino a ser separada para validação\ndef sobreamostragem(data_train, proporcao, pc_val):\n  # separa manualmente uma porcentagem da base para validação,\n  # uma vez que não deve ser reamostrada a base de validação\n  df_train_over = data_train.sample(n=int((1.0 - pc_val) * len(data_train)), random_state=1)\n  df_val_over = data_train[~data_train.image_id.isin(df_train_over.image_id)]\n\n  # superamostra a base de treino, considerando uma determinada proporção de balanceamento\n  num_samples = round(df_train_over[df_train_over['label']==3].shape[0] * proporcao)\n  ss = {0: num_samples, 1: num_samples, 2: num_samples, 4: num_samples}\n  df_train_over, y_train_over = RandomOverSampler(random_state=42, sampling_strategy=ss).fit_resample(df_train_over, df_train_over['label'])\n\n  # cria coluna 'valid' para indicar quais registros serão usados na validação e, após,\n  # une os registros de treino e validação\n  df_train_over = pd.DataFrame(data=df_train_over, columns=df_val_over.columns)\n  df_train_over['valid'] = 0\n  df_val_over['valid'] = 1\n  df_over = pd.concat([df_train_over, df_val_over])\n  return df_over\n\n\ndef treina_modelo_final(modelo, nome):\n  maior_acuracia = 0.0\n  epoca_maior = 1\n\n  for i in range(1, 21):\n    print(\"########### Época\", i, \"###########\")\n    modelo.fine_tune(1)\n    preds, labels = modelo.get_preds()\n    acuracia = accuracy(preds, labels)\n    if acuracia >= maior_acuracia:\n      maior_acuracia = acuracia\n      epoca_maior = i\n      modelo.export('/kaggle/working/' + nome)\n\n  print('Maior acurácia:', maior_acuracia, \"\\t\\tÉpoca: \", epoca_maior)\n  return modelo\n\n\ndf_final = sobreamostragem(data, 0.35, 0.1)\ndl_final = ImageDataLoaders.from_df(df=df_final, path=data_dir+\"train_images\", item_tfms=Resize(224),\n                              valid_pct=0.0, valid_col='valid',\n                              batch_tfms=aug_transforms(flip_vert=True, mult=2))\n\n\nmodelo_final = cnn_learner(dl_final, vgg19_bn, metrics=[error_rate,accuracy], pretrained=True)\nmodelo_final = treina_modelo_final(modelo_final, 'modelo_final_v8.pkl')","execution_count":null,"outputs":[]}],"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":4,"nbformat_minor":4}