{"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":"import pandas as pd\nimport numpy as np\nimport seaborn as sns\nimport matplotlib.pyplot as plt\n%matplotlib inline\nimport os\n\nsns.set_style('darkgrid')\nplt.style.use('seaborn-notebook')","metadata":{"execution":{"iopub.status.busy":"2023-03-28T18:57:42.300018Z","iopub.execute_input":"2023-03-28T18:57:42.300489Z","iopub.status.idle":"2023-03-28T18:57:42.310218Z","shell.execute_reply.started":"2023-03-28T18:57:42.300451Z","shell.execute_reply":"2023-03-28T18:57:42.308635Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#read in train and test csv files to calculate descriptive stats and characteristics\n\ntrain = pd.read_csv('../input/siim-isic-melanoma-classification/train.csv')\n\ntest = pd.read_csv('../input/siim-isic-melanoma-classification/test.csv')","metadata":{"execution":{"iopub.status.busy":"2023-03-28T18:57:42.312519Z","iopub.execute_input":"2023-03-28T18:57:42.312992Z","iopub.status.idle":"2023-03-28T18:57:42.395355Z","shell.execute_reply.started":"2023-03-28T18:57:42.312957Z","shell.execute_reply":"2023-03-28T18:57:42.394151Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train.head()","metadata":{"execution":{"iopub.status.busy":"2023-03-28T18:57:42.39731Z","iopub.execute_input":"2023-03-28T18:57:42.397675Z","iopub.status.idle":"2023-03-28T18:57:42.417009Z","shell.execute_reply.started":"2023-03-28T18:57:42.397642Z","shell.execute_reply":"2023-03-28T18:57:42.415181Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train.shape","metadata":{"execution":{"iopub.status.busy":"2023-03-28T18:57:42.41917Z","iopub.execute_input":"2023-03-28T18:57:42.41968Z","iopub.status.idle":"2023-03-28T18:57:42.429258Z","shell.execute_reply.started":"2023-03-28T18:57:42.419633Z","shell.execute_reply":"2023-03-28T18:57:42.427808Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train.info()","metadata":{"execution":{"iopub.status.busy":"2023-03-28T18:57:42.432197Z","iopub.execute_input":"2023-03-28T18:57:42.432583Z","iopub.status.idle":"2023-03-28T18:57:42.461849Z","shell.execute_reply.started":"2023-03-28T18:57:42.43255Z","shell.execute_reply":"2023-03-28T18:57:42.459536Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train.describe()","metadata":{"execution":{"iopub.status.busy":"2023-03-28T18:57:42.463816Z","iopub.execute_input":"2023-03-28T18:57:42.46433Z","iopub.status.idle":"2023-03-28T18:57:42.494783Z","shell.execute_reply.started":"2023-03-28T18:57:42.464291Z","shell.execute_reply":"2023-03-28T18:57:42.493423Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"ax1 = sns.countplot(data=train, x='anatom_site_general_challenge')\nax1.set_title('Distribution of Anatomical Sites Training Set')\nax1.tick_params(axis='x', labelrotation = 45, labelsize = 12)\n\n#note: largest category by far is the torso, oral/genital is the least common category","metadata":{"execution":{"iopub.status.busy":"2023-03-28T18:57:42.497234Z","iopub.execute_input":"2023-03-28T18:57:42.498333Z","iopub.status.idle":"2023-03-28T18:57:42.789902Z","shell.execute_reply.started":"2023-03-28T18:57:42.498283Z","shell.execute_reply":"2023-03-28T18:57:42.788562Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"ax2 = sns.countplot(data=train, x='sex')\nax2.set_title('Distribution of Gender')\n\n#note: gender is pretty evenly distributed amongst the image dataset","metadata":{"execution":{"iopub.status.busy":"2023-03-28T18:57:42.791451Z","iopub.execute_input":"2023-03-28T18:57:42.791815Z","iopub.status.idle":"2023-03-28T18:57:43.039795Z","shell.execute_reply.started":"2023-03-28T18:57:42.791779Z","shell.execute_reply":"2023-03-28T18:57:43.038619Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"ax3 = sns.countplot(data=train, x='diagnosis')\nax3.tick_params(axis='x', labelrotation = 45, labelsize = 12)\nax3.set_title('Distribution of Diagnosis')\n\n#note: the vast majority of the images have no associated diagnosis, some have the nevus diagnosis, and very few have the melanoma diagnosis. \n#Melanoma is the target we're actually looking for.","metadata":{"execution":{"iopub.status.busy":"2023-03-28T18:57:43.041457Z","iopub.execute_input":"2023-03-28T18:57:43.041812Z","iopub.status.idle":"2023-03-28T18:57:43.35136Z","shell.execute_reply.started":"2023-03-28T18:57:43.04178Z","shell.execute_reply":"2023-03-28T18:57:43.349548Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"ax4 = sns.countplot(data=train, x='benign_malignant')\nax4.tick_params(axis='x', labelrotation = 45, labelsize = 12)\nax4.set_title('Distribution of Diagnosis')\n\n#note: malignant here is defined as a have a \"melanoma\" disease label","metadata":{"execution":{"iopub.status.busy":"2023-03-28T18:57:43.3537Z","iopub.execute_input":"2023-03-28T18:57:43.354284Z","iopub.status.idle":"2023-03-28T18:57:43.588637Z","shell.execute_reply.started":"2023-03-28T18:57:43.354238Z","shell.execute_reply":"2023-03-28T18:57:43.587314Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"ax5 = sns.histplot(data=train, x='age_approx', bins=18)\nax5.tick_params(axis='x', labelrotation = 45, labelsize = 12)\nax5.set_title('Distribution of Age')\n\n#age follows a normal distribution","metadata":{"execution":{"iopub.status.busy":"2023-03-28T18:57:43.594078Z","iopub.execute_input":"2023-03-28T18:57:43.59496Z","iopub.status.idle":"2023-03-28T18:57:43.901484Z","shell.execute_reply.started":"2023-03-28T18:57:43.594901Z","shell.execute_reply":"2023-03-28T18:57:43.900198Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print('n rows where target != benign_malignant: {}'.format(len(train.loc[(train['target'] == 1) & (train['benign_malignant'] != 'malignant')])))\nprint('n rows where benign_malignant != melanoma diagnosis: {}'.format(len(train.loc[(train['diagnosis'] != 'melanoma') & (train['benign_malignant'] == 'malignant')])))\nprint('n rows where target != benign_malignant: {}'.format(len(train.loc[(train['target'] == 1) & (train['benign_malignant'] != 'malignant')])))\n\n#my assumptions hold--this dataset is labeled based off of the 'melanoma' diagnosis, \n#and a positive value in the target column indicates a malignant melanoma tumor","metadata":{"execution":{"iopub.status.busy":"2023-03-28T18:57:43.903284Z","iopub.execute_input":"2023-03-28T18:57:43.905457Z","iopub.status.idle":"2023-03-28T18:57:43.930257Z","shell.execute_reply.started":"2023-03-28T18:57:43.905396Z","shell.execute_reply":"2023-03-28T18:57:43.928609Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#print the number of missing values from each col in train\nfor col in train.columns:\n    print(col + ' missing values: ' + str(train[col].isna().sum()))\n    ","metadata":{"execution":{"iopub.status.busy":"2023-03-28T18:57:43.932863Z","iopub.execute_input":"2023-03-28T18:57:43.933711Z","iopub.status.idle":"2023-03-28T18:57:43.957058Z","shell.execute_reply.started":"2023-03-28T18:57:43.933655Z","shell.execute_reply":"2023-03-28T18:57:43.955032Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#Pull out just the observations that are positive for the target condition\nmalignant = train[train['target'] == 1]\nprint(malignant.head())\nprint(malignant.shape)","metadata":{"execution":{"iopub.status.busy":"2023-03-28T18:57:43.959595Z","iopub.execute_input":"2023-03-28T18:57:43.960124Z","iopub.status.idle":"2023-03-28T18:57:43.975798Z","shell.execute_reply.started":"2023-03-28T18:57:43.960065Z","shell.execute_reply":"2023-03-28T18:57:43.974116Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for col in malignant.columns:\n    print(col + ' missing values: ' + str(malignant[col].isna().sum()))\n","metadata":{"execution":{"iopub.status.busy":"2023-03-28T18:57:43.97755Z","iopub.execute_input":"2023-03-28T18:57:43.978125Z","iopub.status.idle":"2023-03-28T18:57:43.993206Z","shell.execute_reply.started":"2023-03-28T18:57:43.978032Z","shell.execute_reply":"2023-03-28T18:57:43.991338Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#fill missing anatom site values with \"unknown or other\"\ntrain.anatom_site_general_challenge.fillna('other or unknown', inplace=True)\n\n#verify there are no more missing values in that column\nprint('anatom_site_general_challenge' + ' missing values: ' + str(train['anatom_site_general_challenge'].isna().sum()))\n\n#plot the new distribution\nax = sns.countplot(data=train, x='anatom_site_general_challenge')\n#train.anatom_site_general_challenge.hist()\nax.set_title('Distribution of Anatomical Sites Training Set')\nax.tick_params(axis='x', labelrotation = 45, labelsize = 12)","metadata":{"execution":{"iopub.status.busy":"2023-03-28T18:57:43.995035Z","iopub.execute_input":"2023-03-28T18:57:43.995389Z","iopub.status.idle":"2023-03-28T18:57:44.306421Z","shell.execute_reply.started":"2023-03-28T18:57:43.995358Z","shell.execute_reply":"2023-03-28T18:57:44.304898Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# **Test Set exploration**","metadata":{}},{"cell_type":"code","source":"test.head()","metadata":{"execution":{"iopub.status.busy":"2023-03-28T18:57:44.308138Z","iopub.execute_input":"2023-03-28T18:57:44.308588Z","iopub.status.idle":"2023-03-28T18:57:44.322788Z","shell.execute_reply.started":"2023-03-28T18:57:44.30855Z","shell.execute_reply":"2023-03-28T18:57:44.321351Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test.shape","metadata":{"execution":{"iopub.status.busy":"2023-03-28T18:57:44.324723Z","iopub.execute_input":"2023-03-28T18:57:44.325346Z","iopub.status.idle":"2023-03-28T18:57:44.336942Z","shell.execute_reply.started":"2023-03-28T18:57:44.325286Z","shell.execute_reply":"2023-03-28T18:57:44.335188Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#print the number of missing values from each col in train\nfor col in test.columns:\n    print(col + ' missing values: ' + str(test[col].isna().sum()))\n","metadata":{"execution":{"iopub.status.busy":"2023-03-28T18:57:44.338947Z","iopub.execute_input":"2023-03-28T18:57:44.339506Z","iopub.status.idle":"2023-03-28T18:57:44.35365Z","shell.execute_reply.started":"2023-03-28T18:57:44.339457Z","shell.execute_reply":"2023-03-28T18:57:44.35256Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#how many images are associated with each patient?\nindividuals_count = train.groupby('patient_id').count()\n\nindividuals_count.head()","metadata":{"execution":{"iopub.status.busy":"2023-03-28T18:57:44.355314Z","iopub.execute_input":"2023-03-28T18:57:44.355707Z","iopub.status.idle":"2023-03-28T18:57:44.393643Z","shell.execute_reply.started":"2023-03-28T18:57:44.355674Z","shell.execute_reply":"2023-03-28T18:57:44.392018Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#show the disribution of image counts\nfig, ax = plt.subplots(figsize=(25,10))\nax = sns.histplot(data=individuals_count, x='image_name')\nax.set_title('Images per Patient')\nax.set_xlabel('Unique Images per Patient')\nax.set_ylabel('Number of Patients')\nax.set_xticks(ticks=range(0,120,10))\n\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2023-03-28T18:57:44.395814Z","iopub.execute_input":"2023-03-28T18:57:44.396235Z","iopub.status.idle":"2023-03-28T18:57:44.812554Z","shell.execute_reply.started":"2023-03-28T18:57:44.396202Z","shell.execute_reply":"2023-03-28T18:57:44.811013Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print('the mean number of images per patient is: {}'.format(round(individuals_count.image_name.mean(),2)))\nprint('the median number of images per patient is: {}'.format(round(individuals_count.image_name.median(),2)))\nprint('the standard deviation of the number of images per patient is: {}'.format(round(individuals_count.image_name.std(),2)))","metadata":{"execution":{"iopub.status.busy":"2023-03-28T18:57:44.814567Z","iopub.execute_input":"2023-03-28T18:57:44.815079Z","iopub.status.idle":"2023-03-28T18:57:44.827026Z","shell.execute_reply.started":"2023-03-28T18:57:44.815031Z","shell.execute_reply":"2023-03-28T18:57:44.825471Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#check out the distribution of positive cases grouped by patient\nindividuals_sum = train.groupby('patient_id').sum()\n\nprint(individuals_sum.target.describe())\n\n#fig, ax = plt.subplots(figsize=(18,10))\nax = sns.histplot(data=individuals_sum, x='target', bins=10)\nax.set_title('Quantity of Malignant Tumors per Patient')\nax.set_xlabel('Sum of Positives')\nax.set_ylabel('Number of Patients')\n#ax.set_xticks(ticks=range(0,20))\n\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2023-03-28T18:57:44.82876Z","iopub.execute_input":"2023-03-28T18:57:44.8292Z","iopub.status.idle":"2023-03-28T18:57:45.187911Z","shell.execute_reply.started":"2023-03-28T18:57:44.829165Z","shell.execute_reply":"2023-03-28T18:57:45.186315Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Another pass at missing sex and age values**","metadata":{}},{"cell_type":"code","source":"#let's pull out individuals from individuals_count who have fewer counts of sex or age_approx than image_name\nindividuals_count.loc[(individuals_count['sex'] < individuals_count['image_name']) | (individuals_count['age_approx'] < individuals_count['image_name'])]","metadata":{"execution":{"iopub.status.busy":"2023-03-28T18:57:45.18986Z","iopub.execute_input":"2023-03-28T18:57:45.190405Z","iopub.status.idle":"2023-03-28T18:57:45.210884Z","shell.execute_reply.started":"2023-03-28T18:57:45.190356Z","shell.execute_reply":"2023-03-28T18:57:45.209366Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"pats = ['IP_0550106','IP_5205991', 'IP_9835712']\nindividuals_sum.reset_index(inplace=True)\n\n\nindividuals_sum.query('patient_id in @pats')","metadata":{"execution":{"iopub.status.busy":"2023-03-28T18:57:45.212569Z","iopub.execute_input":"2023-03-28T18:57:45.212924Z","iopub.status.idle":"2023-03-28T18:57:45.23604Z","shell.execute_reply.started":"2023-03-28T18:57:45.212894Z","shell.execute_reply":"2023-03-28T18:57:45.23508Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print('percentage of missing patient data= {}%'.format(round((3+48+17)/len(train)*100,2)))","metadata":{"execution":{"iopub.status.busy":"2023-03-28T18:57:45.237572Z","iopub.execute_input":"2023-03-28T18:57:45.237945Z","iopub.status.idle":"2023-03-28T18:57:45.245195Z","shell.execute_reply.started":"2023-03-28T18:57:45.237906Z","shell.execute_reply":"2023-03-28T18:57:45.24381Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#drop all rows from the train dataframe that are associated with the 3 patients identified above.\ntrain.drop(train[(train['patient_id'] == 'IP_0550106') | (train['patient_id'] == 'IP_5205991') |(train['patient_id'] == 'IP_9835712')].index, inplace=True)","metadata":{"execution":{"iopub.status.busy":"2023-03-28T18:57:45.247062Z","iopub.execute_input":"2023-03-28T18:57:45.248265Z","iopub.status.idle":"2023-03-28T18:57:45.271657Z","shell.execute_reply.started":"2023-03-28T18:57:45.248204Z","shell.execute_reply":"2023-03-28T18:57:45.270612Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#check for any more missing values:\nfor col in train.columns:\n    print(col + ' missing values: ' + str(train[col].isna().sum()))","metadata":{"execution":{"iopub.status.busy":"2023-03-28T18:57:45.273546Z","iopub.execute_input":"2023-03-28T18:57:45.274069Z","iopub.status.idle":"2023-03-28T18:57:45.298142Z","shell.execute_reply.started":"2023-03-28T18:57:45.27402Z","shell.execute_reply":"2023-03-28T18:57:45.296678Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Relationships between positive cases and other variables.**","metadata":{}},{"cell_type":"code","source":"#make sure index is the patient id so we can join these aggregate dfs\n\nindividuals_sum.set_index('patient_id', inplace=True)","metadata":{"execution":{"iopub.status.busy":"2023-03-28T18:57:45.307234Z","iopub.execute_input":"2023-03-28T18:57:45.307653Z","iopub.status.idle":"2023-03-28T18:57:45.315209Z","shell.execute_reply.started":"2023-03-28T18:57:45.307619Z","shell.execute_reply":"2023-03-28T18:57:45.313616Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"patients = individuals_count.join(individuals_sum, lsuffix='_count', rsuffix='_sum')\npatients.drop(columns=['sex','age_approx_count','anatom_site_general_challenge','diagnosis', 'benign_malignant','target_count', 'age_approx_sum'], inplace=True)\npatients.rename(columns={'image_name':'n_images'}, inplace=True)\npatients.head()","metadata":{"execution":{"iopub.status.busy":"2023-03-28T18:57:45.319353Z","iopub.execute_input":"2023-03-28T18:57:45.31982Z","iopub.status.idle":"2023-03-28T18:57:45.338027Z","shell.execute_reply.started":"2023-03-28T18:57:45.319781Z","shell.execute_reply":"2023-03-28T18:57:45.336438Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#join with train df to include sex and age data for each patient\npatients = patients.join(train.set_index('patient_id'), on='patient_id')","metadata":{"execution":{"iopub.status.busy":"2023-03-28T18:57:45.340034Z","iopub.execute_input":"2023-03-28T18:57:45.340675Z","iopub.status.idle":"2023-03-28T18:57:45.373526Z","shell.execute_reply.started":"2023-03-28T18:57:45.340624Z","shell.execute_reply":"2023-03-28T18:57:45.371916Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#clean it up\npatients.reset_index(inplace=True)\npatients.drop_duplicates(subset='patient_id', inplace=True)\npatients.drop(columns=['image_name','anatom_site_general_challenge', 'diagnosis',   'benign_malignant', 'target'], inplace=True)\npatients.head()","metadata":{"execution":{"iopub.status.busy":"2023-03-28T18:57:45.375634Z","iopub.execute_input":"2023-03-28T18:57:45.376204Z","iopub.status.idle":"2023-03-28T18:57:45.413935Z","shell.execute_reply.started":"2023-03-28T18:57:45.376154Z","shell.execute_reply":"2023-03-28T18:57:45.412603Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#plot n_images v. target_sum\nax1 = sns.scatterplot(data=patients, x='n_images', y ='target_sum', hue='sex')\nax1.set_title('n_images per patient v. target_sum')\n#ax1.tick_params(axis='x', labelrotation = 45, labelsize = 12)","metadata":{"execution":{"iopub.status.busy":"2023-03-28T18:57:45.415709Z","iopub.execute_input":"2023-03-28T18:57:45.41608Z","iopub.status.idle":"2023-03-28T18:57:45.820508Z","shell.execute_reply.started":"2023-03-28T18:57:45.416047Z","shell.execute_reply":"2023-03-28T18:57:45.819117Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"ax1 = sns.violinplot(data=patients, y='n_images', x ='target_sum')\nax1.set_title('n_images per patient v. target_sum')\n","metadata":{"execution":{"iopub.status.busy":"2023-03-28T18:57:45.822388Z","iopub.execute_input":"2023-03-28T18:57:45.822772Z","iopub.status.idle":"2023-03-28T18:57:46.17603Z","shell.execute_reply.started":"2023-03-28T18:57:45.822741Z","shell.execute_reply":"2023-03-28T18:57:46.174627Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"ax1 = sns.stripplot(data=patients, y='target_sum', x ='sex')\nax1.set_title('target_sum distribution by gender')","metadata":{"execution":{"iopub.status.busy":"2023-03-28T18:57:46.177772Z","iopub.execute_input":"2023-03-28T18:57:46.178196Z","iopub.status.idle":"2023-03-28T18:57:46.414512Z","shell.execute_reply.started":"2023-03-28T18:57:46.178159Z","shell.execute_reply":"2023-03-28T18:57:46.41288Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#plot age_approx v target_sum\nax1 = sns.stripplot(data=patients, x='age_approx', y ='target_sum')\nax1.set_title('age_approx v. target_sum')\n","metadata":{"execution":{"iopub.status.busy":"2023-03-28T18:57:46.416213Z","iopub.execute_input":"2023-03-28T18:57:46.416916Z","iopub.status.idle":"2023-03-28T18:57:46.831069Z","shell.execute_reply.started":"2023-03-28T18:57:46.416872Z","shell.execute_reply":"2023-03-28T18:57:46.829586Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#plot n_images v. target_sum\nax1 = sns.histplot(data=patients, x='age_approx', bins=16)\nax1.set_title('Ditribution of Patient Ages in Dataset')","metadata":{"execution":{"iopub.status.busy":"2023-03-28T18:57:46.832981Z","iopub.execute_input":"2023-03-28T18:57:46.833412Z","iopub.status.idle":"2023-03-28T18:57:47.144207Z","shell.execute_reply.started":"2023-03-28T18:57:46.833377Z","shell.execute_reply":"2023-03-28T18:57:47.143353Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Visualizing Images**\n","metadata":{}},{"cell_type":"code","source":"#open one image\n\n#import ImageIO\nimport imageio.v2 as imageio\n\n#load an image\nim = imageio.imread('../input/siim-isic-melanoma-classification/jpeg/train/ISIC_0015719.jpg')\n\n#plot image\nplt.imshow(im)\nplt.axis('off')\n#plt.show()\n\n#print metadata\nprint(im.meta.keys())","metadata":{"execution":{"iopub.status.busy":"2023-03-28T18:57:47.145545Z","iopub.execute_input":"2023-03-28T18:57:47.146059Z","iopub.status.idle":"2023-03-28T18:57:51.198335Z","shell.execute_reply.started":"2023-03-28T18:57:47.146028Z","shell.execute_reply":"2023-03-28T18:57:51.196899Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Plot malignant lesions**","metadata":{}},{"cell_type":"code","source":"#Now, let's see if we can show all the malignant images\n\n#make a list of image names that have the malignant target value = 1\nmal_ims = train[train['target']==1].image_name\n\n#convert those image names into path names to access each photo\n#mal_im_paths = ['../input/siim-isic-melanoma-classification/jpeg/train/' + str(im) + '.jpg' for im in mal_ims]","metadata":{"execution":{"iopub.status.busy":"2023-03-28T18:57:51.200155Z","iopub.execute_input":"2023-03-28T18:57:51.201253Z","iopub.status.idle":"2023-03-28T18:57:51.209805Z","shell.execute_reply.started":"2023-03-28T18:57:51.201211Z","shell.execute_reply":"2023-03-28T18:57:51.208519Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#plot all malignant images\n\nfig, axs = plt.subplots(nrows=146, ncols=4, tight_layout=True, figsize=(15,365))\nfig.suptitle('Malignant Lesions', fontsize=14)\n\nfor ax, image in zip(axs.ravel(), mal_ims):\n    path = '../input/siim-isic-melanoma-classification/jpeg/train/' + str(image) + '.jpg'\n    im = imageio.imread(path)\n    ax.imshow(im)\n    ax.axis('off')\n    ax.set_title(image)","metadata":{"execution":{"iopub.status.busy":"2023-03-28T18:57:51.21216Z","iopub.execute_input":"2023-03-28T18:57:51.212613Z","iopub.status.idle":"2023-03-28T19:02:04.970422Z","shell.execute_reply.started":"2023-03-28T18:57:51.212559Z","shell.execute_reply":"2023-03-28T19:02:04.96882Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import random\nrandom.seed(42)\n\n#make a list of image names that have the malignant target value = 0\nben_ims = train[train['target']==0].image_name\n\n#take a random sample of 100 of these images\nrand_ben_ims = random.sample(list(ben_ims),100)","metadata":{"execution":{"iopub.status.busy":"2023-03-28T19:02:04.972505Z","iopub.execute_input":"2023-03-28T19:02:04.973107Z","iopub.status.idle":"2023-03-28T19:02:04.992012Z","shell.execute_reply.started":"2023-03-28T19:02:04.973045Z","shell.execute_reply":"2023-03-28T19:02:04.990839Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#plot the subset of 100 benign images\n\nfig, axs = plt.subplots(nrows=25, ncols=4, tight_layout=True, figsize=(15,62.5))\nfig.suptitle('Subset of Benign Lesions', fontsize=14, y=0.98)\n\nfor ax, image in zip(axs.ravel(), rand_ben_ims):\n    path = '../input/siim-isic-melanoma-classification/jpeg/train/' + str(image) + '.jpg'\n    im = imageio.imread(path)\n    ax.imshow(im)\n    ax.axis('off')\n    ax.set_title(image)","metadata":{"execution":{"iopub.status.busy":"2023-03-28T19:02:04.993814Z","iopub.execute_input":"2023-03-28T19:02:04.994668Z","iopub.status.idle":"2023-03-28T19:05:02.129039Z","shell.execute_reply.started":"2023-03-28T19:02:04.994633Z","shell.execute_reply":"2023-03-28T19:05:02.127561Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# System\nimport cv2\nimport os, os.path\nfrom PIL import Image             \nimport gc\nimport time\nimport datetime\n\n# Basics\nimport pandas as pd\nimport numpy as np\nimport random\nimport seaborn as sns\nimport matplotlib\nimport matplotlib.pyplot as plt\n%matplotlib inline\n\nfrom tqdm.notebook import tqdm     \n\n# SKlearn\nfrom sklearn.model_selection import StratifiedKFold, GroupKFold\nfrom sklearn.metrics import accuracy_score, roc_auc_score, confusion_matrix\nfrom sklearn.preprocessing import LabelEncoder\nfrom sklearn.preprocessing import OneHotEncoder\nfrom sklearn import preprocessing\n\nfrom skimage import io\n\n# PyTorch\nimport torch\nimport torchvision\nimport torch.nn as nn\nimport torch.nn.functional as F\nfrom torch.utils.data import Dataset, DataLoader, Subset\n\nfrom torchvision.models import resnet34\nfrom torchvision import transforms\n\nimport warnings\nwarnings.filterwarnings(\"ignore\")\n\nprint(\"PyTorch Version: \",torch.__version__)\nprint(\"Torchvision Version: \",torchvision.__version__)","metadata":{"execution":{"iopub.status.busy":"2023-03-28T19:05:02.131376Z","iopub.execute_input":"2023-03-28T19:05:02.131895Z","iopub.status.idle":"2023-03-28T19:05:04.96749Z","shell.execute_reply.started":"2023-03-28T19:05:02.131854Z","shell.execute_reply":"2023-03-28T19:05:04.966448Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# For reproducibility\nseed = 1234\n\nnp.random.seed(seed)\nrandom.seed(seed)\ntorch.manual_seed(seed)\ntorch.cuda.manual_seed(seed)\n","metadata":{"execution":{"iopub.status.busy":"2023-03-28T19:05:04.969369Z","iopub.execute_input":"2023-03-28T19:05:04.970615Z","iopub.status.idle":"2023-03-28T19:05:04.979918Z","shell.execute_reply.started":"2023-03-28T19:05:04.970568Z","shell.execute_reply":"2023-03-28T19:05:04.978691Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')\nprint('Device available now:', device)","metadata":{"execution":{"iopub.status.busy":"2023-03-28T19:05:04.981671Z","iopub.execute_input":"2023-03-28T19:05:04.983632Z","iopub.status.idle":"2023-03-28T19:05:04.999673Z","shell.execute_reply.started":"2023-03-28T19:05:04.983572Z","shell.execute_reply":"2023-03-28T19:05:04.998186Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df = pd.read_csv('../input/siim-isic-melanoma-classification/train.csv')[1:1000]\n# train_df = train_df.head(1000)","metadata":{"execution":{"iopub.status.busy":"2023-03-28T19:05:05.001841Z","iopub.execute_input":"2023-03-28T19:05:05.002768Z","iopub.status.idle":"2023-03-28T19:05:05.076899Z","shell.execute_reply.started":"2023-03-28T19:05:05.002705Z","shell.execute_reply":"2023-03-28T19:05:05.075812Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df.target.value_counts()","metadata":{"execution":{"iopub.status.busy":"2023-03-28T19:05:05.078653Z","iopub.execute_input":"2023-03-28T19:05:05.079386Z","iopub.status.idle":"2023-03-28T19:05:05.090386Z","shell.execute_reply.started":"2023-03-28T19:05:05.079345Z","shell.execute_reply":"2023-03-28T19:05:05.088734Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"len(train_df)","metadata":{"execution":{"iopub.status.busy":"2023-03-28T19:05:05.092869Z","iopub.execute_input":"2023-03-28T19:05:05.093462Z","iopub.status.idle":"2023-03-28T19:05:05.108004Z","shell.execute_reply.started":"2023-03-28T19:05:05.093411Z","shell.execute_reply":"2023-03-28T19:05:05.106362Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class MelanomaDataset(Dataset):\n    \n    def __init__(self, dataframe,is_train=True, is_valid=False, is_test=False):\n        self.dataframe, self.is_train, self.is_valid = dataframe, is_train, is_valid\n        \n        # Data Augmentation\n        if is_train or is_test:\n            self.transform = transforms.Compose([transforms.ToPILImage(),\n                                                 transforms.RandomResizedCrop((224,224), scale=(0.4, 1.0)),\n                                                 transforms.RandomHorizontalFlip(p = 0.3),\n                                                 transforms.RandomVerticalFlip(p = 0.3),\n                                                 transforms.ToTensor(),\n                                                 transforms.Normalize((0.485, 0.456, 0.406), (0.229, 0.224, 0.225))])\n        else:\n            self.transform = transforms.Compose([transforms.ToPILImage(),\n                                                 transforms.Resize((224,224)),\n                                                 transforms.ToTensor(),\n                                                 transforms.Normalize((0.485, 0.456, 0.406), (0.229, 0.224, 0.225))])\n            \n    def __len__(self):\n        return len(self.dataframe)\n    \n    def __getitem__(self, index):\n        # Select path and read image\n        img_name = self.dataframe['image_name'][index]\n        image_path = f'../input/siim-isic-melanoma-classification/jpeg/train/{img_name}.jpg'\n        image = io.imread(image_path)\n        \n        # Apply transforms\n        image = self.transform(image)\n\n        \n        # If train/valid: image + class | If test: only image\n        if self.is_train or self.is_valid:\n            return (image, self.dataframe['target'][index])\n        else:\n            return (image)","metadata":{"execution":{"iopub.status.busy":"2023-03-28T19:05:05.109908Z","iopub.execute_input":"2023-03-28T19:05:05.11047Z","iopub.status.idle":"2023-03-28T19:05:05.125812Z","shell.execute_reply.started":"2023-03-28T19:05:05.110433Z","shell.execute_reply":"2023-03-28T19:05:05.124359Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(resnet34(pretrained=True))","metadata":{"execution":{"iopub.status.busy":"2023-03-28T19:05:05.127875Z","iopub.execute_input":"2023-03-28T19:05:05.129202Z","iopub.status.idle":"2023-03-28T19:05:06.566829Z","shell.execute_reply.started":"2023-03-28T19:05:05.129124Z","shell.execute_reply":"2023-03-28T19:05:06.565739Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class ResNet34Network(nn.Module):\n    def __init__(self):\n        super().__init__()\n        \n        # Define Feature part (IMAGE)\n        self.features = resnet34(pretrained=True) # 1000 neurons out\n        \n        for param in self.features.parameters():\n            param.requires_grad = False\n  \n        # Define Classification part\n        self.classification = nn.Linear(1000, 1)\n        \n        \n    def forward(self, image):\n        # Image CNN\n        image = self.features(image)\n        \n        # Classifier\n        out = self.classification(image)\n        \n        return out","metadata":{"execution":{"iopub.status.busy":"2023-03-28T19:05:06.568297Z","iopub.execute_input":"2023-03-28T19:05:06.568842Z","iopub.status.idle":"2023-03-28T19:05:06.576164Z","shell.execute_reply.started":"2023-03-28T19:05:06.568809Z","shell.execute_reply":"2023-03-28T19:05:06.574898Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model = ResNet34Network()\nmodel = model.to(device)","metadata":{"execution":{"iopub.status.busy":"2023-03-28T19:05:06.577742Z","iopub.execute_input":"2023-03-28T19:05:06.578148Z","iopub.status.idle":"2023-03-28T19:05:07.092447Z","shell.execute_reply.started":"2023-03-28T19:05:06.578084Z","shell.execute_reply":"2023-03-28T19:05:07.091198Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(model)","metadata":{"execution":{"iopub.status.busy":"2023-03-28T19:05:07.094026Z","iopub.execute_input":"2023-03-28T19:05:07.094434Z","iopub.status.idle":"2023-03-28T19:05:07.102463Z","shell.execute_reply.started":"2023-03-28T19:05:07.0944Z","shell.execute_reply":"2023-03-28T19:05:07.101304Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Data object and Loader\ndataset = MelanomaDataset(train_df, is_train=True, is_valid=False, is_test=False)\nloader = DataLoader(dataset,batch_size=3, shuffle=True)","metadata":{"execution":{"iopub.status.busy":"2023-03-28T19:05:07.10412Z","iopub.execute_input":"2023-03-28T19:05:07.104716Z","iopub.status.idle":"2023-03-28T19:05:07.116102Z","shell.execute_reply.started":"2023-03-28T19:05:07.10468Z","shell.execute_reply":"2023-03-28T19:05:07.1147Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Get a sample\nfor image, labels in loader:\n    image_example = image\n    labels_example = torch.tensor(labels, dtype=torch.float32)\n    break\n    \nprint('Data shape:', image_example.shape)\nprint('Label:', labels_example)\n","metadata":{"execution":{"iopub.status.busy":"2023-03-28T19:05:07.118585Z","iopub.execute_input":"2023-03-28T19:05:07.119133Z","iopub.status.idle":"2023-03-28T19:05:07.839689Z","shell.execute_reply.started":"2023-03-28T19:05:07.119053Z","shell.execute_reply":"2023-03-28T19:05:07.83886Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"learning_rate = 0.0005\nepochs = 5\ndevice = torch.device(\"cuda:0\" if torch.cuda.is_available() else \"cpu\")\nprint(device)","metadata":{"execution":{"iopub.status.busy":"2023-03-28T19:05:07.841199Z","iopub.execute_input":"2023-03-28T19:05:07.841755Z","iopub.status.idle":"2023-03-28T19:05:07.84731Z","shell.execute_reply.started":"2023-03-28T19:05:07.84172Z","shell.execute_reply":"2023-03-28T19:05:07.846379Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Initiate the model\nmodel = model\nmodel = model.to(device)\noptimizer = torch.optim.Adam(filter(lambda p: p.requires_grad, model.parameters()), lr = learning_rate)\ncriterion = nn.BCEWithLogitsLoss()  ","metadata":{"execution":{"iopub.status.busy":"2023-03-28T19:05:07.848774Z","iopub.execute_input":"2023-03-28T19:05:07.849143Z","iopub.status.idle":"2023-03-28T19:05:07.864233Z","shell.execute_reply.started":"2023-03-28T19:05:07.849081Z","shell.execute_reply":"2023-03-28T19:05:07.862696Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_size = int(len(train_df) * 0.6)\nval_size = int(len(train_df) * 0.2)\ntest_size = int(len(train_df) * 0.2)\n\nprint(f'train size : {train_size}, val size : {val_size}, test size : {test_size}')","metadata":{"execution":{"iopub.status.busy":"2023-03-28T19:05:07.869081Z","iopub.execute_input":"2023-03-28T19:05:07.870655Z","iopub.status.idle":"2023-03-28T19:05:07.878388Z","shell.execute_reply.started":"2023-03-28T19:05:07.870595Z","shell.execute_reply":"2023-03-28T19:05:07.876476Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# --- Read in Data ---\ntrain_data = train_df.iloc[:train_size].reset_index(drop=True)\nvalid_data = train_df.iloc[train_size:train_size + val_size].reset_index(drop=True)\ntest_data = train_df.iloc[train_size + val_size:].reset_index(drop=True)\n# Create Data instances\ntrain = MelanomaDataset(train_data, is_train=True, is_valid=False, is_test=False)\nvalid = MelanomaDataset(valid_data, is_train=False, is_valid=True, is_test=False)\ntest = MelanomaDataset(valid_data, is_train=False, is_valid=True, is_test=False)\n\n# Dataloaders\ntrain_loader = DataLoader(train, batch_size=16, shuffle=True)\nvalid_loader = DataLoader(valid, batch_size=8, shuffle=True)\ntest_loader = DataLoader(valid, batch_size=1, shuffle=True)","metadata":{"execution":{"iopub.status.busy":"2023-03-28T19:05:07.881302Z","iopub.execute_input":"2023-03-28T19:05:07.881807Z","iopub.status.idle":"2023-03-28T19:05:07.895935Z","shell.execute_reply.started":"2023-03-28T19:05:07.881761Z","shell.execute_reply":"2023-03-28T19:05:07.894293Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# === EPOCHS ===\nfor epoch in range(epochs):\n    print(f'epoch : {epoch} start!')\n    start_time = time.time()\n    correct = 0\n    train_losses = 0\n\n    # === TRAIN ===\n    # Sets the module in training mode.\n    model.train()\n\n    for images, labels in train_loader:\n        # Save them to device\n        images = torch.tensor(images, device=device, dtype=torch.float32)\n        labels = torch.tensor(labels, device=device, dtype=torch.float32)\n\n        # Clear gradients first; very important, usually done BEFORE prediction\n        optimizer.zero_grad()\n\n        # Log Probabilities & Backpropagation\n        out = model(images)\n        loss = criterion(out, labels.unsqueeze(1))\n        loss.backward()\n        optimizer.step()\n\n        train_losses += loss.item()\n        # From log probabilities to actual probabilities\n        train_preds = torch.round(torch.sigmoid(out)) # 0 and 1\n        # Number of correct predictions\n        correct += (train_preds.cpu() == labels.cpu().unsqueeze(1)).sum().item()\n\n    # Compute Train Accuracy\n    train_acc = correct*100 / train_size\n    print(f'Epoch :{epoch + 1} - train accuracy: {train_acc}')\n    \n    # === EVAL ===\n    model.eval()\n\n    # Create matrix to store evaluation predictions (for accuracy)\n    valid_preds = torch.zeros(size = (len(valid_data), 1), device=device, dtype=torch.float32)\n\n\n    # Disables gradients (we need to be sure no optimization happens)\n    with torch.no_grad():\n        for k, (images, labels) in enumerate(valid_loader):\n            images = torch.tensor(images, device=device, dtype=torch.float32)\n            labels = torch.tensor(labels, device=device, dtype=torch.float32)\n\n            out = model(images)\n            pred = torch.sigmoid(out)\n            valid_preds[k*images.shape[0] : k*images.shape[0] + images.shape[0]] = pred\n\n        # Compute accuracy\n        valid_acc = accuracy_score(valid_data['target'].values, \n                                           torch.round(valid_preds.cpu()))*100\n        \n        # Compute ROC\n        valid_roc = roc_auc_score(valid_data['target'].values, \n                                          valid_preds.cpu())\n\n        # Compute time on Train + Eval\n        duration = str(datetime.timedelta(seconds=time.time() - start_time))[:7]\n\n\n        # PRINT INFO\n        print('{} | Epoch: {}/{} | Loss: {:.4} | Train Acc: {:.3} | Valid Acc: {:.3} ROC: {:.3}'.\\\n                    format(duration, epoch+1, epochs, train_losses, train_acc, valid_acc,valid_roc))\n        \n        \ntorch.save(model.state_dict(), './model.pt')\n\nfrom IPython.display import FileLink\nFileLink(r'model.pt')","metadata":{"execution":{"iopub.status.busy":"2023-03-28T19:05:07.899006Z","iopub.execute_input":"2023-03-28T19:05:07.899591Z","iopub.status.idle":"2023-03-28T19:44:19.83191Z","shell.execute_reply.started":"2023-03-28T19:05:07.899541Z","shell.execute_reply":"2023-03-28T19:44:19.830314Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def check_accuracy(loader, model):\n    num_correct = 0\n    num_samples = 0\n    model.eval()\n    \n    with torch.no_grad():\n        for x, y in loader:\n            x = x.to(device=device)\n            y = y.to(device=device)\n            \n            scores = model(x)\n            _, predictions = scores.max(1)\n            num_correct += (predictions == y).sum()\n            num_samples += predictions.size(0)\n        \n        print(f'Got {num_correct} / {num_samples} with Test Accuracy {float(num_correct)/float(num_samples)*100:.2f}') ","metadata":{"execution":{"iopub.status.busy":"2023-03-28T19:44:19.834618Z","iopub.execute_input":"2023-03-28T19:44:19.835217Z","iopub.status.idle":"2023-03-28T19:44:19.843773Z","shell.execute_reply.started":"2023-03-28T19:44:19.835165Z","shell.execute_reply":"2023-03-28T19:44:19.842639Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"check_accuracy(test_loader,model)","metadata":{"execution":{"iopub.status.busy":"2023-03-28T19:44:19.845348Z","iopub.execute_input":"2023-03-28T19:44:19.846827Z","iopub.status.idle":"2023-03-28T19:46:24.255658Z","shell.execute_reply.started":"2023-03-28T19:44:19.846773Z","shell.execute_reply":"2023-03-28T19:46:24.254199Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\n# summarize history for loss\nplt.plot(history.history['loss'])\nplt.plot(history.history['val_loss'])\nplt.title('ResNet36 Model Loss')\nplt.ylabel('Loss')\nplt.xlabel('Epoch')\nplt.legend(['train loss', 'test loss'], loc='upper left')\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2023-03-28T21:49:24.207387Z","iopub.execute_input":"2023-03-28T21:49:24.208407Z","iopub.status.idle":"2023-03-28T21:49:24.500265Z","shell.execute_reply.started":"2023-03-28T21:49:24.208363Z","shell.execute_reply":"2023-03-28T21:49:24.498349Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"lr.lr_find()\nlr.sched.plot()","metadata":{"execution":{"iopub.status.busy":"2023-03-28T22:07:52.726474Z","iopub.execute_input":"2023-03-28T22:07:52.727839Z","iopub.status.idle":"2023-03-28T22:07:52.765155Z","shell.execute_reply.started":"2023-03-28T22:07:52.727767Z","shell.execute_reply":"2023-03-28T22:07:52.762939Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# **Building CNN Sequential Model**","metadata":{}},{"cell_type":"code","source":"import tensorflow as tf \nimport tensorflow_addons as tfa \nimport numpy as np \nimport pandas as pd \nimport matplotlib.pyplot as plt\nfrom sklearn.model_selection import train_test_split","metadata":{"execution":{"iopub.status.busy":"2023-03-28T19:46:24.257794Z","iopub.execute_input":"2023-03-28T19:46:24.259065Z","iopub.status.idle":"2023-03-28T19:46:32.358036Z","shell.execute_reply.started":"2023-03-28T19:46:24.259008Z","shell.execute_reply":"2023-03-28T19:46:32.356495Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_img_dir = '../input/siim-isic-melanoma-classification/jpeg/train/'\ntest_img_dir = '../input/siim-isic-melanoma-classification/jpeg/test/'\ntrain = pd.read_csv('../input/siim-isic-melanoma-classification/train.csv')\ntest = pd.read_csv('../input/siim-isic-melanoma-classification/test.csv')\ntrain1= pd.read_csv('../input/siim-isic-melanoma-classification/train.csv')[1:1000]\ntest1 = pd.read_csv('../input/siim-isic-melanoma-classification/test.csv')","metadata":{"execution":{"iopub.status.busy":"2023-03-28T19:46:32.359687Z","iopub.execute_input":"2023-03-28T19:46:32.360064Z","iopub.status.idle":"2023-03-28T19:46:32.518142Z","shell.execute_reply.started":"2023-03-28T19:46:32.360032Z","shell.execute_reply":"2023-03-28T19:46:32.516707Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train.target.value_counts()","metadata":{"execution":{"iopub.status.busy":"2023-03-28T19:46:32.52046Z","iopub.execute_input":"2023-03-28T19:46:32.521766Z","iopub.status.idle":"2023-03-28T19:46:32.533674Z","shell.execute_reply.started":"2023-03-28T19:46:32.5217Z","shell.execute_reply":"2023-03-28T19:46:32.532179Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train1.target.value_counts()","metadata":{"execution":{"iopub.status.busy":"2023-03-28T19:46:32.535433Z","iopub.execute_input":"2023-03-28T19:46:32.536878Z","iopub.status.idle":"2023-03-28T19:46:32.545987Z","shell.execute_reply.started":"2023-03-28T19:46:32.53684Z","shell.execute_reply":"2023-03-28T19:46:32.544766Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# loading the data\ntrain_car = []\nfor image_name in train1.image_name:\n    train_car.append(tf.keras.preprocessing.image.img_to_array(\n        tf.keras.preprocessing.image.load_img(path = (train_img_dir + image_name + \".jpg\"), color_mode = \"rgba\", target_size = (128,128)), dtype=\"float32\")\n                    )","metadata":{"execution":{"iopub.status.busy":"2023-03-28T19:46:32.547708Z","iopub.execute_input":"2023-03-28T19:46:32.548348Z","iopub.status.idle":"2023-03-28T19:51:10.733815Z","shell.execute_reply.started":"2023-03-28T19:46:32.548277Z","shell.execute_reply":"2023-03-28T19:51:10.732219Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train1[\"img\"] = train_car\ntest[\"path\"] = [(test_img_dir + img_name + \".jpg\") for img_name in test.image_name]","metadata":{"execution":{"iopub.status.busy":"2023-03-28T19:51:10.73589Z","iopub.execute_input":"2023-03-28T19:51:10.736451Z","iopub.status.idle":"2023-03-28T19:51:10.751748Z","shell.execute_reply.started":"2023-03-28T19:51:10.736404Z","shell.execute_reply":"2023-03-28T19:51:10.750151Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# split the data\nx_train, x_cross_validation, y_train, y_cross_validation = train_test_split(train1.img, train1.target, test_size=0.2, shuffle = True, random_state=42)","metadata":{"execution":{"iopub.status.busy":"2023-03-28T19:51:10.753784Z","iopub.execute_input":"2023-03-28T19:51:10.754334Z","iopub.status.idle":"2023-03-28T19:51:10.767027Z","shell.execute_reply.started":"2023-03-28T19:51:10.754285Z","shell.execute_reply":"2023-03-28T19:51:10.765955Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# scale the pixels between 0 and 1\nx_train /= 255\nx_cross_validation /= 255\n# redefine dtypes\ny_train = np.array(y_train, dtype = \"float32\")\ny_cross_validation = np.array(y_cross_validation, dtype = \"float32\")\nx_train = np.array([np.array(val) for val in x_train])\nx_cross_validation = np.array([np.array(val) for val in x_cross_validation])","metadata":{"execution":{"iopub.status.busy":"2023-03-28T19:51:10.768583Z","iopub.execute_input":"2023-03-28T19:51:10.769202Z","iopub.status.idle":"2023-03-28T19:51:11.365072Z","shell.execute_reply.started":"2023-03-28T19:51:10.769168Z","shell.execute_reply":"2023-03-28T19:51:11.364125Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model1 = tf.keras.models.Sequential()\n\n# Convolutional & Max Pooling layers\n\nmodel1.add(tf.keras.layers.Conv2D(16, kernel_size=(3, 3), activation='relu', input_shape=(128,128,4)))\nmodel1.add(tf.keras.layers.MaxPooling2D(pool_size=(2, 2)))\n\nmodel1.add(tf.keras.layers.Conv2D(64, kernel_size=(3, 3), activation='relu'))\nmodel1.add(tf.keras.layers.MaxPooling2D(pool_size=(2, 2)))\n\nmodel1.add(tf.keras.layers.Conv2D(128, kernel_size=(3, 3), activation='relu'))\nmodel1.add(tf.keras.layers.MaxPooling2D(pool_size=(2, 2)))\n\n# Flatten & Dense layers\n\nmodel1.add(tf.keras.layers.Flatten())\nmodel1.add(tf.keras.layers.Dense(512, activation='relu'))\n\n# performing binary classification\nmodel1.add(tf.keras.layers.Dense(1, activation='sigmoid'))\n\nmodel1.compile(loss = tfa.losses.SigmoidFocalCrossEntropy(),\n              optimizer = tf.keras.optimizers.Adam(),\n              metrics = ['binary_accuracy',\n                       tf.keras.metrics.FalsePositives(),\n                       tf.keras.metrics.FalseNegatives(), \n                       tf.keras.metrics.TruePositives(),\n                       tf.keras.metrics.TrueNegatives()\n                      ]\n             )","metadata":{"execution":{"iopub.status.busy":"2023-03-28T19:51:11.366502Z","iopub.execute_input":"2023-03-28T19:51:11.367086Z","iopub.status.idle":"2023-03-28T19:51:11.684763Z","shell.execute_reply.started":"2023-03-28T19:51:11.367053Z","shell.execute_reply":"2023-03-28T19:51:11.683605Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model1.summary()","metadata":{"execution":{"iopub.status.busy":"2023-03-28T19:51:11.686469Z","iopub.execute_input":"2023-03-28T19:51:11.686915Z","iopub.status.idle":"2023-03-28T19:51:11.695879Z","shell.execute_reply.started":"2023-03-28T19:51:11.686878Z","shell.execute_reply":"2023-03-28T19:51:11.694276Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from tensorflow.keras.optimizers import Adam\n\nlearning_rate = .0001\noptimizer = Adam(learning_rate=learning_rate)\n\nmodel1.compile(loss=\"binary_crossentropy\", optimizer=optimizer, metrics=['accuracy'])","metadata":{"execution":{"iopub.status.busy":"2023-03-28T19:51:11.697771Z","iopub.execute_input":"2023-03-28T19:51:11.698283Z","iopub.status.idle":"2023-03-28T19:51:11.721034Z","shell.execute_reply.started":"2023-03-28T19:51:11.698231Z","shell.execute_reply":"2023-03-28T19:51:11.718955Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# saving the best model for our predictions\ncheckpointer = tf.keras.callbacks.ModelCheckpoint(filepath=\"weights.hdf5\", verbose=1, save_best_only=True)\n\nhistory = model1.fit(x = x_train,\n                    y = y_train,\n                    validation_data=(x_cross_validation, y_cross_validation),\n                    batch_size=10,\n                    epochs=10,\n                    verbose=1, \n                    callbacks=[checkpointer]\n                   )","metadata":{"execution":{"iopub.status.busy":"2023-03-28T19:51:11.723438Z","iopub.execute_input":"2023-03-28T19:51:11.723912Z","iopub.status.idle":"2023-03-28T19:52:59.801423Z","shell.execute_reply.started":"2023-03-28T19:51:11.723871Z","shell.execute_reply":"2023-03-28T19:52:59.799809Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# summarize history for accuracy\nplt.plot(history.history['accuracy'])\nplt.plot(history.history['val_accuracy'])\nplt.title('CNN Model Accuracy')\nplt.ylabel('accuracy')\nplt.xlabel('epoch')\nplt.legend(['train accuracy', ' Validation accuracy'], loc='upper left')\nplt.show()\n# summarize history for loss\nplt.plot(history.history['loss'])\nplt.plot(history.history['val_loss'])\nplt.title('CNN Model Loss')\nplt.ylabel('loss')\nplt.xlabel('epoch')\nplt.legend(['train loss', 'test loss'], loc='upper left')\nplt.show()\n","metadata":{"execution":{"iopub.status.busy":"2023-03-28T19:52:59.803585Z","iopub.execute_input":"2023-03-28T19:52:59.804027Z","iopub.status.idle":"2023-03-28T19:53:00.373756Z","shell.execute_reply.started":"2023-03-28T19:52:59.803989Z","shell.execute_reply":"2023-03-28T19:53:00.372201Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# input to be predicted\ntest = tf.keras.preprocessing.image.img_to_array(tf.keras.preprocessing.image.load_img(path = (\"../input/siim-isic-melanoma-classification/jpeg/test/ISIC_0052060.jpg\"), color_mode = \"rgba\", target_size = (128,128)), dtype=\"float32\")\ntest = test / 255\ntest=np.reshape(test,(1,128,128,4))\ntest = np.array(test)\n# load the best model\nmodel1.load_weights('weights.hdf5')\n\nmodel1.predict(test)","metadata":{"execution":{"iopub.status.busy":"2023-03-28T19:53:00.375828Z","iopub.execute_input":"2023-03-28T19:53:00.376345Z","iopub.status.idle":"2023-03-28T19:53:01.202941Z","shell.execute_reply.started":"2023-03-28T19:53:00.376298Z","shell.execute_reply":"2023-03-28T19:53:01.201321Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model1.compile(optimizer='Adam',\n              loss='categorical_crossentropy',\n              metrics=['accuracy'])","metadata":{"execution":{"iopub.status.busy":"2023-03-28T19:53:01.204992Z","iopub.execute_input":"2023-03-28T19:53:01.205548Z","iopub.status.idle":"2023-03-28T19:53:01.221759Z","shell.execute_reply.started":"2023-03-28T19:53:01.205501Z","shell.execute_reply":"2023-03-28T19:53:01.220197Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"score = model1.evaluate(x_cross_validation, y_cross_validation, verbose=0)","metadata":{"execution":{"iopub.status.busy":"2023-03-28T19:53:01.224188Z","iopub.execute_input":"2023-03-28T19:53:01.224784Z","iopub.status.idle":"2023-03-28T19:53:02.04231Z","shell.execute_reply.started":"2023-03-28T19:53:01.224731Z","shell.execute_reply":"2023-03-28T19:53:02.041004Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print('Test loss:', score[0])\nprint('Test accuracy:', score[1])","metadata":{"execution":{"iopub.status.busy":"2023-03-28T19:53:02.045147Z","iopub.execute_input":"2023-03-28T19:53:02.04617Z","iopub.status.idle":"2023-03-28T19:53:02.05343Z","shell.execute_reply.started":"2023-03-28T19:53:02.046081Z","shell.execute_reply":"2023-03-28T19:53:02.052263Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# **Building ResNet18**","metadata":{}},{"cell_type":"code","source":"\nfrom torchvision.models import resnet18\nfrom torchvision import transforms\n\nimport warnings\nwarnings.filterwarnings(\"ignore\")","metadata":{"execution":{"iopub.status.busy":"2023-03-28T19:53:02.055185Z","iopub.execute_input":"2023-03-28T19:53:02.056612Z","iopub.status.idle":"2023-03-28T19:53:02.066756Z","shell.execute_reply.started":"2023-03-28T19:53:02.056552Z","shell.execute_reply":"2023-03-28T19:53:02.065762Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(resnet18(pretrained=True))","metadata":{"execution":{"iopub.status.busy":"2023-03-28T19:53:02.068562Z","iopub.execute_input":"2023-03-28T19:53:02.069812Z","iopub.status.idle":"2023-03-28T19:53:02.961343Z","shell.execute_reply.started":"2023-03-28T19:53:02.069758Z","shell.execute_reply":"2023-03-28T19:53:02.959956Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class ResNet18Network(nn.Module):\n    def __init__(self):\n        super().__init__()\n        \n        # Define Feature part (IMAGE)\n        self.features = resnet18(pretrained=True) # 1000 neurons out\n        \n        for param in self.features.parameters():\n            param.requires_grad = False\n  \n        # Define Classification part\n        self.classification = nn.Linear(1000, 1)\n        \n        \n    def forward(self, image):\n        # Image CNN\n        image = self.features(image)\n        \n        # Classifier\n        out = self.classification(image)\n        \n        return out","metadata":{"execution":{"iopub.status.busy":"2023-03-28T19:53:02.96337Z","iopub.execute_input":"2023-03-28T19:53:02.963797Z","iopub.status.idle":"2023-03-28T19:53:02.973078Z","shell.execute_reply.started":"2023-03-28T19:53:02.963757Z","shell.execute_reply":"2023-03-28T19:53:02.971208Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model5 = ResNet18Network()\nmodel5 = model5.to(device)","metadata":{"execution":{"iopub.status.busy":"2023-03-28T19:53:02.987395Z","iopub.execute_input":"2023-03-28T19:53:02.988896Z","iopub.status.idle":"2023-03-28T19:53:03.229393Z","shell.execute_reply.started":"2023-03-28T19:53:02.988843Z","shell.execute_reply":"2023-03-28T19:53:03.228127Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model5 = model5\nmodel5 = model5.to(device)\noptimizer = torch.optim.Adam(filter(lambda p: p.requires_grad, model5.parameters()), lr = learning_rate)\ncriterion = nn.BCEWithLogitsLoss() ","metadata":{"execution":{"iopub.status.busy":"2023-03-28T19:53:03.231072Z","iopub.execute_input":"2023-03-28T19:53:03.232035Z","iopub.status.idle":"2023-03-28T19:53:03.244079Z","shell.execute_reply.started":"2023-03-28T19:53:03.231996Z","shell.execute_reply":"2023-03-28T19:53:03.242678Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# === EPOCHS ===\nfor epoch in range(epochs):\n    print(f'epoch : {epoch} start!')\n    start_time = time.time()\n    correct = 0\n    train_losses = 0\n\n    # === TRAIN ===\n    # Sets the module in training mode.\n    model5.train()\n\n    for images, labels in train_loader:\n        # Save them to device\n        images = torch.tensor(images, device=device, dtype=torch.float32)\n        labels = torch.tensor(labels, device=device, dtype=torch.float32)\n\n        # Clear gradients first; very important, usually done BEFORE prediction\n        optimizer.zero_grad()\n\n        # Log Probabilities & Backpropagation\n        out = model(images)\n        loss = criterion(out, labels.unsqueeze(1))\n        loss.backward()\n        optimizer.step()\n\n        train_losses += loss.item()\n        # From log probabilities to actual probabilities\n        train_preds = torch.round(torch.sigmoid(out)) # 0 and 1\n        # Number of correct predictions\n        correct += (train_preds.cpu() == labels.cpu().unsqueeze(1)).sum().item()\n\n    # Compute Train Accuracy\n    train_acc = correct*100 / train_size\n    print(f'Epoch :{epoch + 1} - train accuracy: {train_acc}')\n    \n    # === EVAL ===\n    model5.eval()\n\n    # Create matrix to store evaluation predictions (for accuracy)\n    valid_preds = torch.zeros(size = (len(valid_data), 1), device=device, dtype=torch.float32)\n\n\n    # Disables gradients (we need to be sure no optimization happens)\n    with torch.no_grad():\n        for k, (images, labels) in enumerate(valid_loader):\n            images = torch.tensor(images, device=device, dtype=torch.float32)\n            labels = torch.tensor(labels, device=device, dtype=torch.float32)\n\n            out = model5(images)\n            pred = torch.sigmoid(out)\n            valid_preds[k*images.shape[0] : k*images.shape[0] + images.shape[0]] = pred\n\n        # Compute accuracy\n        valid_acc = accuracy_score(valid_data['target'].values, \n                                           torch.round(valid_preds.cpu()))*100\n        \n        # Compute ROC\n        valid_roc = roc_auc_score(valid_data['target'].values, \n                                          valid_preds.cpu())\n\n        # Compute time on Train + Eval\n        duration = str(datetime.timedelta(seconds=time.time() - start_time))[:7]\n\n\n        # PRINT INFO\n        print('{} | Epoch: {}/{} | Loss: {:.4} | Train Acc: {:.3} | Valid Acc: {:.3} ROC: {:.3}'.\\\n                    format(duration, epoch+1, epochs, train_losses, train_acc, valid_acc,valid_roc))\n        \n        \ntorch.save(model5.state_dict(), './model5.pt')\n\nfrom IPython.display import FileLink\nFileLink(r'model5.pt')","metadata":{"execution":{"iopub.status.busy":"2023-03-28T19:53:03.246427Z","iopub.execute_input":"2023-03-28T19:53:03.24691Z","iopub.status.idle":"2023-03-28T20:30:30.074531Z","shell.execute_reply.started":"2023-03-28T19:53:03.24687Z","shell.execute_reply":"2023-03-28T20:30:30.073244Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def check_accuracy(loader, model5):\n    num_correct = 0\n    num_samples = 0\n    model5.eval()\n    \n    with torch.no_grad():\n        for x, y in loader:\n            x = x.to(device=device)\n            y = y.to(device=device)\n            \n            scores = model5(x)\n            _, predictions = scores.max(1)\n            num_correct += (predictions == y).sum()\n            num_samples += predictions.size(0)\n        \n        print(f'Got {num_correct} / {num_samples} with Test Accuracy {float(num_correct)/float(num_samples)*100:.2f}')","metadata":{"execution":{"iopub.status.busy":"2023-03-28T20:30:30.076168Z","iopub.execute_input":"2023-03-28T20:30:30.076572Z","iopub.status.idle":"2023-03-28T20:30:30.085041Z","shell.execute_reply.started":"2023-03-28T20:30:30.076537Z","shell.execute_reply":"2023-03-28T20:30:30.08349Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"check_accuracy(test_loader,model5)","metadata":{"execution":{"iopub.status.busy":"2023-03-28T20:30:30.086873Z","iopub.execute_input":"2023-03-28T20:30:30.087312Z","iopub.status.idle":"2023-03-28T20:32:26.668653Z","shell.execute_reply.started":"2023-03-28T20:30:30.087261Z","shell.execute_reply":"2023-03-28T20:32:26.667278Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# **Implemantation of VGG16**","metadata":{}},{"cell_type":"code","source":"import keras,os\nfrom keras.models import Sequential\nfrom keras.layers import Dense, Conv2D, MaxPool2D , Flatten\nfrom keras.preprocessing.image import ImageDataGenerator\nimport numpy as np","metadata":{"execution":{"iopub.status.busy":"2023-03-28T20:32:26.671177Z","iopub.execute_input":"2023-03-28T20:32:26.672134Z","iopub.status.idle":"2023-03-28T20:32:26.679525Z","shell.execute_reply.started":"2023-03-28T20:32:26.672056Z","shell.execute_reply":"2023-03-28T20:32:26.678283Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model3 = Sequential()\nmodel3.add(Conv2D(input_shape=(224,224,3),filters=64,kernel_size=(3,3),padding=\"same\", activation=\"relu\"))\nmodel3.add(Conv2D(filters=64,kernel_size=(3,3),padding=\"same\", activation=\"relu\"))\nmodel3.add(MaxPool2D(pool_size=(2,2),strides=(2,2)))\nmodel3.add(Conv2D(filters=128, kernel_size=(3,3), padding=\"same\", activation=\"relu\"))\nmodel3.add(Conv2D(filters=128, kernel_size=(3,3), padding=\"same\", activation=\"relu\"))\nmodel3.add(MaxPool2D(pool_size=(2,2),strides=(2,2)))\nmodel3.add(Conv2D(filters=256, kernel_size=(3,3), padding=\"same\", activation=\"relu\"))\nmodel3.add(Conv2D(filters=256, kernel_size=(3,3), padding=\"same\", activation=\"relu\"))\nmodel3.add(Conv2D(filters=256, kernel_size=(3,3), padding=\"same\", activation=\"relu\"))\nmodel3.add(MaxPool2D(pool_size=(2,2),strides=(2,2)))\nmodel3.add(Conv2D(filters=512, kernel_size=(3,3), padding=\"same\", activation=\"relu\"))\nmodel3.add(Conv2D(filters=512, kernel_size=(3,3), padding=\"same\", activation=\"relu\"))\nmodel3.add(Conv2D(filters=512, kernel_size=(3,3), padding=\"same\", activation=\"relu\"))\nmodel3.add(MaxPool2D(pool_size=(2,2),strides=(2,2)))\nmodel3.add(Conv2D(filters=512, kernel_size=(3,3), padding=\"same\", activation=\"relu\"))\nmodel3.add(Conv2D(filters=512, kernel_size=(3,3), padding=\"same\", activation=\"relu\"))\nmodel3.add(Conv2D(filters=512, kernel_size=(3,3), padding=\"same\", activation=\"relu\"))\nmodel3.add(MaxPool2D(pool_size=(2,2),strides=(2,2)))","metadata":{"execution":{"iopub.status.busy":"2023-03-28T20:32:26.681318Z","iopub.execute_input":"2023-03-28T20:32:26.681809Z","iopub.status.idle":"2023-03-28T20:32:26.95226Z","shell.execute_reply.started":"2023-03-28T20:32:26.681764Z","shell.execute_reply":"2023-03-28T20:32:26.950498Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model3.add(Flatten())\nmodel3.add(Dense(units=4096,activation=\"relu\"))\nmodel3.add(Dense(units=4096,activation=\"relu\"))\nmodel3.add(Dense(units=2, activation=\"softmax\"))","metadata":{"execution":{"iopub.status.busy":"2023-03-28T20:32:26.954008Z","iopub.execute_input":"2023-03-28T20:32:26.954435Z","iopub.status.idle":"2023-03-28T20:32:28.126496Z","shell.execute_reply.started":"2023-03-28T20:32:26.954398Z","shell.execute_reply":"2023-03-28T20:32:28.124528Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from tensorflow.keras.optimizers import Adam\nopt = Adam(lr=0.001)\nmodel3.compile(optimizer=opt, loss=keras.losses.categorical_crossentropy, metrics=['accuracy'])","metadata":{"execution":{"iopub.status.busy":"2023-03-28T20:32:28.129413Z","iopub.execute_input":"2023-03-28T20:32:28.130169Z","iopub.status.idle":"2023-03-28T20:32:28.144114Z","shell.execute_reply.started":"2023-03-28T20:32:28.130128Z","shell.execute_reply":"2023-03-28T20:32:28.14301Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model3.summary()","metadata":{"execution":{"iopub.status.busy":"2023-03-28T20:32:28.145504Z","iopub.execute_input":"2023-03-28T20:32:28.146173Z","iopub.status.idle":"2023-03-28T20:32:28.163161Z","shell.execute_reply.started":"2023-03-28T20:32:28.146138Z","shell.execute_reply":"2023-03-28T20:32:28.16149Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from keras.callbacks import ModelCheckpoint, EarlyStopping\ncheckpoint = ModelCheckpoint(\"vgg16_1.h5\", monitor='val_acc', verbose=1, save_best_only=True, save_weights_only=False, mode='auto', period=1)\nearly = EarlyStopping(monitor='val_acc', min_delta=0, patience=20, verbose=1, mode='auto')\nhistory = model3.fit(x = x_train,\n                    y = y_train,\n                    validation_data=(x_cross_validation, y_cross_validation),\n                    batch_size=50,\n                    epochs=50,\n                    verbose=1, \n                    callbacks=[checkpointer]\n                   )","metadata":{"execution":{"iopub.status.busy":"2023-03-28T20:32:28.165553Z","iopub.execute_input":"2023-03-28T20:32:28.166889Z","iopub.status.idle":"2023-03-28T20:32:28.666782Z","shell.execute_reply.started":"2023-03-28T20:32:28.166827Z","shell.execute_reply":"2023-03-28T20:32:28.664933Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\nimport os,cv2\nfrom IPython.display import Image\nfrom keras.preprocessing import image\nfrom keras import optimizers\nfrom keras import layers,models\nfrom keras.applications.imagenet_utils import preprocess_input\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nfrom keras import regularizers\nfrom keras.preprocessing.image import ImageDataGenerator\nfrom keras.applications.vgg16 import VGG16","metadata":{"execution":{"iopub.status.busy":"2023-03-28T20:32:28.668303Z","iopub.status.idle":"2023-03-28T20:32:28.669122Z","shell.execute_reply.started":"2023-03-28T20:32:28.668837Z","shell.execute_reply":"2023-03-28T20:32:28.668873Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_img_dir = '../input/siim-isic-melanoma-classification/jpeg/train/'\ntest_img_dir = '../input/siim-isic-melanoma-classification/jpeg/test/'\ntrain = pd.read_csv('../input/siim-isic-melanoma-classification/train.csv')\ntest = pd.read_csv('../input/siim-isic-melanoma-classification/test.csv')\ntrain1= pd.read_csv('../input/siim-isic-melanoma-classification/train.csv')[1:1000]\ntest1 = pd.read_csv('../input/siim-isic-melanoma-classification/test.csv')","metadata":{"execution":{"iopub.status.busy":"2023-03-28T20:32:28.670896Z","iopub.status.idle":"2023-03-28T20:32:28.671376Z","shell.execute_reply.started":"2023-03-28T20:32:28.67116Z","shell.execute_reply":"2023-03-28T20:32:28.671182Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train1.target.value_counts()","metadata":{"execution":{"iopub.status.busy":"2023-03-28T20:32:28.672891Z","iopub.status.idle":"2023-03-28T20:32:28.673345Z","shell.execute_reply.started":"2023-03-28T20:32:28.673136Z","shell.execute_reply":"2023-03-28T20:32:28.673157Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train1['target'] = train1['target'].astype(str)","metadata":{"execution":{"iopub.status.busy":"2023-03-28T20:32:28.675271Z","iopub.status.idle":"2023-03-28T20:32:28.675705Z","shell.execute_reply.started":"2023-03-28T20:32:28.675501Z","shell.execute_reply":"2023-03-28T20:32:28.675522Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"datagen=ImageDataGenerator(rescale=1./255)\nbatch_size=50","metadata":{"execution":{"iopub.status.busy":"2023-03-28T20:32:28.677425Z","iopub.status.idle":"2023-03-28T20:32:28.677842Z","shell.execute_reply.started":"2023-03-28T20:32:28.677645Z","shell.execute_reply":"2023-03-28T20:32:28.677665Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_generator=datagen.flow_from_dataframe(dataframe=train1[:901],directory=train_img_dir,x_col= 'image_name',\n                                            y_col='target',class_mode='raw',batch_size=batch_size,\n                                            target_size=(224,224))\n\n\nvalidation_generator=datagen.flow_from_dataframe(dataframe=train1[900:],directory=train_img_dir,x_col= 'image_name',\n                                                y_col='target',class_mode='raw',batch_size=10,\n                                                target_size=(224,224))","metadata":{"execution":{"iopub.status.busy":"2023-03-28T20:32:28.679604Z","iopub.status.idle":"2023-03-28T20:32:28.680023Z","shell.execute_reply.started":"2023-03-28T20:32:28.679822Z","shell.execute_reply":"2023-03-28T20:32:28.679842Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# **Building MobileNet** ","metadata":{}},{"cell_type":"code","source":"import tensorflow as tf\nfrom tensorflow.keras.applications.mobilenet import MobileNet\nfrom keras.layers import Dense, GlobalAveragePooling2D,Activation,Flatten\nmodel4 = tf.keras.applications.MobileNet()","metadata":{"execution":{"iopub.status.busy":"2023-03-28T20:32:28.682157Z","iopub.status.idle":"2023-03-28T20:32:28.682574Z","shell.execute_reply.started":"2023-03-28T20:32:28.682369Z","shell.execute_reply":"2023-03-28T20:32:28.682389Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model4.summary()","metadata":{"execution":{"iopub.status.busy":"2023-03-28T20:32:28.683881Z","iopub.status.idle":"2023-03-28T20:32:28.684308Z","shell.execute_reply.started":"2023-03-28T20:32:28.684086Z","shell.execute_reply":"2023-03-28T20:32:28.684128Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X=train1.drop('target',axis=1)\ny=train1['target']","metadata":{"execution":{"iopub.status.busy":"2023-03-28T20:32:28.686229Z","iopub.status.idle":"2023-03-28T20:32:28.686986Z","shell.execute_reply.started":"2023-03-28T20:32:28.686762Z","shell.execute_reply":"2023-03-28T20:32:28.686784Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from imblearn.over_sampling import RandomOverSampler\nros = RandomOverSampler(random_state=42)\nX_res, y_res = ros.fit_resample(X, y)","metadata":{"execution":{"iopub.status.busy":"2023-03-28T20:32:28.688836Z","iopub.status.idle":"2023-03-28T20:32:28.689264Z","shell.execute_reply.started":"2023-03-28T20:32:28.689032Z","shell.execute_reply":"2023-03-28T20:32:28.68905Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#mix X_res and y_res into train dataset again\nX_res['target']=y_res\ntrain_resampled=X_res","metadata":{"execution":{"iopub.status.busy":"2023-03-28T20:32:28.690367Z","iopub.status.idle":"2023-03-28T20:32:28.690759Z","shell.execute_reply.started":"2023-03-28T20:32:28.690568Z","shell.execute_reply":"2023-03-28T20:32:28.690587Z"},"trusted":true},"execution_count":null,"outputs":[]}]}