{"cells":[{"metadata":{},"cell_type":"markdown","source":"# **Helpful comments and advice on how to improve network performance are appreciated! I'm only a beginner, learning and trying to gain experience/practise using neural networks :)**","execution_count":null},{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"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)\nimport tensorflow as tf\nfrom tensorflow.keras import layers, models, datasets\nfrom tensorflow.keras.preprocessing.image import load_img, img_to_array\nfrom tensorflow.python.keras.preprocessing.image import ImageDataGenerator\nfrom tensorflow.keras.applications import VGG16\nfrom tensorflow.keras.applications.vgg16 import decode_predictions\nimport matplotlib.pyplot as plt\nimport os\nfrom PIL import Image\nimport cv2\nimport pydicom","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# 1. Data visualisation and undestanding the data","execution_count":null},{"metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","trusted":true},"cell_type":"code","source":"#load the data\ntrain = pd.read_csv('/kaggle/input/siim-isic-melanoma-classification/train.csv')\ntest = pd.read_csv('/kaggle/input/siim-isic-melanoma-classification/test.csv')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"print('The training data contains columns: ')\nfor key in train.keys():\n    print(key)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"**Our training data is significantly biased toward benign cases...**","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"plt.hist(train['target'],align='left')\nplt.title('Number of benign and malignant cases in train.csv')\nplt.xticks([0,1],labels=['Benign','Malignant'])\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"**The overwhelming majority of cases have 'unknown' diagnoses...**","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"hist = plt.hist(train['diagnosis'],rwidth=0.5,align='left',orientation='vertical')\nplt.xticks(rotation='vertical')\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train.diagnosis.value_counts()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"**What does the training data distribution look like in terms of age and gender?**","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"#plot cases as a function of age\ngroup = train.groupby(['target','age_approx'])['benign_malignant'].count()\n\ntrain[(train['target']!=1) & (train['sex']=='female')]['age_approx'].hist(bins=15,rwidth=0.5,label='female',align='right',alpha=0.7)\ntrain[(train['target']!=1) & (train['sex']=='male')]['age_approx'].hist(bins=15,rwidth=0.5,label='male',align='mid',alpha=0.7)\nplt.title('Benign cases as a function of age and gender')\nplt.legend()\nplt.ylabel('frequency')\nplt.xlabel('age (yrs)')\nplt.show()\n\ntrain[(train['target']==1) & (train['sex']=='female')]['age_approx'].hist(bins=15,rwidth=0.5,label='female',align='right',alpha=0.7)\ntrain[(train['target']==1) & (train['sex']=='male')]['age_approx'].hist(bins=15,rwidth=0.5,label='male',align='mid',alpha=0.7)\nplt.title('Malignant cases as a function of age and gender')\nplt.legend()\nplt.ylabel('frequency')\nplt.xlabel('age (yrs)')\nplt.show()\n","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"**Where are the images located on the body?**","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"train['anatom_site_general_challenge'].hist(align='mid', rwidth=0.5)\nplt.xticks(rotation='vertical')\nplt.ylabel('frequency')\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train.anatom_site_general_challenge.value_counts()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# 2. View images, and idenitfy potentially useful data augmentation and preprocessing techniques.","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"#plt.imshow the first 10 training set images\ni=0\nfor dirname, _, filenames in os.walk('/kaggle/input/siim-isic-melanoma-classification/train/'):\n    while i < 10:\n        image = pydicom.dcmread(os.path.join(dirname, filenames[i]))\n        plt.imshow(image.pixel_array)\n        plt.xticks([])\n        plt.yticks([])\n        plt.show()\n        i+=1","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"**Lets take some benign cases and malignant cases, and apply different filters to see if we can highlight any important features...**","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"benigns = train[train.target==0]['image_name'].iloc[0:3]\nmalignants = train[train.target==1]['image_name'].iloc[0:3]\n\ndef preprocess_image(im):\n    #vary parameters here to try and highlight features in malignant cases\n    im = np.asarray(im)\n    im = cv2.resize(im, (224, 224))\n    im = cv2.cvtColor(im, cv2.COLOR_BGR2RGB)\n    im = cv2.addWeighted(im, 4, cv2.GaussianBlur(im, (0,0) , 224/5), -4 ,112)\n    return im\n\nfor image in benigns:\n    im = Image.open('/kaggle/input/siim-isic-melanoma-classification/jpeg/train/' + image + '.jpg')\n    im = preprocess_image(im)\n    plt.figure(figsize=(3,4))\n    plt.imshow(im)\n    plt.title('benign')\n    plt.xticks([])\n    plt.yticks([])\n\nfor image in malignants:\n    im = Image.open('/kaggle/input/siim-isic-melanoma-classification/jpeg/train/' + image + '.jpg')\n    im = preprocess_image(im)\n    plt.figure(figsize=(3,4))\n    plt.imshow(im)\n    plt.title('malignant')\n    plt.xticks([])\n    plt.yticks([])\n\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# 3. attempt at modelling the data using a CNN. I use the VGG16 architecture in tensorflow, and apply it to this problem using transfer learning ","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"#load the data\ntrain = pd.read_csv('/kaggle/input/siim-isic-melanoma-classification/train.csv')\ntest = pd.read_csv('/kaggle/input/siim-isic-melanoma-classification/test.csv')\n\ntrain['image_name'] += '.jpg'\n\ndata_generator = ImageDataGenerator(rescale=1./255.,validation_split=0.25)\ntrain_generator = data_generator.flow_from_dataframe(train,\n                                                     directory='/kaggle/input/siim-isic-melanoma-classification/jpeg/train/',\n                                                     x_col='image_name',\n                                                     y_col='target',\n                                                     target_size=(224, 224),\n                                                     class_mode='raw',\n                                                     subset='training',\n                                                     batch_size=24,\n                                                     color_mode='rgb',\n                                                     fill_mode='nearest')\nvalid_generator = data_generator.flow_from_dataframe(train,\n                                                     directory='/kaggle/input/siim-isic-melanoma-classification/jpeg/train/',\n                                                     x_col='image_name',\n                                                     y_col='target',\n                                                     target_size=(224, 224),\n                                                     class_mode='raw',\n                                                     subset='validation',\n                                                     batch_size=24,\n                                                     color_mode='rgb',\n                                                     fill_mode='nearest')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model = models.Sequential()\nmodel.add(VGG16(include_top=False, pooling='avg', weights='imagenet', input_shape=(224, 224, 3), classes=2))\nmodel.add(layers.Dense(2, activation='softmax'))\nmodel.layers[0].trainable = False\nmodel.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model.summary()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#try and improve predictions, by including a greater fraction of malignant cases in training sample\n\nzeros = train[train.target==0].sample(5000)\nones = train[train.target==1]\ntrain_df = pd.concat([ones,zeros]).sample(frac=1)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"data_generator = ImageDataGenerator(rescale=1./255.,validation_split=0.25)\ntrain_generator = data_generator.flow_from_dataframe(train_df,\n                                                     directory='/kaggle/input/siim-isic-melanoma-classification/jpeg/train/',\n                                                     x_col='image_name',\n                                                     y_col='target',\n                                                     target_size=(224, 224),\n                                                     class_mode='raw',\n                                                     subset='training',\n                                                     batch_size=24,\n                                                     color_mode='rgb',\n                                                     fill_mode='nearest')\nvalid_generator = data_generator.flow_from_dataframe(train_df,\n                                                     directory='/kaggle/input/siim-isic-melanoma-classification/jpeg/train/',\n                                                     x_col='image_name',\n                                                     y_col='target',\n                                                     target_size=(224, 224),\n                                                     class_mode='raw',\n                                                     subset='validation',\n                                                     batch_size=24,\n                                                     color_mode='rgb',\n                                                     fill_mode='nearest')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"history = model.fit_generator(train_generator,\n                    steps_per_epoch=150,\n                    epochs=1,\n                    validation_data=valid_generator,\n                    validation_steps=30)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"preds = model.predict_generator(valid_generator,steps=10)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"print(preds)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"for i in range(10):\n    print(valid_generator[i][1])","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}