{"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":"markdown","source":"**Kaggle BIPOC Project**     \n**Datasets is the SIIM ISIC Melanoma Datasets**\n\n","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19"}},{"cell_type":"markdown","source":"**Importing necessary libraries**","metadata":{}},{"cell_type":"code","source":"import os\nimport gc\nimport time\nimport tqdm\nimport random\n\nimport numpy as np \nimport pandas as pd\n\nimport seaborn as sns\nimport matplotlib as mpl\nimport matplotlib.pyplot as plt\nfrom matplotlib.legend_handler import HandlerBase\nfrom matplotlib.text import Text\n%matplotlib inline\n\nfrom sklearn.metrics import roc_auc_score\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.metrics import roc_auc_score\nfrom sklearn.utils import class_weight\nfrom sklearn.preprocessing import StandardScaler, LabelEncoder\n#from PIL import Image\n\nimport keras\nfrom keras.models import Sequential\nfrom keras.layers import Dense\n\nimport warnings\nwarnings.filterwarnings('ignore')","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Import datasets which comprises of the image dataset,csv format and its metadata","metadata":{}},{"cell_type":"code","source":"train = pd.read_csv('../input/siim-isic-melanoma-classification/train.csv')\ntest  = pd.read_csv('../input/siim-isic-melanoma-classification/test.csv')\n\ntrain.shape, test.shape","metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train.isnull().sum()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test.isnull().sum()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!pip install -U pip","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!pip install pandas-profiling","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from pandas_profiling import ProfileReport\nprof = ProfileReport(train)\n#prof.to_file(output_file='output.html')\nprof.to_file(\"isic_train_report.html\")","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.figure(figsize=(20,10))\nax = sns.countplot(x = train['diagnosis'])","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.figure(figsize=(5,7))\nax = sns.countplot(x = train['benign_malignant'])","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train.dtypes\ntest.dtypes","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Converting the test and train tables to integer for prediction**","metadata":{}},{"cell_type":"code","source":"del train['image_name']\ndel test['image_name']\n\ndel train['patient_id']\ndel test['patient_id']","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train.columns","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test.columns","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train['sex'] = train['sex'].astype('category')\ntest['sex'] = test['sex'].astype('category')\n\ntrain['anatom_site_general_challenge'] = train['anatom_site_general_challenge'].astype('category')\ntest['anatom_site_general_challenge'] = test['anatom_site_general_challenge'].astype('category')\n\ntrain['age_approx'] = train['age_approx'].astype('category')\ntest['age_approx'] = test['age_approx'].astype('category')\n\ntrain['diagnosis'] = train['diagnosis'].astype('category')\n\ntrain['benign_malignant'] = train['benign_malignant'].astype('category')\n\ntrain['target'] = train['target'].astype('category')\n","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train['sex_Cat'] = train['sex'].cat.codes\ntest['sex_Cat'] = test['sex'].cat.codes\n\ntrain['anatom_site_general_challenge_Cat'] = train['anatom_site_general_challenge'].cat.codes\ntest['anatom_site_general_challenge_Cat'] = test['anatom_site_general_challenge'].cat.codes\n\ntrain['age_approx_Cat'] = train['age_approx'].cat.codes\ntest['age_approx_Cat'] = test['age_approx'].cat.codes\n\ntrain['diagnosis_Cat'] = train['diagnosis'].cat.codes\n\ntrain['benign_malignant_Cat'] = train['benign_malignant'].cat.codes\n\ntrain['target_Cat'] = train['target'].cat.codes\n\n# Another method\n#label = LabelEncoder()\n#label.fit(train['benign_malignant'])\n#train['benign_malignant'] = label.transform(train['benign_malignant'])","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Drop old columns","metadata":{}},{"cell_type":"code","source":"del train['sex']\ndel train['age_approx']\ndel train['anatom_site_general_challenge']\n\ndel test['sex']\ndel test['age_approx']\ndel test['anatom_site_general_challenge']","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"del train['diagnosis'] # not in test\ndel train['benign_malignant'] # not in test\n\ndel train['diagnosis_Cat'] # not in test\ndel train['benign_malignant_Cat'] # not in test","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"cols_test = list(test.columns) # to be sure train columns are same with test columns except target","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X = train[cols_test] # Features\ny = train.target ","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Data split","metadata":{}},{"cell_type":"code","source":"X_train, X_test, y_train, y_test = train_test_split(X,y,\n                                                    stratify=y,\n                                                    shuffle=True,\n                                                    random_state = 4)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"VAL_SIZE = 0.15\nEPOCHS = 20\nBATCH_SIZE = 16","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print('TRAIN: {} & {}'.format(X_train.shape, y_train.shape))\nprint('TEST:  {} & {}'.format(X_test.shape, y_test.shape))\n\nval_len = int(X_train.shape[0]*VAL_SIZE)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class_weight_array = class_weight.compute_class_weight('balanced', \n                                                       np.unique(y_train), \n                                                       y_train)\nprint('\\nClass weights: {}'.format(class_weight_array)) \n\n# Class weights as dictionary for Keras\nkeys = [0,1] \nclass_weight_dict = dict(zip(keys, class_weight_array.T))\nprint('\\nClass weights dict: {}'.format(class_weight_dict))","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"We have almost 60 times more of label 1 (malignant) than label 0 (benign) as shown by class weights  \n- 0: ~0.51\n- 1: ~28.4","metadata":{}},{"cell_type":"code","source":"n_features = len(X_train.columns)\nn_features","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Convert to arrays for Keras processing","metadata":{}},{"cell_type":"code","source":"X_train = X_train.values\nX_test = X_test.values\n\ny_train = y_train.values\ny_test = y_test.values","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Models","metadata":{}},{"cell_type":"code","source":"model_0 = Sequential()\nmodel_0.add(Dense(64, activation='relu', input_dim = n_features ) )\nmodel_0.add(Dense(32, activation='relu'))\nmodel_0.add(Dense(16, activation='relu'))\nmodel_0.add(Dense(3, activation='softmax'))\n\nmodel_1 = Sequential()\nmodel_1.add(Dense(128, activation='relu', input_dim = n_features ) )\nmodel_1.add(Dense(64, activation='relu'))\nmodel_1.add(Dense(16, activation='relu'))\nmodel_1.add(Dense(3, activation='softmax'))","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"models = [model_0, model_1]","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for m,model in enumerate(models):\n    model.compile(optimizer='adam', \n                  loss='sparse_categorical_crossentropy',\n                  metrics=['accuracy']\n                 )\n\n    X_val = X_train[:val_len]\n    y_val = y_train[:val_len]\n\n    X_train_cut = X_train[val_len:]\n    y_train_cut = y_train[val_len:]\n    \n    # callback to stop the training if no improvement for 5 consecutive epochs\n    callback = keras.callbacks.EarlyStopping(monitor='loss', \n                                             patience=5)\n\n    history = model.fit(X_train_cut, y_train_cut, \n                        epochs=EPOCHS,\n                        batch_size=BATCH_SIZE,\n                        class_weight=class_weight_dict,\n                        validation_data=(X_val, y_val),\n                        callbacks=[callback],\n                        #verbose=0\n                       )\n    \n    result = model.evaluate(X_test, y_test)\n    print('\\nMODEL {}:\\n{}'.format(m,result))\n\n    loss = history.history['loss']\n    val_loss = history.history['val_loss']\n    \n    accuracy = history.history['accuracy']\n    val_accuracy = history.history['val_accuracy']\n    \n    metrics = history.history['accuracy']\n    epochs = range(1, len(metrics) + 1) \n\n    plt.figure(figsize=(15,8))\n    plt.plot(epochs, loss, color='tab:blue', linestyle='-', linewidth=2, marker='*', label='Training loss')\n    plt.plot(epochs, val_loss, color='tab:orange', linestyle='-', marker='o', label='Validaion loss')\n    plt.title('Training and validation loss [model {} | {:.2f}]'.format(m,result[0]), fontsize=16)\n    plt.xlabel('Epoch', fontsize=16)\n    plt.ylabel('Loss', fontsize=16)\n    plt.legend(loc='upper right', fontsize='x-large')\n    plt.tick_params(labelsize=14)\n    plt.show()\n    plt.clf()\n    \n    plt.figure(figsize=(15,8))\n    plt.plot(epochs, accuracy, color='tab:blue', linestyle='-', linewidth=2, marker='*', label='Training accuracy')\n    plt.plot(epochs, val_accuracy, color='tab:orange', linestyle='-', marker='o', label='Validaion accuracy')\n    plt.title('Training and validation accuracy [model {} | {:.2f}%]'.format(m,result[1]*100), fontsize=16)\n    plt.xlabel('Epoch', fontsize=16)\n    plt.ylabel('Accuracy', fontsize=16)\n    plt.legend(loc='upper left', fontsize='x-large')\n    plt.tick_params(labelsize=14)\n    plt.show()\n    plt.clf()\n","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"","metadata":{}},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}