{"cells":[{"metadata":{"_uuid":"cddc8488-2f05-425d-a3d2-95fbf1bbc6ad","_cell_guid":"83df77b5-24ef-4728-bdfa-65ed6c5f9c08","trusted":true},"cell_type":"code","source":"import tensorflow as tf\nimport numpy as np\nimport pandas as pd\nimport os\nfrom tqdm import tqdm\nfrom matplotlib import pyplot\nfrom tensorflow.keras.layers import Dense,Activation,Dropout\nfrom tensorflow.keras.models import Model\nfrom tensorflow.keras.models import Sequential\nfrom tensorflow.keras.optimizers import Adam\n\n\nfrom sklearn.metrics import roc_curve\nfrom sklearn.metrics import roc_auc_score\n\nfrom sklearn.model_selection import StratifiedKFold\n\n#おしゃれ化\npyplot.style.use('ggplot')","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"483434a0-5d1e-4d37-b356-cc52c81ce214","_cell_guid":"7fb2ba4e-b3c7-45c8-9a22-f8de30c94267","trusted":true},"cell_type":"code","source":"df_train = pd.read_csv(\"../input/siim-isic-melanoma-classification/train.csv\")\ndf_test =  pd.read_csv(\"../input/siim-isic-melanoma-classification/test.csv\")\n\nimg_stats_path = '/kaggle/input/melanoma2020imgtabular'\n#train_img_path = '/kaggle/input/siim-isic-melanoma-classification/jpeg/train/'\n#test_img_path = '/kaggle/input/siim-isic-melanoma-classification/jpeg/test/'","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#getting image_info\n#reference notebook:https://www.kaggle.com/datafan07/starter-analysis-of-melanoma-metadata-and-images/data?\n\"\"\"\nfrom keras.preprocessing import image\n\nfor data, location in zip([df_train, df_test],[train_img_path, test_img_path]):\n    images = data['image_name'].values\n    reds = np.zeros(images.shape[0])\n    greens = np.zeros(images.shape[0])\n    blues = np.zeros(images.shape[0])\n    mean = np.zeros(images.shape[0])\n    x = np.zeros(images.shape[0], dtype=int)\n    y = np.zeros(images.shape[0], dtype=int)\n    for i, path in enumerate(tqdm(images)):\n        img = np.array(image.load_img(os.path.join(location, f'{path}.jpg')))\n\n        reds[i] = np.mean(img[:,:,0].ravel())\n        greens[i] = np.mean(img[:,:,1].ravel())\n        blues[i] = np.mean(img[:,:,2].ravel())\n        mean[i] = np.mean(img)\n        x[i] = img.shape[1]\n        y[i] = img.shape[0]\n\n    data['reds'] = reds\n    data['greens'] = greens\n    data['blues'] = blues\n    data['mean_colors'] = mean\n    data['width'] = x\n    data['height'] = y\n\ndf_train['total_pixels']= df_train['width']*df_train['height']\ndf_test['total_pixels']= df_test['width'].astype(str)*df_test['height']\n\"\"\"","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# Loading color data:\ntrain_attr = pd.read_csv(\n    os.path.join(img_stats_path, 'train_mean_colorres.csv'))\ntest_attr = pd.read_csv(os.path.join(img_stats_path, 'test_mean_colorres.csv'))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_attr","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df_train = pd.concat([df_train, train_attr], axis=1)\ndf_test = pd.concat([df_test, test_attr], axis=1)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"drop_list = [\"image_name\",\"patient_id\",\"diagnosis\",\"benign_malignant\"]\ndrop_list_test = [\"image_name\",\"patient_id\"]\ndf_train = df_train.drop(drop_list,axis =1)\ndf_test  = df_test.drop(drop_list_test,axis =1)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#get_dummies\n\ntrain_dummy = pd.get_dummies(df_train['anatom_site_general_challenge'])\n\ntrain_dummy2 = pd.get_dummies(df_train[\"sex\"])\n\ndf_train = pd.concat([df_train.drop(['anatom_site_general_challenge',\"sex\"],axis=1),train_dummy,train_dummy2],axis=1)\n\ntest_dummy = pd.get_dummies(df_test['anatom_site_general_challenge'])\n\ntest_dummy2 = pd.get_dummies(df_test[\"sex\"])\n\ndf_test = pd.concat([df_test.drop(['anatom_site_general_challenge',\"sex\"],axis=1),test_dummy,test_dummy2],axis=1)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#train_data and label\nX = df_train.drop(\"target\",axis=1)\n\nY = df_train[\"target\"]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#standarization\ndef standarization(df,column_list):\n    for column in column_list:\n        df[column] = ((df[column] - df[column].mean())/df[column].std())\n    return","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"X","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"column_list = [\"age_approx\",'reds','greens','blues','mean_colors','width','height','total_pixels']\nstandarization(X,column_list)\nstandarization(df_test,column_list)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"X.isnull().any()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# fillna\nX[\"age_approx\"] = X[\"age_approx\"].fillna(X[\"age_approx\"].mean())","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"X","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def build_seq_model(features):\n    model = Sequential()\n    model.add(Dense(16, activation='relu',input_dim=features))\n    model.add(Dropout(0.25))\n    model.add(Dense(1,activation=\"sigmoid\"))\n    model.compile(optimizer=\"Adam\",loss=\"binary_crossentropy\",metrics=[\"accuracy\"])\n    return model","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"features = X.shape[1]\nmodel = build_seq_model(features)\n\nmodel.summary()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#https://keras.io/ja/visualization/\nimport graphviz\nfrom keras.utils import plot_model\ntf.keras.utils.plot_model(model, to_file='model.png')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"X = X.values\nY = Y.values\n\n#test data\ndf_test = df_test.values","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#stratified k-fold\n\n# number for CV\nfold_num = 5 \n\n# fix random seed for reproducibility\nseed = 7\nnp.random.seed(seed)\n\n# define X-fold cross validation\nkfold = StratifiedKFold(n_splits=fold_num, shuffle=True, random_state=seed)\n\n#make list\nAUROC = []\n\n#keras callbacks\nes_cb = tf.keras.callbacks.EarlyStopping(monitor='val_loss', patience=5, verbose=0, mode='auto')\ni=1\nfor train, test in kfold.split(X, Y):\n    print(f\"fold{i} start\")\n    #print(str(#*50))\n    model = build_seq_model(features)\n    history = model.fit(\n        X[train],\n        Y[train],\n        verbose=1,\n        epochs=50,\n        batch_size = 128,\n        validation_data=(X[test], Y[test]),\n        class_weight = {0:1,1:3},\n        callbacks=[es_cb])\n    \n    # plot history\n    pyplot.plot(history.history['loss'], label='train')\n    pyplot.plot(history.history['val_loss'], label='valid')\n    pyplot.legend()\n    pyplot.show()\n    \n    pred = model.predict(X[test])\n    AUROC_score = roc_auc_score(Y[test], pred)\n    \n    AUROC.append(AUROC_score)\n    \n    i += 1\n\nave = sum(AUROC) / len(AUROC)\nprint(f\"AUROC_list:{AUROC}\")\nprint(\"mean_AUROC:\" + str(ave))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#retrain model (using all-data)\nmodel = build_seq_model(features)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model.fit(\n        X,\n        Y,\n        verbose=1,\n        epochs=50,\n        batch_size = 128,\n        validation_data=(X[test], Y[test]),\n        class_weight = {0:1,1:3},\n        callbacks=[es_cb])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"submit = model.predict(df_test)\nsubmit","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"submission = pd.read_csv(\"../input/siim-isic-melanoma-classification/sample_submission.csv\")\nsubmission[\"target\"] = submit\nsubmission.to_csv('submission.csv', index=False)\nsubmission.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"","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}