{"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":"from sklearn.metrics import f1_score\nimport pandas as pd\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport seaborn as sb\nimport PIL\nimport os\nfrom sklearn.utils import resample\nfrom sklearn.model_selection import train_test_split\nimport torch\nfrom torch.utils.data import Dataset, DataLoader\nimport torch.nn as nn\nfrom torchvision.transforms import ToTensor\nfrom torchvision.models import ResNet50_Weights\nfrom torchvision.models import resnet50\nfrom torch.optim.lr_scheduler import OneCycleLR\nfrom tqdm.notebook import tqdm\nimport torchvision\nfrom torchvision import transforms","metadata":{"execution":{"iopub.status.busy":"2023-06-19T06:49:31.925157Z","iopub.execute_input":"2023-06-19T06:49:31.925542Z","iopub.status.idle":"2023-06-19T06:49:31.933702Z","shell.execute_reply.started":"2023-06-19T06:49:31.925513Z","shell.execute_reply":"2023-06-19T06:49:31.932655Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Datacleaning\n\nEs werden immer parallel die test.csv und train.csv behandelt","metadata":{}},{"cell_type":"code","source":"df_train=pd.read_csv('/kaggle/input/siim-isic-melanoma-classification/train.csv')\ndf_test=pd.read_csv('/kaggle/input/siim-isic-melanoma-classification/test.csv')","metadata":{"execution":{"iopub.status.busy":"2023-06-19T06:49:31.936224Z","iopub.execute_input":"2023-06-19T06:49:31.936995Z","iopub.status.idle":"2023-06-19T06:49:32.017206Z","shell.execute_reply.started":"2023-06-19T06:49:31.936962Z","shell.execute_reply":"2023-06-19T06:49:32.016277Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_train.head()","metadata":{"execution":{"iopub.status.busy":"2023-06-19T06:49:32.018732Z","iopub.execute_input":"2023-06-19T06:49:32.019279Z","iopub.status.idle":"2023-06-19T06:49:32.035396Z","shell.execute_reply.started":"2023-06-19T06:49:32.019248Z","shell.execute_reply":"2023-06-19T06:49:32.034514Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_train.info()","metadata":{"execution":{"iopub.status.busy":"2023-06-19T06:49:32.038093Z","iopub.execute_input":"2023-06-19T06:49:32.038701Z","iopub.status.idle":"2023-06-19T06:49:32.106720Z","shell.execute_reply.started":"2023-06-19T06:49:32.038670Z","shell.execute_reply":"2023-06-19T06:49:32.105742Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_train.drop('patient_id',axis=1,inplace=True)\ndf_test.drop('patient_id',axis=1,inplace=True)\n\ndf_train['age_approx'] = df_train['age_approx'].fillna(df_train['age_approx'].mean())\ndf_test['age_approx'] = df_test['age_approx'].fillna(df_test['age_approx'].mean())\n\ndf_train = df_train.fillna(df_train.mode())\ndf_test = df_test.fillna(df_test.mode())","metadata":{"execution":{"iopub.status.busy":"2023-06-19T06:49:32.108131Z","iopub.execute_input":"2023-06-19T06:49:32.108542Z","iopub.status.idle":"2023-06-19T06:49:32.264605Z","shell.execute_reply.started":"2023-06-19T06:49:32.108511Z","shell.execute_reply":"2023-06-19T06:49:32.263614Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_train.head()","metadata":{"execution":{"iopub.status.busy":"2023-06-19T06:49:32.266132Z","iopub.execute_input":"2023-06-19T06:49:32.266485Z","iopub.status.idle":"2023-06-19T06:49:32.279531Z","shell.execute_reply.started":"2023-06-19T06:49:32.266452Z","shell.execute_reply":"2023-06-19T06:49:32.278476Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"translation={}\nfor column in ['sex', 'diagnosis','benign_malignant']:\n    translation[column]={}\n    key={}\n    unique_values=df_train[column].unique()\n    for i in range(unique_values.size):\n        translation[column][i]=unique_values[i]\n        key[unique_values[i]]=i\n    df_train[column] = df_train[column].map(key)\n\n\nkey={}\nunique_values=df_test['sex'].unique()\nfor i in range(unique_values.size):\n    key[unique_values[i]]=i\ndf_test['sex'] = df_test['sex'].map(key)","metadata":{"execution":{"iopub.status.busy":"2023-06-19T06:49:32.281205Z","iopub.execute_input":"2023-06-19T06:49:32.282237Z","iopub.status.idle":"2023-06-19T06:49:32.312909Z","shell.execute_reply.started":"2023-06-19T06:49:32.282201Z","shell.execute_reply":"2023-06-19T06:49:32.312052Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"traits = df_train['anatom_site_general_challenge'].str.get_dummies(sep=', ')\ndf_train = pd.concat([df_train, traits], axis=1)\ndf_train.drop('anatom_site_general_challenge', axis=1, inplace=True)\n\ntraits = df_test['anatom_site_general_challenge'].str.get_dummies(sep=', ')\ndf_testdf_test = pd.concat([df_train, traits], axis=1)\ndf_test.drop('anatom_site_general_challenge', axis=1, inplace=True)","metadata":{"execution":{"iopub.status.busy":"2023-06-19T06:49:32.314731Z","iopub.execute_input":"2023-06-19T06:49:32.315368Z","iopub.status.idle":"2023-06-19T06:49:32.664563Z","shell.execute_reply.started":"2023-06-19T06:49:32.315335Z","shell.execute_reply":"2023-06-19T06:49:32.663642Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_train.columns = df_train.columns.str.replace('/', '_').str.replace(' ', '_')\n\ndf_test.columns = df_test.columns.str.replace('/', '_').str.replace(' ', '_')","metadata":{"execution":{"iopub.status.busy":"2023-06-19T06:49:32.666021Z","iopub.execute_input":"2023-06-19T06:49:32.666367Z","iopub.status.idle":"2023-06-19T06:49:32.674525Z","shell.execute_reply.started":"2023-06-19T06:49:32.666335Z","shell.execute_reply":"2023-06-19T06:49:32.673529Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Explorative Datenanalyse","metadata":{}},{"cell_type":"code","source":"df_train.head()","metadata":{"execution":{"iopub.status.busy":"2023-06-19T06:49:32.679479Z","iopub.execute_input":"2023-06-19T06:49:32.679757Z","iopub.status.idle":"2023-06-19T06:49:32.696641Z","shell.execute_reply.started":"2023-06-19T06:49:32.679722Z","shell.execute_reply":"2023-06-19T06:49:32.695773Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"corr = df_train.corr()\nplt.figure(figsize=(9, 7))\ncmap = sb.diverging_palette(220, 10, as_cmap=True)\n\nsb.heatmap(corr, cmap=cmap, cbar=True, center=0)\n\nplt.xticks(fontsize=12)\nplt.yticks(fontsize=12)\nplt.xlabel('Features', fontsize=14)\nplt.ylabel('Features', fontsize=14)\nplt.title('Correlation Heatmap', fontsize=16)\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2023-06-19T06:49:32.698007Z","iopub.execute_input":"2023-06-19T06:49:32.698339Z","iopub.status.idle":"2023-06-19T06:49:33.162705Z","shell.execute_reply.started":"2023-06-19T06:49:32.698309Z","shell.execute_reply":"2023-06-19T06:49:33.161728Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Bis auf das Alter sind die Eigenschaften gibt es kaum eine Correlation zu den Zielwert. Die Einzigen Außnahmen sind 'benign_malignant' und 'diagnosis', welche direct mit dem Zielwert zusammenhängen. Der Unterschied zu 'diagnosis' sind Fehldiagnosen und 'benign_malignant' ist eine Spalte welche dieselben Informationen wie 'target' in anderer Form beinhaltet.","metadata":{}},{"cell_type":"code","source":"corr['target']['benign_malignant'] ","metadata":{"execution":{"iopub.status.busy":"2023-06-19T06:49:33.164193Z","iopub.execute_input":"2023-06-19T06:49:33.164624Z","iopub.status.idle":"2023-06-19T06:49:33.171394Z","shell.execute_reply.started":"2023-06-19T06:49:33.164591Z","shell.execute_reply":"2023-06-19T06:49:33.170373Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# plot sales by year and month as bar chart\ntarget_counts=df_train['target'].value_counts()\ntarget_counts.plot(kind='bar')\n\n\nplt.gca().spines['top'].set_visible(False)\nplt.gca().spines['right'].set_visible(False)\nplt.show()\nprint(target_counts)","metadata":{"execution":{"iopub.status.busy":"2023-06-19T06:49:33.172990Z","iopub.execute_input":"2023-06-19T06:49:33.173377Z","iopub.status.idle":"2023-06-19T06:49:33.404161Z","shell.execute_reply.started":"2023-06-19T06:49:33.173348Z","shell.execute_reply":"2023-06-19T06:49:33.400882Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"","metadata":{}},{"cell_type":"code","source":"def load_batch_of_images(image_names):\n    images=[]\n    for image_name in image_names:\n        images.append(PIL.Image.open('/kaggle/input/siim-isic-melanoma-classification/jpeg/train/'+image_name+'.jpg'))\n    return images\n","metadata":{"execution":{"iopub.status.busy":"2023-06-19T06:49:33.408772Z","iopub.execute_input":"2023-06-19T06:49:33.409759Z","iopub.status.idle":"2023-06-19T06:49:33.417929Z","shell.execute_reply.started":"2023-06-19T06:49:33.409720Z","shell.execute_reply":"2023-06-19T06:49:33.416350Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"example_images=load_batch_of_images(df_train['image_name'][:5])\nfig, ax=plt.subplots(1, len(example_images), figsize=(20, 20))\nfor i in range(len(example_images)):\n    ax[i].imshow(example_images[i])\n    ax[i].axis('off')\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2023-06-19T06:49:33.420353Z","iopub.execute_input":"2023-06-19T06:49:33.421147Z","iopub.status.idle":"2023-06-19T06:49:41.644012Z","shell.execute_reply.started":"2023-06-19T06:49:33.421116Z","shell.execute_reply":"2023-06-19T06:49:41.642994Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#entfernen der Spalten welche nicht genutzt werden sollen\ndf_train.drop('diagnosis',inplace=True,axis=1)\ndf_train.drop('benign_malignant',inplace=True,axis=1)","metadata":{"execution":{"iopub.status.busy":"2023-06-19T06:49:41.645638Z","iopub.execute_input":"2023-06-19T06:49:41.645988Z","iopub.status.idle":"2023-06-19T06:49:41.656070Z","shell.execute_reply.started":"2023-06-19T06:49:41.645956Z","shell.execute_reply":"2023-06-19T06:49:41.655150Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Separate the majority and minority classes\nmajority_class_data = df_train[df_train['target'] != 1]\nminority_class_data = df_train[df_train['target'] == 1]\n    \n# Sample a subset from the majority class data\nmajority_class_sample = resample(majority_class_data,\n                                     replace=False,\n                                     n_samples=3000,\n                                     random_state=42)\n    \n# Combine the minority class data with the sampled majority class data\nbalanced_data = pd.concat((majority_class_sample, minority_class_data))","metadata":{"execution":{"iopub.status.busy":"2023-06-19T06:49:41.657348Z","iopub.execute_input":"2023-06-19T06:49:41.658092Z","iopub.status.idle":"2023-06-19T06:49:41.675956Z","shell.execute_reply.started":"2023-06-19T06:49:41.658060Z","shell.execute_reply":"2023-06-19T06:49:41.674770Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class CustomDataset(Dataset):\n    def __init__(self, features,y, transform=None):\n        self.features = features.drop(['image_name'], axis=1).values\n        self.targets = y.values\n        self.image_paths = features['image_name'].values\n        self.image_folder = '/kaggle/input/siim-isic-melanoma-classification/jpeg/train/'\n        self.transform = transform\n\n    def __len__(self):\n        return len(self.features)\n\n    def __getitem__(self, index):\n        image = PIL.Image.open(self.image_folder+self.image_paths[index]+'.jpg').convert('RGB')\n        if self.transform is not None:\n            image = self.transform(image)\n        features = torch.tensor(self.features[index], dtype=torch.float32)\n        target = torch.tensor(self.targets[index], dtype=torch.long)\n        return features, target, image\n    \ntransform=torchvision.transforms.Compose([\n    transforms.ToTensor(),\n    transforms.Resize((300, 300), antialias=True),\n    # horizontal flip\n    transforms.RandomHorizontalFlip(p=0.5),\n    transforms.Normalize(mean=[0.485, 0.456, 0.406],\n                         std=[0.229, 0.224, 0.225])\n])","metadata":{"execution":{"iopub.status.busy":"2023-06-19T06:49:41.677754Z","iopub.execute_input":"2023-06-19T06:49:41.678121Z","iopub.status.idle":"2023-06-19T06:49:41.688524Z","shell.execute_reply.started":"2023-06-19T06:49:41.678087Z","shell.execute_reply":"2023-06-19T06:49:41.687466Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"batch_size=32\n#create a datasets with randomized order\nX_train, X_test, y_train, y_test = train_test_split(balanced_data.drop(['target'], axis=1), balanced_data['target'], test_size=0.85, random_state=42, shuffle=True)\ntrain_dataset=CustomDataset(X_train, y_train, transform)\ntest_dataset=CustomDataset(X_test, y_test, transform)\ntrain_loader=DataLoader(train_dataset, batch_size=batch_size, shuffle=True)\ntest_loader=DataLoader(test_dataset, batch_size=batch_size, shuffle=True)","metadata":{"execution":{"iopub.status.busy":"2023-06-19T06:49:41.689925Z","iopub.execute_input":"2023-06-19T06:49:41.690354Z","iopub.status.idle":"2023-06-19T06:49:41.705501Z","shell.execute_reply.started":"2023-06-19T06:49:41.690313Z","shell.execute_reply":"2023-06-19T06:49:41.704600Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#set device\nif torch.cuda.is_available():\n    device = torch.device(\"cuda\")\nelif torch.backends.mps.is_available():\n    device = torch.device(\"mps\")\nelse:\n    device = torch.device(\"cpu\")\n    \nprint(device)","metadata":{"execution":{"iopub.status.busy":"2023-06-19T06:49:41.706807Z","iopub.execute_input":"2023-06-19T06:49:41.707135Z","iopub.status.idle":"2023-06-19T06:49:41.718309Z","shell.execute_reply.started":"2023-06-19T06:49:41.707106Z","shell.execute_reply":"2023-06-19T06:49:41.717239Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# use a pretrained resnte50\n\nclass Model(nn.Module):\n    def __init__(self, p=0.2):\n        super().__init__()\n        self.resnet50=resnet50(weights=ResNet50_Weights.DEFAULT)\n        self.resnet50.fc=nn.Sequential(\n            nn.BatchNorm1d(2048),\n            nn.ReLU(),\n            nn.Dropout(0.5),\n            nn.Linear(2048, 1000),\n            nn.BatchNorm1d(1000),\n            nn.ReLU(),\n            nn.Dropout(0.5),\n            nn.Linear(1000, 2)\n        )\n        for param in self.resnet50.parameters():\n            param.requires_grad = False\n\n        for param in self.resnet50.fc.parameters():\n            param.requires_grad = True\n\n    def forward(self, xb):\n        return self.resnet50(xb)\n","metadata":{"execution":{"iopub.status.busy":"2023-06-19T06:49:41.720119Z","iopub.execute_input":"2023-06-19T06:49:41.720490Z","iopub.status.idle":"2023-06-19T06:49:41.730737Z","shell.execute_reply.started":"2023-06-19T06:49:41.720458Z","shell.execute_reply":"2023-06-19T06:49:41.729892Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"lr=0.01\n\nclass Learner():\n\n    def __init__(self, model, loss, train_loader, test_loader):\n        self.loss_fn = loss\n        self.model = model\n        self.train_loader = train_loader\n        self.test_loader = test_loader\n\n\n    def train_batch(self,  xb, yb, optimizer):\n        xb=xb.to(device)\n        yb=yb.to(device)\n        y_hat=model(xb)\n        loss = self.loss_fn(y_hat, yb)\n        optimizer.zero_grad()\n        loss.backward()\n        optimizer.step()\n        preds=torch.argmax(y_hat, dim=1)\n        return loss.item(), (preds==yb).sum().item()/len(yb)\n\n    def fit_one_cycle(self, lr):\n        model.train()\n        optimizer=torch.optim.Adam(model.parameters(), lr=lr)\n        scheduler=OneCycleLR(optimizer, max_lr=lr, steps_per_epoch=len(self.train_loader), epochs=1)\n        losses=[]\n        accs=[]\n        bar=tqdm(self.train_loader)\n        for features,yb, xb in bar:\n            loss, acc=self.train_batch(xb, yb, optimizer)\n            losses.append(loss)\n            accs.append(acc)\n            scheduler.step()\n            bar.set_description(f\"current lr: {scheduler.get_last_lr()}\")\n        return losses, np.mean(accs), self.get_accuracy()\n\n    def get_accuracy(self):\n        model.eval()\n        correct=0\n        for features,yb, xb in self.test_loader:\n            xb=xb.to(device)\n            yb=yb.to(device)\n            y_hat=self.model(xb)\n            y_pred=torch.argmax(y_hat, dim=1)\n            correct+=(y_pred==yb).sum().item()\n        return correct/len(self.test_loader.dataset)\n    \n    def get_f1_score(self):\n        model.eval()\n        y_true = []\n        y_pred = []\n        for features,yb, xb in self.test_loader:\n            xb=xb.to(device)\n            yb=yb.to(device)\n            y_hat=self.model(xb)\n            y_pred.extend(torch.argmax(y_hat, dim=1).cpu().tolist())\n            y_true.extend(yb.cpu().tolist())\n        return f1_score(y_true, y_pred, average='weighted')","metadata":{"execution":{"iopub.status.busy":"2023-06-19T06:49:41.732141Z","iopub.execute_input":"2023-06-19T06:49:41.732653Z","iopub.status.idle":"2023-06-19T06:49:41.748000Z","shell.execute_reply.started":"2023-06-19T06:49:41.732621Z","shell.execute_reply":"2023-06-19T06:49:41.747210Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model = Model().to(device)\n\nlearner = Learner(model, nn.CrossEntropyLoss(), train_loader, test_loader)","metadata":{"execution":{"iopub.status.busy":"2023-06-19T06:49:41.749057Z","iopub.execute_input":"2023-06-19T06:49:41.749653Z","iopub.status.idle":"2023-06-19T06:49:42.282458Z","shell.execute_reply.started":"2023-06-19T06:49:41.749623Z","shell.execute_reply":"2023-06-19T06:49:42.281339Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"losses, train_acc, test_acc=learner.fit_one_cycle(0.1)\nprint(\"Test accuracy: \", test_acc)\nprint(\"Train accuracy: \", train_acc)\nplt.plot(losses, label='loss')\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2023-06-19T06:49:42.284195Z","iopub.execute_input":"2023-06-19T06:49:42.284557Z","iopub.status.idle":"2023-06-19T07:18:37.879471Z","shell.execute_reply.started":"2023-06-19T06:49:42.284524Z","shell.execute_reply":"2023-06-19T07:18:37.878586Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"learner.get_f1_score()","metadata":{"execution":{"iopub.status.busy":"2023-06-19T07:18:37.881144Z","iopub.execute_input":"2023-06-19T07:18:37.881511Z","iopub.status.idle":"2023-06-19T07:42:36.214140Z","shell.execute_reply.started":"2023-06-19T07:18:37.881478Z","shell.execute_reply":"2023-06-19T07:42:36.213066Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#erstellen eines multmodalen Models\nclass Multi_Model(nn.Module):\n    def __init__(self, p=0.2):\n        super().__init__()\n        # Image Model\n        self.resnet50=resnet50(weights=ResNet50_Weights.DEFAULT)\n        self.resnet50.fc=nn.Sequential(\n            nn.BatchNorm1d(2048),\n            nn.ReLU(),\n            nn.Dropout(0.5),\n            nn.Linear(2048, 1000),\n            nn.BatchNorm1d(1000),\n            nn.ReLU(),\n            nn.Dropout(0.5),\n            nn.Linear(1000,256)\n        )\n        for param in self.resnet50.parameters():\n            param.requires_grad = False\n        for param in self.resnet50.fc.parameters():\n            param.requires_grad = True\n        \n        # Numerical Model\n        self.num_model = nn.Sequential(\n            nn.Linear(8, 64),\n            nn.ReLU(),\n            nn.Dropout(0.5),\n            nn.Linear(64, 32),\n            nn.ReLU(),\n            nn.Dropout(0.5)\n        )\n        \n        # Combined Model\n        self.final_model = nn.Sequential(\n            nn.Linear(288, 256),\n            nn.ReLU(),\n            nn.Dropout(0.5),\n            nn.Linear(256, 2)\n        )\n     \n    \n    def forward(self, image_input, numerical_input):\n        image_features = self.resnet50(image_input)\n        numerical_features = self.num_model(numerical_input)\n        combined_features = torch.cat((numerical_features, image_features), dim=1)\n        output = self.final_model(combined_features)\n        return output","metadata":{"execution":{"iopub.status.busy":"2023-06-19T07:42:36.215939Z","iopub.execute_input":"2023-06-19T07:42:36.216301Z","iopub.status.idle":"2023-06-19T07:42:36.227927Z","shell.execute_reply.started":"2023-06-19T07:42:36.216268Z","shell.execute_reply":"2023-06-19T07:42:36.227040Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"lr=0.01\n\nclass Multi_Learner():\n\n    def __init__(self, multi_model, loss, train_loader, test_loader):\n        self.loss_fn = loss\n        self.multi_model = multi_model\n        self.train_loader = train_loader\n        self.test_loader = test_loader\n\n\n    def train_batch(self,  features,images,yb, optimizer):\n        images=images.to(device)\n        features=features.to(device)\n        yb=yb.to(device)\n        y_hat=multi_model(images,features)\n        loss = self.loss_fn(y_hat, yb)\n        optimizer.zero_grad()\n        loss.backward()\n        optimizer.step()\n        preds=torch.argmax(y_hat, dim=1)\n        return loss.item(), (preds==yb).sum().item()/len(images)\n\n    def fit_one_cycle(self, lr):\n        multi_model.train()\n        optimizer=torch.optim.Adam(multi_model.parameters(), lr=lr)\n        scheduler=OneCycleLR(optimizer, max_lr=lr, steps_per_epoch=len(self.train_loader), epochs=1)\n        losses=[]\n        accs=[]\n        bar=tqdm(self.train_loader)\n        for features,yb,images in bar:\n            loss, acc=self.train_batch(features,images,yb, optimizer)\n            losses.append(loss)\n            accs.append(acc)\n            scheduler.step()\n            bar.set_description(f\"current lr: {scheduler.get_last_lr()}\")\n        return losses, np.mean(accs), self.get_accuracy()\n\n    def get_accuracy(self):\n        multi_model.eval()\n        correct=0\n        for features,yb,images in self.test_loader:\n            images=images.to(device)\n            features=features.to(device)\n            yb=yb.to(device)\n            y_hat=self.multi_model(images,features)\n            y_pred=torch.argmax(y_hat, dim=1)\n            correct+=(y_pred==yb).sum().item()\n        return correct/len(self.test_loader.dataset)\n    \n    def get_f1_score(self):\n        multi_model.eval()\n        y_true = []\n        y_pred = []\n        for features,yb,images in self.test_loader:\n            images=images.to(device)\n            features=features.to(device)\n            yb=yb.to(device)\n            y_hat=self.multi_model(images,features)\n            y_pred.extend(torch.argmax(y_hat, dim=1).cpu().tolist())\n            y_true.extend(yb.cpu().tolist())\n        return f1_score(y_true, y_pred, average='weighted')","metadata":{"execution":{"iopub.status.busy":"2023-06-19T07:42:36.229375Z","iopub.execute_input":"2023-06-19T07:42:36.229738Z","iopub.status.idle":"2023-06-19T07:42:36.246876Z","shell.execute_reply.started":"2023-06-19T07:42:36.229707Z","shell.execute_reply":"2023-06-19T07:42:36.246005Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"multi_model = Multi_Model().to(device)\n\nmulti_learner = Multi_Learner(multi_model,nn.CrossEntropyLoss(), train_loader, test_loader)","metadata":{"execution":{"iopub.status.busy":"2023-06-19T07:42:36.252825Z","iopub.execute_input":"2023-06-19T07:42:36.253185Z","iopub.status.idle":"2023-06-19T07:42:36.798378Z","shell.execute_reply.started":"2023-06-19T07:42:36.253159Z","shell.execute_reply":"2023-06-19T07:42:36.797408Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"In dieser Stelle habe ich vier bis fünf Stunden gehangen, da inscheinend der Klasse 'Multi_Learner' anscheinend mit 'model' nicht die lokale Varible sondern die globale Variable für das erste Modell aufegrufen hat.","metadata":{}},{"cell_type":"code","source":"losses, train_acc, test_acc=multi_learner.fit_one_cycle(0.1)\nprint(\"Test accuracy: \", test_acc)\nprint(\"Train accuracy: \", train_acc)\nplt.plot(losses, label='loss')\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2023-06-19T07:42:36.799886Z","iopub.execute_input":"2023-06-19T07:42:36.800335Z","iopub.status.idle":"2023-06-19T08:09:21.266452Z","shell.execute_reply.started":"2023-06-19T07:42:36.800288Z","shell.execute_reply":"2023-06-19T08:09:21.265566Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"multi_learner.get_f1_score()","metadata":{"execution":{"iopub.status.busy":"2023-06-19T08:09:21.267968Z","iopub.execute_input":"2023-06-19T08:09:21.268317Z","iopub.status.idle":"2023-06-19T08:32:16.234438Z","shell.execute_reply.started":"2023-06-19T08:09:21.268277Z","shell.execute_reply":"2023-06-19T08:32:16.233257Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Ergebnis\n\nDie beiden Modelle unterscheiden sich nur sehr geringfügig wobei ","metadata":{}},{"cell_type":"code","source":"#erstellen eines Dataset für den Test es wird eine Spalte Target hinzugefügt damit die Klasse von trainieren verwendet werden kann\ndf_test['target']=0\nprediction_dataset=CustomDataset(df_test.drop(['target'], axis=1), df_test['target'], transform)\nprediction_loader=DataLoader(test_dataset, batch_size=batch_size, shuffle=False)","metadata":{"execution":{"iopub.status.busy":"2023-06-19T08:32:16.235916Z","iopub.execute_input":"2023-06-19T08:32:16.236375Z","iopub.status.idle":"2023-06-19T08:32:16.246680Z","shell.execute_reply.started":"2023-06-19T08:32:16.236339Z","shell.execute_reply":"2023-06-19T08:32:16.245548Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"multi_model.eval()\npredictions = []  # List to store predictions\nfor features, yb, images in prediction_loader:\n    images = images.to(device)\n    features = features.to(device)\n    outputs = multi_model(images, features)\n    batch_predictions = torch.argmax(outputs, dim=1)\n    predictions.extend(batch_predictions.cpu().tolist()) \n","metadata":{"execution":{"iopub.status.busy":"2023-06-19T08:32:16.248358Z","iopub.execute_input":"2023-06-19T08:32:16.248783Z","iopub.status.idle":"2023-06-19T08:55:07.593017Z","shell.execute_reply.started":"2023-06-19T08:32:16.248749Z","shell.execute_reply":"2023-06-19T08:55:07.592003Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"multi_submission_df = pd.DataFrame({'target': predictions})\n\nmulti_submission_df['image_name'] = df_test['image_name']\n\nmulti_submission_df.to_csv('submission.csv', index=False)","metadata":{"execution":{"iopub.status.busy":"2023-06-19T08:55:07.594562Z","iopub.execute_input":"2023-06-19T08:55:07.594951Z","iopub.status.idle":"2023-06-19T08:55:07.612939Z","shell.execute_reply.started":"2023-06-19T08:55:07.594915Z","shell.execute_reply":"2023-06-19T08:55:07.611858Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.eval()\npredictions = []  # List to store predictions\nfor features, yb, images in prediction_loader:\n    images = images.to(device)\n    features = features.to(device)\n    outputs = model(images)\n    batch_predictions = torch.argmax(outputs, dim=1)\n    predictions.extend(batch_predictions.cpu().tolist()) \n","metadata":{"execution":{"iopub.status.busy":"2023-06-19T08:55:07.614367Z","iopub.execute_input":"2023-06-19T08:55:07.615019Z","iopub.status.idle":"2023-06-19T09:17:53.487638Z","shell.execute_reply.started":"2023-06-19T08:55:07.614986Z","shell.execute_reply":"2023-06-19T09:17:53.486640Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model = pd.DataFrame({'target': predictions})\n\nmodel['image_name'] = df_test['image_name']\n\nmodel.to_csv('submission.csv', index=False)","metadata":{"execution":{"iopub.status.busy":"2023-06-19T09:17:53.489311Z","iopub.execute_input":"2023-06-19T09:17:53.489671Z","iopub.status.idle":"2023-06-19T09:17:53.507387Z","shell.execute_reply.started":"2023-06-19T09:17:53.489637Z","shell.execute_reply":"2023-06-19T09:17:53.506745Z"},"trusted":true},"execution_count":null,"outputs":[]}]}