pickel-cancer-rick/project-cancer-classificati...

1085 lines
100 KiB
Plaintext

{
"cells": [
{
"cell_type": "markdown",
"id": "8bc02404-8cd1-46d9-8237-2d035ebb3e79",
"metadata": {},
"source": [
"# **[Project] Cancer Subtype Classification**"
]
},
{
"cell_type": "markdown",
"id": "0c5076f4",
"metadata": {},
"source": [
"# Introduction"
]
},
{
"cell_type": "markdown",
"id": "8a599748",
"metadata": {},
"source": [
"The [TCGA Kidney Cancers Dataset](https://archive.ics.uci.edu/dataset/892/tcga+kidney+cancers) is a bulk RNA-seq dataset that contains transcriptome profiles (i.e., gene expression quantification data) of patients diagnosed with three different subtypes of kidney cancers.\n",
"This dataset can be used to make predictions about the specific subtype of kidney cancers given the normalized transcriptome profile data.\n",
"\n",
"The normalized transcriptome profile data is given as **TPM** and **FPKM** for each gene.\n",
"\n",
"> TPM (Transcripts Per Million) and FPKM (Fragments Per Kilobase Million) are two common methods for quantifying gene expression in RNA sequencing data.\n",
"> They both aim to account for the differences in sequencing depth and transcript length when estimating gene expression levels.\n",
">\n",
"> **TPM** (Transcripts Per Million):\n",
"> - TPM is a measure of gene expression that normalizes for both library size (sequencing depth) and transcript length.\n",
"> - The main idea behind TPM is to express the abundance of a transcript relative to the total number of transcripts in a sample, scaled to one million.\n",
">\n",
"> **FPKM** (Fragments Per Kilobase Million):\n",
"> - FPKM is another method for quantifying gene expression, which is commonly used in older RNA-seq analysis pipelines. It's similar in concept to TPM but differs in the way it's calculated.\n",
"> - FPKM also normalizes for library size and transcript length, but it measures gene expression as the number of fragments (i.e., reads) per kilobase of exon model per million reads.\n",
">\n",
"> TPM is generally considered more robust to variations in library size, making it a preferred choice in many modern RNA-seq analysis workflows.\n",
"\n",
"We provide one dataset for each kidney cancer subtype:\n",
"\n",
"- [TCGA-KICH](https://portal.gdc.cancer.gov/projects/TCGA-KICH): kidney chromophobe (renal clear cell carcinoma)\n",
"- [TCGA-KIRC](https://portal.gdc.cancer.gov/projects/TCGA-KIRC): kidney renal clear cell carcinoma\n",
"- [TCGA-KIRP](https://portal.gdc.cancer.gov/projects/TCGA-KIRP): kidney renal papillary cell carcinoma\n",
"\n",
"> This and _much_ more data is openly available on the [NCI Genomic Data Commons (GDC) Data Portal](https://portal.gdc.cancer.gov/)."
]
},
{
"cell_type": "markdown",
"id": "16712787",
"metadata": {},
"source": [
"# Data access"
]
},
{
"cell_type": "markdown",
"id": "6421ef6c",
"metadata": {},
"source": [
"There are two ways to access the data: via the TNT homepage or the GDC Data Portal."
]
},
{
"cell_type": "markdown",
"id": "b977e8b8",
"metadata": {},
"source": [
"## Download from the TNT homepage (_recommended_)"
]
},
{
"cell_type": "markdown",
"id": "800fa7bd",
"metadata": {},
"source": [
"The download from the TNT homepage is straightforward:"
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "dda97b16",
"metadata": {
"tags": []
},
"outputs": [],
"source": [
"# ! wget http://www.tnt.uni-hannover.de/edu/vorlesungen/AMLG/data/project-cancer-classification.tar.gz\n",
"# ! tar -xzvf project-cancer-classification.tar.gz\n",
"# ! mv -v project-cancer-classification/ data/\n",
"# ! rm -v project-cancer-classification.tar.gz"
]
},
{
"cell_type": "markdown",
"id": "bc2db880",
"metadata": {},
"source": [
"In the `data/` folder you will now find many files in the [TSV format](https://en.wikipedia.org/wiki/Tab-separated_values) ([CSV](https://en.wikipedia.org/wiki/Comma-separated_values)-like with tabs as delimiter) containing the normalized transcriptome profile data.\n",
"\n",
"To start, you can read a TSV file into a [pandas](https://pandas.pydata.org) [`DataFrame`](pandas dataframe to dict) using the [`pandas.read_csv()`](https://pandas.pydata.org/docs/reference/api/pandas.read_csv.html#pandas-read-csv) function with the `sep` parameter set to `\\t`:"
]
},
{
"cell_type": "markdown",
"id": "ed50d396-fe33-47a7-ad19-8eb975ef0fa5",
"metadata": {},
"source": [
"## Lesen der DNA-Sequenz Dateien und speichern in einer Datei"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "2adae4ff",
"metadata": {
"tags": []
},
"outputs": [],
"source": [
"# import numpy as np\n",
"# import pandas as pd\n",
"# import pickle\n",
"\n",
"\n",
"# import os\n",
"# #'./data/tcga-kirp-geq'\n",
"\n",
"# labels = [\"kirp\", \"kirc\", \"kich\"] # Setzen Sie hier Ihren Ordnerpfad ein\n",
"# n_files = 0\n",
"# y = list()\n",
"# x = list()\n",
"\n",
"# rick = list()\n",
"# data = []\n",
"\n",
"# for l in labels:\n",
"# root_folder = f\"./data/tcga-{l}-geq\"\n",
"# for root, dirs, files in os.walk(root_folder):\n",
"# for file in files:\n",
"# if file.endswith('.tsv'):\n",
"# n_files += 1\n",
"# # Vollständiger Pfad zur Datei\n",
"# file_path = os.path.join(root, file)\n",
"# # Hier können Sie etwas mit der Datei machen, z.B. einlesen\n",
"# df = pd.read_csv(filepath_or_buffer=file_path, sep=\"\\t\", header=1)\n",
"# df = df['tpm_unstranded']\n",
"\n",
"# df = df[4:]\n",
"# df = np.array(df)\n",
"# rick.append(df)\n",
" \n",
"# data.append([df, l])\n",
"\n",
"# print(f\"Es wurden {n_files} Dateien eingelesen.\")\n",
"# #tsv_file_path = \"data/tcga-kich-geq/0ba21ef5-0829-422e-a674-d3817498c333/4868e8fc-e045-475a-a81d-ef43eabb7066.rna_seq.augmented_star_gene_counts.tsv\"\n",
"\n",
"# # Read the TSV file into a DataFrame\n",
"# #df = pd.read_csv(filepath_or_buffer=tsv_file_path, sep=\"\\t\", header=1)\n",
"\n",
"# # Display the first few rows of the DataFrame\n",
"# #print(df.head(n=20))\n",
"# #rick = np.array(rick)\n",
"\n",
"# # Speichern der 'kirp' Liste in einer Pickle-Datei\n",
"# #with open('rick.pickle', 'wb') as f:\n",
"# # pickle.dump(rick, f)\n"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "dfe4f964-6068-46da-8103-194525086f01",
"metadata": {
"tags": []
},
"outputs": [],
"source": [
"# data_Frame = pd.DataFrame(data, columns=[\"genome_frequencies\", \"cancer_type\"])\n",
"# data_Frame.head()"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "0f5cc92a-4485-4184-845e-116ea9a9776d",
"metadata": {
"tags": []
},
"outputs": [],
"source": [
"# # Speichern der Daten in einer lokalen Datei\n",
"# with open('rick.pickle', 'wb') as f:\n",
"# pickle.dump(data_Frame, f)"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "b7b79958-baba-4630-9def-cf47afe43d9f",
"metadata": {
"tags": []
},
"outputs": [],
"source": [
"import pickle\n",
"\n",
"# Laden der 'kirp' Liste aus der Pickle-Datei\n",
"with open('rick.pickle', 'rb') as f:\n",
" data_Frame = pickle.load(f)"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "f6608b92-8ace-4a52-a3dc-70c578e56f0d",
"metadata": {
"tags": []
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>genome_frequencies</th>\n",
" <th>cancer_type</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>[20.331, 0.0, 25.1806, 1.1301, 0.4836, 7.3269,...</td>\n",
" <td>kirp</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>[37.0405, 0.5002, 77.4246, 4.2188, 1.0408, 29....</td>\n",
" <td>kirp</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>[45.4456, 0.0903, 74.9545, 4.843, 1.5188, 11.8...</td>\n",
" <td>kirp</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>[15.2345, 0.3393, 62.0003, 2.4412, 0.932, 2.66...</td>\n",
" <td>kirp</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>[35.0709, 0.2333, 62.8022, 2.8872, 1.0547, 18....</td>\n",
" <td>kirp</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" genome_frequencies cancer_type\n",
"0 [20.331, 0.0, 25.1806, 1.1301, 0.4836, 7.3269,... kirp\n",
"1 [37.0405, 0.5002, 77.4246, 4.2188, 1.0408, 29.... kirp\n",
"2 [45.4456, 0.0903, 74.9545, 4.843, 1.5188, 11.8... kirp\n",
"3 [15.2345, 0.3393, 62.0003, 2.4412, 0.932, 2.66... kirp\n",
"4 [35.0709, 0.2333, 62.8022, 2.8872, 1.0547, 18.... kirp"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"data_Frame.head()"
]
},
{
"cell_type": "markdown",
"id": "c60cbf60-d904-4ee0-8f70-588bb109368b",
"metadata": {},
"source": [
"# Data preprocessing"
]
},
{
"cell_type": "markdown",
"id": "583e39c8-13ba-422e-9c39-9cf1c8d63d5b",
"metadata": {},
"source": [
"## Training set & validation set"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "38695a70-86e9-4dd0-b622-33e3762372eb",
"metadata": {
"tags": []
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"DataSet shape: (1034, 2)\n",
"Training set\n",
"------------\n",
"Dataframe shape: (827, 2)\n",
"Dataframe head:\n",
" genome_frequencies cancer_type\n",
"518 [25.0645, 0.1125, 56.3997, 3.3108, 1.6061, 12.... kirc\n",
"355 [32.6449, 2.1789, 63.4954, 6.3228, 2.109, 40.9... kirc\n",
"528 [46.024, 0.0, 85.8077, 7.2567, 2.1301, 9.6509,... kirc\n",
"445 [153.0064, 1.6403, 99.3267, 7.3736, 1.3668, 10... kirc\n",
"986 [65.5167, 18.2363, 77.2126, 5.0375, 2.4628, 21... kich\n",
"\n",
"Validation set\n",
"--------------\n",
"Dataframe shape: (207, 2)\n",
"Dataframe head:\n",
" genome_frequencies cancer_type\n",
"294 [50.8994, 0.4635, 131.5049, 5.7193, 3.103, 15.... kirp\n",
"453 [35.857, 0.1018, 94.5681, 5.2997, 1.9388, 17.6... kirc\n",
"638 [11.3865, 0.2313, 28.5961, 3.0169, 0.7851, 8.2... kirc\n",
"139 [41.6119, 0.2207, 55.4377, 4.4395, 0.884, 3.56... kirp\n",
"539 [63.1646, 18.8107, 63.2703, 4.6696, 0.9466, 5.... kirc\n"
]
}
],
"source": [
"import os\n",
"from sklearn.model_selection import train_test_split\n",
"\n",
"train_df, val_df = train_test_split(data_Frame, train_size=0.8, random_state=42)\n",
"\n",
"print(f\"DataSet shape: {data_Frame.shape}\")\n",
"print(f\"Training set{os.linesep}------------\")\n",
"print(f\"Dataframe shape: {train_df.shape}\")\n",
"print(f\"Dataframe head:{os.linesep}{train_df.head()}\")\n",
"print(\"\")\n",
"print(f\"Validation set{os.linesep}--------------\")\n",
"print(f\"Dataframe shape: {val_df.shape}\")\n",
"print(f\"Dataframe head:{os.linesep}{val_df.head()}\")"
]
},
{
"cell_type": "markdown",
"id": "4903244b-548f-4672-967d-1c62825b6fce",
"metadata": {},
"source": [
"## Building a custom PyTorch dataset"
]
},
{
"cell_type": "markdown",
"id": "7e333251-c4e7-41f0-a086-12a3d95b723f",
"metadata": {},
"source": [
"## Öffnen der Datei mit den Gesammelten Sequenzen"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "e2f78725-cda6-4e8d-9029-a4a31f6f9ab7",
"metadata": {
"tags": []
},
"outputs": [],
"source": [
"from torch.utils.data import Dataset\n",
"import torch\n",
"import pandas as pd\n",
"from sklearn.preprocessing import LabelEncoder\n",
"\n",
"class GenomeDataset(Dataset):\n",
" def __init__(self, dataframe):\n",
" self.dataframe = dataframe\n",
"\n",
" # Umwandlung der Genome Frequenzen in Tensoren\n",
" self.genome_frequencies = torch.tensor(dataframe['genome_frequencies'].tolist(), dtype=torch.float32)\n",
"\n",
" # Umwandlung der Krebsarten in numerische Werte\n",
" self.label_encoder = LabelEncoder()\n",
" self.cancer_types = torch.tensor(self.label_encoder.fit_transform(dataframe['cancer_type']), dtype=torch.long)\n",
"\n",
" def __getitem__(self, index):\n",
" # Rückgabe eines Tupels aus Genome Frequenzen und dem entsprechenden Krebstyp\n",
" return self.genome_frequencies[index], self.cancer_types[index]\n",
"\n",
" def __len__(self):\n",
" return len(self.dataframe)\n"
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "aaa2c50c-c79e-4bca-812f-1a06c9f485d5",
"metadata": {
"tags": []
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/tmp/ipykernel_19797/2483914749.py:11: UserWarning: Creating a tensor from a list of numpy.ndarrays is extremely slow. Please consider converting the list to a single numpy.ndarray with numpy.array() before converting to a tensor. (Triggered internally at /opt/pytorch/pytorch/torch/csrc/utils/tensor_new.cpp:245.)\n",
" self.genome_frequencies = torch.tensor(dataframe['genome_frequencies'].tolist(), dtype=torch.float32)\n"
]
}
],
"source": [
"# Beispielhafte Verwendung\n",
"# Angenommen, df_train und df_valid sind Ihre Trainings- und Validierungsdaten\n",
"train_dataset = GenomeDataset(train_df)\n",
"valid_dataset = GenomeDataset(val_df)"
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "a7fb59af-bd06-42d4-acce-03266a85bf36",
"metadata": {
"tags": []
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Genome frequency from dataframe:\n",
"[2.50645e+01 1.12500e-01 5.63997e+01 ... 0.00000e+00 1.29000e-02\n",
" 2.47100e-01]\n",
"\n",
"Cancer type from dataframe: kirc\n",
"\n",
"Genome frequency from dataset:\n",
"tensor([2.5065e+01, 1.1250e-01, 5.6400e+01, ..., 0.0000e+00, 1.2900e-02,\n",
" 2.4710e-01])\n",
"\n",
"Cancer type from dataset: 1\n"
]
}
],
"source": [
"# Inspect the first item from the training dataframe\n",
"train_df_head = train_df.head(n=1)\n",
"train_df_genome_frequence =train_df_head.iloc[0][\"genome_frequencies\"]\n",
"train_df_cancer_type = train_df_head.iloc[0][\"cancer_type\"]\n",
"print(f\"Genome frequency from dataframe:{os.linesep}{train_df_genome_frequence}{os.linesep}\")\n",
"print(f\"Cancer type from dataframe: {train_df_cancer_type}{os.linesep}\")\n",
"\n",
"# Inspect the first item from the training dataset\n",
"datapoint_features, datapoint_label = train_dataset[0]\n",
"print(f\"Genome frequency from dataset:{os.linesep}{datapoint_features}{os.linesep}\")\n",
"print(f\"Cancer type from dataset: {datapoint_label}\")"
]
},
{
"cell_type": "markdown",
"id": "418bc6a0-2ddb-4596-87d1-3e670195297c",
"metadata": {
"tags": []
},
"source": [
"## Hauptkomponentenanalyse (PCA)"
]
},
{
"cell_type": "code",
"execution_count": 11,
"id": "e6672e50-47e6-48fc-9e1e-cac0f0a606f1",
"metadata": {},
"outputs": [],
"source": [
"# import numpy as np\n",
"# from sklearn.decomposition import PCA\n",
"# from sklearn.preprocessing import StandardScaler\n",
"\n",
"# # Angenommen, X ist Ihr Datensatz\n",
"# # X = ...\n",
"# X = rick\n",
"\n",
"# # Standardisieren der Daten\n",
"# scaler = StandardScaler()\n",
"# X_scaled = scaler.fit_transform(X)\n",
"\n",
"# # Erstellen des PCA-Objekts\n",
"# pca = PCA(n_components=150) # Angenommen, Sie möchten 150 Hauptkomponenten behalten\n",
"\n",
"# # Durchführen der PCA\n",
"# X_pca = pca.fit_transform(X_scaled)\n",
"\n",
"# # Die resultierenden Hauptkomponenten\n",
"# print(\"Transformierte Daten:\", X_pca)\n",
"\n",
"# # Variance Ratio für jede Komponente\n",
"# print(\"Varianz erklärt durch jede Komponente:\", pca.explained_variance_ratio_)\n"
]
},
{
"cell_type": "markdown",
"id": "9199fdeb-0d48-44c2-8bec-db2a7d7cbd4d",
"metadata": {},
"source": [
"# Neuronales Netz Definition"
]
},
{
"cell_type": "markdown",
"id": "e53132b9-6222-4739-be49-7628e5a37709",
"metadata": {},
"source": [
"### Simples Neuronales Netz"
]
},
{
"cell_type": "code",
"execution_count": 12,
"id": "76b8eec8-d24b-4696-82bf-ebb286e7d1e7",
"metadata": {
"tags": []
},
"outputs": [],
"source": [
"import torch\n",
"import torch.nn as nn\n",
"import torch.optim as optim\n",
"from torch.utils.data import DataLoader\n",
"\n",
"# Definition des Modells\n",
"class SimpleNN(nn.Module):\n",
" def __init__(self, input_size, hidden_size, num_classes):\n",
" super(SimpleNN, self).__init__()\n",
" self.fc1 = nn.Linear(input_size, hidden_size)\n",
" self.relu = nn.ReLU()\n",
" self.fc2 = nn.Linear(hidden_size, num_classes)\n",
"\n",
" def forward(self, x):\n",
" out = self.fc1(x)\n",
" out = self.relu(out)\n",
" out = self.fc2(out)\n",
" return out"
]
},
{
"cell_type": "markdown",
"id": "e2e9e0dd-3d4f-4999-9e65-704266d5e4a2",
"metadata": {
"tags": []
},
"source": [
"### Komplexes Neuronales Netz"
]
},
{
"cell_type": "code",
"execution_count": 13,
"id": "944d463e-12ed-4447-8587-ee9c60ce3eb6",
"metadata": {
"tags": []
},
"outputs": [],
"source": [
"import torch\n",
"import torch.nn as nn\n",
"import torch.nn.functional as F\n",
"\n",
"class ComplexNN(nn.Module):\n",
" def __init__(self, input_size, hidden_size, num_classes):\n",
" super(ComplexNN, self).__init__()\n",
" # Definieren der Schichten\n",
" self.fc1 = nn.Linear(input_size, 1024) # Eingabeschicht\n",
" self.fc2 = nn.Linear(1024, 512) # Versteckte Schicht\n",
" self.fc3 = nn.Linear(512, 256) # Weitere versteckte Schicht\n",
" self.fc4 = nn.Linear(256, num_classes) # Ausgabeschicht\n",
" self.dropout = nn.Dropout(p=0.5) # Dropout\n",
"\n",
" def forward(self, x):\n",
" # Definieren des Vorwärtsdurchlaufs\n",
" x = F.relu(self.fc1(x))\n",
" x = self.dropout(x)\n",
" x = F.relu(self.fc2(x))\n",
" x = self.dropout(x)\n",
" x = F.relu(self.fc3(x))\n",
" x = torch.sigmoid(self.fc4(x)) # Oder F.log_softmax(x, dim=1) für Mehrklassenklassifikation\n",
" return x"
]
},
{
"cell_type": "code",
"execution_count": 14,
"id": "60789428-7d6e-4737-a83a-1138f6a650f7",
"metadata": {
"tags": []
},
"outputs": [],
"source": [
"# Annahme: input_size ist die Länge Ihrer Genome-Frequenzen und num_classes ist die Anzahl der Krebsarten\n",
"#model = SimpleNN(input_size=60660, hidden_size=5000, num_classes=3)\n",
"model = ComplexNN(input_size=60660, hidden_size=5000, num_classes=3)\n",
"\n",
"# Daten-Loader\n",
"train_loader = DataLoader(dataset=train_dataset, batch_size=64, shuffle=True)\n",
"valid_loader = DataLoader(dataset=valid_dataset, batch_size=64, shuffle=False)"
]
},
{
"cell_type": "code",
"execution_count": 15,
"id": "de6e81de-0096-443a-a0b6-90cddecf5f88",
"metadata": {
"tags": []
},
"outputs": [],
"source": [
"# Verlustfunktion und Optimierer\n",
"criterion = nn.CrossEntropyLoss()\n",
"optimizer = optim.Adam(model.parameters(), lr=0.001)\n",
"num_epochs = 250"
]
},
{
"cell_type": "code",
"execution_count": 16,
"id": "a5deb2ed-c685-4d80-bc98-d6dd27334d82",
"metadata": {
"tags": []
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Epoch [1/250], Trainingsverlust: 1.0121, Validierungsverlust: 0.9179\n",
"Epoch [2/250], Trainingsverlust: 0.9557, Validierungsverlust: 0.9179\n",
"Epoch [3/250], Trainingsverlust: 0.9549, Validierungsverlust: 0.9179\n",
"Epoch [4/250], Trainingsverlust: 0.9544, Validierungsverlust: 0.9179\n",
"Epoch [5/250], Trainingsverlust: 0.9557, Validierungsverlust: 0.9179\n",
"Epoch [6/250], Trainingsverlust: 0.9547, Validierungsverlust: 0.9179\n",
"Epoch [7/250], Trainingsverlust: 0.9556, Validierungsverlust: 0.9179\n",
"Epoch [8/250], Trainingsverlust: 0.9559, Validierungsverlust: 0.9179\n",
"Epoch [9/250], Trainingsverlust: 0.9557, Validierungsverlust: 0.9179\n",
"Epoch [10/250], Trainingsverlust: 0.9552, Validierungsverlust: 0.9179\n",
"Epoch [11/250], Trainingsverlust: 0.9556, Validierungsverlust: 0.9179\n",
"Epoch [12/250], Trainingsverlust: 0.9559, Validierungsverlust: 0.9179\n",
"Epoch [13/250], Trainingsverlust: 0.9549, Validierungsverlust: 0.9179\n",
"Epoch [14/250], Trainingsverlust: 0.9553, Validierungsverlust: 0.9179\n",
"Epoch [15/250], Trainingsverlust: 0.9549, Validierungsverlust: 0.9179\n",
"Epoch [16/250], Trainingsverlust: 0.9553, Validierungsverlust: 0.9179\n",
"Epoch [17/250], Trainingsverlust: 0.9552, Validierungsverlust: 0.9179\n",
"Epoch [18/250], Trainingsverlust: 0.9555, Validierungsverlust: 0.9179\n",
"Epoch [19/250], Trainingsverlust: 0.9554, Validierungsverlust: 0.9179\n",
"Epoch [20/250], Trainingsverlust: 0.9544, Validierungsverlust: 0.9179\n",
"Epoch [21/250], Trainingsverlust: 0.9552, Validierungsverlust: 0.9179\n",
"Epoch [22/250], Trainingsverlust: 0.9552, Validierungsverlust: 0.9179\n",
"Epoch [23/250], Trainingsverlust: 0.9552, Validierungsverlust: 0.9179\n",
"Epoch [24/250], Trainingsverlust: 0.9555, Validierungsverlust: 0.9179\n",
"Epoch [25/250], Trainingsverlust: 0.9555, Validierungsverlust: 0.9179\n",
"Epoch [26/250], Trainingsverlust: 0.9549, Validierungsverlust: 0.9179\n",
"Epoch [27/250], Trainingsverlust: 0.9559, Validierungsverlust: 0.9179\n",
"Epoch [28/250], Trainingsverlust: 0.9556, Validierungsverlust: 0.9179\n",
"Epoch [29/250], Trainingsverlust: 0.9548, Validierungsverlust: 0.9179\n",
"Epoch [30/250], Trainingsverlust: 0.9555, Validierungsverlust: 0.9179\n",
"Epoch [31/250], Trainingsverlust: 0.9551, Validierungsverlust: 0.9179\n",
"Epoch [32/250], Trainingsverlust: 0.9558, Validierungsverlust: 0.9179\n",
"Epoch [33/250], Trainingsverlust: 0.9550, Validierungsverlust: 0.9179\n",
"Epoch [34/250], Trainingsverlust: 0.9554, Validierungsverlust: 0.9179\n",
"Epoch [35/250], Trainingsverlust: 0.9552, Validierungsverlust: 0.9179\n",
"Epoch [36/250], Trainingsverlust: 0.9553, Validierungsverlust: 0.9179\n",
"Epoch [37/250], Trainingsverlust: 0.9550, Validierungsverlust: 0.9179\n",
"Epoch [38/250], Trainingsverlust: 0.9549, Validierungsverlust: 0.9179\n",
"Epoch [39/250], Trainingsverlust: 0.9555, Validierungsverlust: 0.9179\n",
"Epoch [40/250], Trainingsverlust: 0.9554, Validierungsverlust: 0.9179\n",
"Epoch [41/250], Trainingsverlust: 0.9554, Validierungsverlust: 0.9179\n",
"Epoch [42/250], Trainingsverlust: 0.9546, Validierungsverlust: 0.9179\n",
"Epoch [43/250], Trainingsverlust: 0.9549, Validierungsverlust: 0.9179\n",
"Epoch [44/250], Trainingsverlust: 0.9550, Validierungsverlust: 0.9179\n",
"Epoch [45/250], Trainingsverlust: 0.9555, Validierungsverlust: 0.9179\n",
"Epoch [46/250], Trainingsverlust: 0.9554, Validierungsverlust: 0.9179\n",
"Epoch [47/250], Trainingsverlust: 0.9553, Validierungsverlust: 0.9179\n",
"Epoch [48/250], Trainingsverlust: 0.9556, Validierungsverlust: 0.9179\n",
"Epoch [49/250], Trainingsverlust: 0.9551, Validierungsverlust: 0.9179\n",
"Epoch [50/250], Trainingsverlust: 0.9552, Validierungsverlust: 0.9179\n",
"Epoch [51/250], Trainingsverlust: 0.9561, Validierungsverlust: 0.9179\n",
"Epoch [52/250], Trainingsverlust: 0.9552, Validierungsverlust: 0.9179\n",
"Epoch [53/250], Trainingsverlust: 0.9558, Validierungsverlust: 0.9179\n",
"Epoch [54/250], Trainingsverlust: 0.9549, Validierungsverlust: 0.9179\n",
"Epoch [55/250], Trainingsverlust: 0.9559, Validierungsverlust: 0.9179\n",
"Epoch [56/250], Trainingsverlust: 0.9555, Validierungsverlust: 0.9179\n",
"Epoch [57/250], Trainingsverlust: 0.9554, Validierungsverlust: 0.9179\n",
"Epoch [58/250], Trainingsverlust: 0.9557, Validierungsverlust: 0.9179\n",
"Epoch [59/250], Trainingsverlust: 0.9554, Validierungsverlust: 0.9179\n",
"Epoch [60/250], Trainingsverlust: 0.9560, Validierungsverlust: 0.9179\n",
"Epoch [61/250], Trainingsverlust: 0.9559, Validierungsverlust: 0.9179\n",
"Epoch [62/250], Trainingsverlust: 0.9555, Validierungsverlust: 0.9179\n",
"Epoch [63/250], Trainingsverlust: 0.9550, Validierungsverlust: 0.9179\n",
"Epoch [64/250], Trainingsverlust: 0.9549, Validierungsverlust: 0.9179\n",
"Epoch [65/250], Trainingsverlust: 0.9558, Validierungsverlust: 0.9179\n",
"Epoch [66/250], Trainingsverlust: 0.9548, Validierungsverlust: 0.9179\n",
"Epoch [67/250], Trainingsverlust: 0.9547, Validierungsverlust: 0.9179\n",
"Epoch [68/250], Trainingsverlust: 0.9549, Validierungsverlust: 0.9179\n",
"Epoch [69/250], Trainingsverlust: 0.9555, Validierungsverlust: 0.9179\n",
"Epoch [70/250], Trainingsverlust: 0.9551, Validierungsverlust: 0.9179\n",
"Epoch [71/250], Trainingsverlust: 0.9552, Validierungsverlust: 0.9179\n",
"Epoch [72/250], Trainingsverlust: 0.9553, Validierungsverlust: 0.9179\n",
"Epoch [73/250], Trainingsverlust: 0.9557, Validierungsverlust: 0.9179\n",
"Epoch [74/250], Trainingsverlust: 0.9555, Validierungsverlust: 0.9179\n",
"Epoch [75/250], Trainingsverlust: 0.9557, Validierungsverlust: 0.9179\n",
"Epoch [76/250], Trainingsverlust: 0.9553, Validierungsverlust: 0.9179\n",
"Epoch [77/250], Trainingsverlust: 0.9561, Validierungsverlust: 0.9179\n",
"Epoch [78/250], Trainingsverlust: 0.9554, Validierungsverlust: 0.9179\n",
"Epoch [79/250], Trainingsverlust: 0.9559, Validierungsverlust: 0.9179\n",
"Epoch [80/250], Trainingsverlust: 0.9554, Validierungsverlust: 0.9179\n",
"Epoch [81/250], Trainingsverlust: 0.9555, Validierungsverlust: 0.9179\n",
"Epoch [82/250], Trainingsverlust: 0.9552, Validierungsverlust: 0.9179\n",
"Epoch [83/250], Trainingsverlust: 0.9549, Validierungsverlust: 0.9179\n",
"Epoch [84/250], Trainingsverlust: 0.9552, Validierungsverlust: 0.9179\n",
"Epoch [85/250], Trainingsverlust: 0.9557, Validierungsverlust: 0.9179\n",
"Epoch [86/250], Trainingsverlust: 0.9558, Validierungsverlust: 0.9179\n",
"Epoch [87/250], Trainingsverlust: 0.9546, Validierungsverlust: 0.9179\n",
"Epoch [88/250], Trainingsverlust: 0.9554, Validierungsverlust: 0.9179\n",
"Epoch [89/250], Trainingsverlust: 0.9560, Validierungsverlust: 0.9179\n",
"Epoch [90/250], Trainingsverlust: 0.9564, Validierungsverlust: 0.9179\n",
"Epoch [91/250], Trainingsverlust: 0.9556, Validierungsverlust: 0.9179\n",
"Epoch [92/250], Trainingsverlust: 0.9557, Validierungsverlust: 0.9179\n",
"Epoch [93/250], Trainingsverlust: 0.9558, Validierungsverlust: 0.9179\n",
"Epoch [94/250], Trainingsverlust: 0.9552, Validierungsverlust: 0.9179\n",
"Epoch [95/250], Trainingsverlust: 0.9557, Validierungsverlust: 0.9179\n",
"Epoch [96/250], Trainingsverlust: 0.9548, Validierungsverlust: 0.9179\n",
"Epoch [97/250], Trainingsverlust: 0.9558, Validierungsverlust: 0.9179\n",
"Epoch [98/250], Trainingsverlust: 0.9544, Validierungsverlust: 0.9179\n",
"Epoch [99/250], Trainingsverlust: 0.9552, Validierungsverlust: 0.9179\n",
"Epoch [100/250], Trainingsverlust: 0.9543, Validierungsverlust: 0.9179\n",
"Epoch [101/250], Trainingsverlust: 0.9557, Validierungsverlust: 0.9179\n",
"Epoch [102/250], Trainingsverlust: 0.9550, Validierungsverlust: 0.9179\n",
"Epoch [103/250], Trainingsverlust: 0.9551, Validierungsverlust: 0.9179\n",
"Epoch [104/250], Trainingsverlust: 0.9544, Validierungsverlust: 0.9179\n",
"Epoch [105/250], Trainingsverlust: 0.9555, Validierungsverlust: 0.9179\n",
"Epoch [106/250], Trainingsverlust: 0.9558, Validierungsverlust: 0.9179\n",
"Epoch [107/250], Trainingsverlust: 0.9547, Validierungsverlust: 0.9179\n",
"Epoch [108/250], Trainingsverlust: 0.9554, Validierungsverlust: 0.9179\n",
"Epoch [109/250], Trainingsverlust: 0.9549, Validierungsverlust: 0.9179\n",
"Epoch [110/250], Trainingsverlust: 0.9551, Validierungsverlust: 0.9179\n",
"Epoch [111/250], Trainingsverlust: 0.9551, Validierungsverlust: 0.9179\n",
"Epoch [112/250], Trainingsverlust: 0.9552, Validierungsverlust: 0.9179\n",
"Epoch [113/250], Trainingsverlust: 0.9555, Validierungsverlust: 0.9179\n",
"Epoch [114/250], Trainingsverlust: 0.9558, Validierungsverlust: 0.9179\n",
"Epoch [115/250], Trainingsverlust: 0.9554, Validierungsverlust: 0.9179\n",
"Epoch [116/250], Trainingsverlust: 0.9558, Validierungsverlust: 0.9179\n",
"Epoch [117/250], Trainingsverlust: 0.9550, Validierungsverlust: 0.9179\n",
"Epoch [118/250], Trainingsverlust: 0.9554, Validierungsverlust: 0.9179\n",
"Epoch [119/250], Trainingsverlust: 0.9553, Validierungsverlust: 0.9179\n",
"Epoch [120/250], Trainingsverlust: 0.9556, Validierungsverlust: 0.9179\n",
"Epoch [121/250], Trainingsverlust: 0.9552, Validierungsverlust: 0.9179\n",
"Epoch [122/250], Trainingsverlust: 0.9552, Validierungsverlust: 0.9179\n",
"Epoch [123/250], Trainingsverlust: 0.9553, Validierungsverlust: 0.9179\n",
"Epoch [124/250], Trainingsverlust: 0.9553, Validierungsverlust: 0.9179\n",
"Epoch [125/250], Trainingsverlust: 0.9547, Validierungsverlust: 0.9179\n",
"Epoch [126/250], Trainingsverlust: 0.9549, Validierungsverlust: 0.9179\n",
"Epoch [127/250], Trainingsverlust: 0.9556, Validierungsverlust: 0.9179\n",
"Epoch [128/250], Trainingsverlust: 0.9553, Validierungsverlust: 0.9179\n",
"Epoch [129/250], Trainingsverlust: 0.9556, Validierungsverlust: 0.9179\n",
"Epoch [130/250], Trainingsverlust: 0.9555, Validierungsverlust: 0.9179\n",
"Epoch [131/250], Trainingsverlust: 0.9545, Validierungsverlust: 0.9179\n",
"Epoch [132/250], Trainingsverlust: 0.9550, Validierungsverlust: 0.9179\n",
"Epoch [133/250], Trainingsverlust: 0.9558, Validierungsverlust: 0.9179\n",
"Epoch [134/250], Trainingsverlust: 0.9551, Validierungsverlust: 0.9179\n",
"Epoch [135/250], Trainingsverlust: 0.9551, Validierungsverlust: 0.9179\n",
"Epoch [136/250], Trainingsverlust: 0.9553, Validierungsverlust: 0.9179\n",
"Epoch [137/250], Trainingsverlust: 0.9551, Validierungsverlust: 0.9179\n",
"Epoch [138/250], Trainingsverlust: 0.9561, Validierungsverlust: 0.9179\n",
"Epoch [139/250], Trainingsverlust: 0.9548, Validierungsverlust: 0.9179\n",
"Epoch [140/250], Trainingsverlust: 0.9548, Validierungsverlust: 0.9179\n",
"Epoch [141/250], Trainingsverlust: 0.9551, Validierungsverlust: 0.9179\n",
"Epoch [142/250], Trainingsverlust: 0.9558, Validierungsverlust: 0.9179\n",
"Epoch [143/250], Trainingsverlust: 0.9554, Validierungsverlust: 0.9179\n",
"Epoch [144/250], Trainingsverlust: 0.9553, Validierungsverlust: 0.9179\n",
"Epoch [145/250], Trainingsverlust: 0.9553, Validierungsverlust: 0.9179\n",
"Epoch [146/250], Trainingsverlust: 0.9558, Validierungsverlust: 0.9179\n",
"Epoch [147/250], Trainingsverlust: 0.9555, Validierungsverlust: 0.9179\n",
"Epoch [148/250], Trainingsverlust: 0.9554, Validierungsverlust: 0.9179\n",
"Epoch [149/250], Trainingsverlust: 0.9549, Validierungsverlust: 0.9179\n",
"Epoch [150/250], Trainingsverlust: 0.9546, Validierungsverlust: 0.9179\n",
"Epoch [151/250], Trainingsverlust: 0.9558, Validierungsverlust: 0.9179\n",
"Epoch [152/250], Trainingsverlust: 0.9554, Validierungsverlust: 0.9179\n",
"Epoch [153/250], Trainingsverlust: 0.9559, Validierungsverlust: 0.9179\n",
"Epoch [154/250], Trainingsverlust: 0.9554, Validierungsverlust: 0.9179\n",
"Epoch [155/250], Trainingsverlust: 0.9551, Validierungsverlust: 0.9179\n",
"Epoch [156/250], Trainingsverlust: 0.9551, Validierungsverlust: 0.9179\n",
"Epoch [157/250], Trainingsverlust: 0.9554, Validierungsverlust: 0.9179\n",
"Epoch [158/250], Trainingsverlust: 0.9550, Validierungsverlust: 0.9179\n",
"Epoch [159/250], Trainingsverlust: 0.9551, Validierungsverlust: 0.9179\n",
"Epoch [160/250], Trainingsverlust: 0.9551, Validierungsverlust: 0.9179\n",
"Epoch [161/250], Trainingsverlust: 0.9552, Validierungsverlust: 0.9179\n",
"Epoch [162/250], Trainingsverlust: 0.9556, Validierungsverlust: 0.9179\n",
"Epoch [163/250], Trainingsverlust: 0.9552, Validierungsverlust: 0.9179\n",
"Epoch [164/250], Trainingsverlust: 0.9549, Validierungsverlust: 0.9179\n",
"Epoch [165/250], Trainingsverlust: 0.9552, Validierungsverlust: 0.9179\n",
"Epoch [166/250], Trainingsverlust: 0.9551, Validierungsverlust: 0.9179\n",
"Epoch [167/250], Trainingsverlust: 0.9558, Validierungsverlust: 0.9179\n",
"Epoch [168/250], Trainingsverlust: 0.9552, Validierungsverlust: 0.9179\n",
"Epoch [169/250], Trainingsverlust: 0.9561, Validierungsverlust: 0.9179\n",
"Epoch [170/250], Trainingsverlust: 0.9554, Validierungsverlust: 0.9179\n",
"Epoch [171/250], Trainingsverlust: 0.9553, Validierungsverlust: 0.9179\n",
"Epoch [172/250], Trainingsverlust: 0.9544, Validierungsverlust: 0.9179\n",
"Epoch [173/250], Trainingsverlust: 0.9559, Validierungsverlust: 0.9179\n",
"Epoch [174/250], Trainingsverlust: 0.9556, Validierungsverlust: 0.9179\n",
"Epoch [175/250], Trainingsverlust: 0.9548, Validierungsverlust: 0.9179\n",
"Epoch [176/250], Trainingsverlust: 0.9557, Validierungsverlust: 0.9179\n",
"Epoch [177/250], Trainingsverlust: 0.9555, Validierungsverlust: 0.9179\n",
"Epoch [178/250], Trainingsverlust: 0.9561, Validierungsverlust: 0.9179\n",
"Epoch [179/250], Trainingsverlust: 0.9553, Validierungsverlust: 0.9179\n",
"Epoch [180/250], Trainingsverlust: 0.9554, Validierungsverlust: 0.9179\n",
"Epoch [181/250], Trainingsverlust: 0.9557, Validierungsverlust: 0.9179\n",
"Epoch [182/250], Trainingsverlust: 0.9559, Validierungsverlust: 0.9179\n",
"Epoch [183/250], Trainingsverlust: 0.9554, Validierungsverlust: 0.9179\n",
"Epoch [184/250], Trainingsverlust: 0.9555, Validierungsverlust: 0.9179\n",
"Epoch [185/250], Trainingsverlust: 0.9551, Validierungsverlust: 0.9179\n",
"Epoch [186/250], Trainingsverlust: 0.9549, Validierungsverlust: 0.9179\n",
"Epoch [187/250], Trainingsverlust: 0.9547, Validierungsverlust: 0.9179\n",
"Epoch [188/250], Trainingsverlust: 0.9550, Validierungsverlust: 0.9179\n",
"Epoch [189/250], Trainingsverlust: 0.9549, Validierungsverlust: 0.9179\n",
"Epoch [190/250], Trainingsverlust: 0.9547, Validierungsverlust: 0.9179\n",
"Epoch [191/250], Trainingsverlust: 0.9555, Validierungsverlust: 0.9179\n",
"Epoch [192/250], Trainingsverlust: 0.9549, Validierungsverlust: 0.9179\n",
"Epoch [193/250], Trainingsverlust: 0.9553, Validierungsverlust: 0.9179\n",
"Epoch [194/250], Trainingsverlust: 0.9556, Validierungsverlust: 0.9179\n",
"Epoch [195/250], Trainingsverlust: 0.9549, Validierungsverlust: 0.9179\n",
"Epoch [196/250], Trainingsverlust: 0.9552, Validierungsverlust: 0.9179\n",
"Epoch [197/250], Trainingsverlust: 0.9549, Validierungsverlust: 0.9179\n",
"Epoch [198/250], Trainingsverlust: 0.9553, Validierungsverlust: 0.9179\n",
"Epoch [199/250], Trainingsverlust: 0.9555, Validierungsverlust: 0.9179\n",
"Epoch [200/250], Trainingsverlust: 0.9553, Validierungsverlust: 0.9179\n",
"Epoch [201/250], Trainingsverlust: 0.9550, Validierungsverlust: 0.9179\n",
"Epoch [202/250], Trainingsverlust: 0.9556, Validierungsverlust: 0.9179\n",
"Epoch [203/250], Trainingsverlust: 0.9546, Validierungsverlust: 0.9179\n",
"Epoch [204/250], Trainingsverlust: 0.9549, Validierungsverlust: 0.9179\n",
"Epoch [205/250], Trainingsverlust: 0.9546, Validierungsverlust: 0.9179\n",
"Epoch [206/250], Trainingsverlust: 0.9547, Validierungsverlust: 0.9179\n",
"Epoch [207/250], Trainingsverlust: 0.9551, Validierungsverlust: 0.9179\n",
"Epoch [208/250], Trainingsverlust: 0.9555, Validierungsverlust: 0.9179\n",
"Epoch [209/250], Trainingsverlust: 0.9559, Validierungsverlust: 0.9179\n",
"Epoch [210/250], Trainingsverlust: 0.9550, Validierungsverlust: 0.9179\n",
"Epoch [211/250], Trainingsverlust: 0.9555, Validierungsverlust: 0.9179\n",
"Epoch [212/250], Trainingsverlust: 0.9550, Validierungsverlust: 0.9179\n",
"Epoch [213/250], Trainingsverlust: 0.9551, Validierungsverlust: 0.9179\n",
"Epoch [214/250], Trainingsverlust: 0.9553, Validierungsverlust: 0.9179\n",
"Epoch [215/250], Trainingsverlust: 0.9548, Validierungsverlust: 0.9179\n",
"Epoch [216/250], Trainingsverlust: 0.9555, Validierungsverlust: 0.9179\n",
"Epoch [217/250], Trainingsverlust: 0.9555, Validierungsverlust: 0.9179\n",
"Epoch [218/250], Trainingsverlust: 0.9547, Validierungsverlust: 0.9179\n",
"Epoch [219/250], Trainingsverlust: 0.9555, Validierungsverlust: 0.9179\n",
"Epoch [220/250], Trainingsverlust: 0.9556, Validierungsverlust: 0.9179\n",
"Epoch [221/250], Trainingsverlust: 0.9553, Validierungsverlust: 0.9179\n",
"Epoch [222/250], Trainingsverlust: 0.9552, Validierungsverlust: 0.9179\n",
"Epoch [223/250], Trainingsverlust: 0.9552, Validierungsverlust: 0.9179\n",
"Epoch [224/250], Trainingsverlust: 0.9549, Validierungsverlust: 0.9179\n",
"Epoch [225/250], Trainingsverlust: 0.9543, Validierungsverlust: 0.9179\n",
"Epoch [226/250], Trainingsverlust: 0.9546, Validierungsverlust: 0.9179\n",
"Epoch [227/250], Trainingsverlust: 0.9553, Validierungsverlust: 0.9179\n",
"Epoch [228/250], Trainingsverlust: 0.9554, Validierungsverlust: 0.9179\n",
"Epoch [229/250], Trainingsverlust: 0.9547, Validierungsverlust: 0.9179\n",
"Epoch [230/250], Trainingsverlust: 0.9554, Validierungsverlust: 0.9179\n",
"Epoch [231/250], Trainingsverlust: 0.9550, Validierungsverlust: 0.9179\n",
"Epoch [232/250], Trainingsverlust: 0.9555, Validierungsverlust: 0.9179\n",
"Epoch [233/250], Trainingsverlust: 0.9554, Validierungsverlust: 0.9179\n",
"Epoch [234/250], Trainingsverlust: 0.9554, Validierungsverlust: 0.9179\n",
"Epoch [235/250], Trainingsverlust: 0.9549, Validierungsverlust: 0.9179\n",
"Epoch [236/250], Trainingsverlust: 0.9552, Validierungsverlust: 0.9179\n",
"Epoch [237/250], Trainingsverlust: 0.9550, Validierungsverlust: 0.9179\n",
"Epoch [238/250], Trainingsverlust: 0.9559, Validierungsverlust: 0.9179\n",
"Epoch [239/250], Trainingsverlust: 0.9549, Validierungsverlust: 0.9179\n",
"Epoch [240/250], Trainingsverlust: 0.9545, Validierungsverlust: 0.9179\n",
"Epoch [241/250], Trainingsverlust: 0.9551, Validierungsverlust: 0.9179\n",
"Epoch [242/250], Trainingsverlust: 0.9550, Validierungsverlust: 0.9179\n",
"Epoch [243/250], Trainingsverlust: 0.9546, Validierungsverlust: 0.9179\n",
"Epoch [244/250], Trainingsverlust: 0.9556, Validierungsverlust: 0.9179\n",
"Epoch [245/250], Trainingsverlust: 0.9553, Validierungsverlust: 0.9179\n",
"Epoch [246/250], Trainingsverlust: 0.9553, Validierungsverlust: 0.9179\n",
"Epoch [247/250], Trainingsverlust: 0.9549, Validierungsverlust: 0.9179\n",
"Epoch [248/250], Trainingsverlust: 0.9551, Validierungsverlust: 0.9179\n",
"Epoch [249/250], Trainingsverlust: 0.9555, Validierungsverlust: 0.9179\n",
"Epoch [250/250], Trainingsverlust: 0.9547, Validierungsverlust: 0.9179\n"
]
}
],
"source": [
"# Listen, um Verluste zu speichern\n",
"train_losses = []\n",
"valid_losses = []\n",
"\n",
"for epoch in range(num_epochs):\n",
" model.train()\n",
" train_loss = 0.0\n",
" for i, (inputs, labels) in enumerate(train_loader):\n",
" optimizer.zero_grad()\n",
" outputs = model(inputs)\n",
" loss = criterion(outputs, labels)\n",
" loss.backward()\n",
" optimizer.step()\n",
" train_loss += loss.item()\n",
"\n",
" # Durchschnittlicher Trainingsverlust\n",
" train_loss /= len(train_loader)\n",
" train_losses.append(train_loss)\n",
"\n",
" # Validierungsverlust\n",
" model.eval()\n",
" valid_loss = 0.0\n",
" with torch.no_grad():\n",
" for inputs, labels in valid_loader:\n",
" outputs = model(inputs)\n",
" loss = criterion(outputs, labels)\n",
" valid_loss += loss.item()\n",
"\n",
" # Durchschnittlicher Validierungsverlust\n",
" valid_loss /= len(valid_loader)\n",
" valid_losses.append(valid_loss)\n",
"\n",
" print(f'Epoch [{epoch+1}/{num_epochs}], Trainingsverlust: {train_loss:.4f}, Validierungsverlust: {valid_loss:.4f}')"
]
},
{
"cell_type": "code",
"execution_count": 17,
"id": "baf1caa8-d3d9-48e8-9339-81194521528d",
"metadata": {
"tags": []
},
"outputs": [
{
"data": {
"image/png": "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ERER6RwGICIiItI5DEBERESkcxiAiIiISOcwABEREZHOYQAiIiIincMARERERDqHAYiIiIh0DgMQERER6RwGICIiItI5DEBERESkcxiAiIiISOcwABEREZHOYQAiIiIincMARERERDqHAYiIiIh0DgMQERER6RwGICIiItI5DEBERESkcxiAiIiISOcwABEREZHOYQAiIiIincMARERERDqHAYiIiIh0DgMQERER6RwGICIiItI5DEBERESkcxiAiIiISOcwABEREZHOYQAiIiIincMARERERDrnjQhAS5cuRbVq1aBQKODt7Y0zZ86UOG9eXh5mzZoFV1dXKBQK1K9fH/v37y9x/m+//RYSiQRjx459DSUnIiKit5HWA9CmTZswbtw4TJ8+HRcuXED9+vXh6+uL+Pj4YuefOnUqfv31VyxZsgTXr1/HsGHD0L17d1y8eLHIvGfPnsWvv/6KevXqve7dICIioreI1gPQwoUL8emnn2LgwIGoXbs2li9fDiMjI6xcubLY+deuXYspU6agU6dOcHFxwfDhw9GpUycsWLBAbb709HQEBATgt99+g6WlpSZ2hYiIiN4SWg1Aubm5OH/+PHx8fMRpUqkUPj4+CA4OLnaZnJwcKBQKtWmGhoY4fvy42rQRI0agc+fOausuSU5ODlJTU9UeREREVHFpNQAlJiZCqVTC1tZWbbqtrS1iY2OLXcbX1xcLFy5EeHg4VCoVDh06hO3btyMmJkacZ+PGjbhw4QLmzZtXqnLMmzcP5ubm4sPJyenld4qIiIjeeFrvAiurxYsXw93dHbVq1YKBgQFGjhyJgQMHQiot2JV79+5hzJgxWLduXZGWopJMnjwZKSkp4uPevXuvcxeIiIhIy7QagKysrCCTyRAXF6c2PS4uDnZ2dsUuY21tjZ07dyIjIwORkZEIDQ2FiYkJXFxcAADnz59HfHw8GjVqBD09Pejp6eHo0aP46aefoKenB6VSWWSdcrkcZmZmag8iIiKquLQagAwMDODl5YXAwEBxmkqlQmBgIJo3b/7cZRUKBRwdHZGfn49t27aha9euAID27dvjypUruHTpkvho3LgxAgICcOnSJchkste6T0RERPTm09N2AcaNG4f+/fujcePGaNq0KRYtWoSMjAwMHDgQANCvXz84OjqK43lOnz6N6OhoNGjQANHR0ZgxYwZUKhUmTJgAADA1NUXdunXVtmFsbIzKlSsXmU5ERES6SesByN/fHwkJCZg2bRpiY2PRoEED7N+/XxwYHRUVJY7vAYDs7GxMnToVd+7cgYmJCTp16oS1a9fCwsJCS3tAREREbxuJIAiCtgvxpklNTYW5uTlSUlI4HoiIiOgtUZbv77fuLDAiIiKiV8UARERERDqHAYiIiIh0DgMQERER6RwGICIiItI5DEBERESkcxiAiIiISOcwABEREZHOYQAiIiIincMARERERDqHAYiIiIh0DgMQERER6RwGICIiItI5DEBERESkcxiAiIiISOcwABEREZHOYQAiIiIincMARERERDqHAYiIiIh0DgMQERER6RwGICIiItI5DEBERESkcxiAiIiISOcwABEREZHOYQAiIiIincMARERERDqHAYiIiIh0DgMQERER6RwGICIiItI5DEBERESkcxiAiIiISOcwABEREZHOYQAiIiIincMARERERDqHAYiIiIh0DgMQERER6RwGICIiItI5DEBERESkcxiAiIiISOcwABEREZHOYQAiIiIincMARERERDqHAYiIiIh0DgMQERER6RwGICIiItI5DEBERESkcxiAiIiISOcwABEREZHOYQAiIiIincMARERERDqHAYiIiIh0DgMQERER6RwGICIiItI5DEBERESkcxiAiIiISOcwABEREZHOYQAiIiIincMARERERDqHAYiIiIh0DgMQERER6Zw3IgAtXboU1apVg0KhgLe3N86cOVPivHl5eZg1axZcXV2hUChQv3597N+/X22eefPmoUmTJjA1NYWNjQ26deuGsLCw170bRERE9JbQegDatGkTxo0bh+nTp+PChQuoX78+fH19ER8fX+z8U6dOxa+//oolS5bg+vXrGDZsGLp3746LFy+K8xw9ehQjRozAqVOncOjQIeTl5aFDhw7IyMjQ1G4RERHRG0wiCIKgzQJ4e3ujSZMm+PnnnwEAKpUKTk5OGDVqFCZNmlRkfgcHB3z11VcYMWKEOK1nz54wNDTEX3/9Vew2EhISYGNjg6NHj6J169YvLFNqairMzc2RkpICMzOzl9wzIiIi0qSyfH9rtQUoNzcX58+fh4+PjzhNKpXCx8cHwcHBxS6Tk5MDhUKhNs3Q0BDHjx8vcTspKSkAgEqVKpW4ztTUVLUHERERVVxaDUCJiYlQKpWwtbVVm25ra4vY2Nhil/H19cXChQsRHh4OlUqFQ4cOYfv27YiJiSl2fpVKhbFjx6Jly5aoW7dusfPMmzcP5ubm4sPJyenVdoyIiIjeaFofA1RWixcvhru7O2rVqgUDAwOMHDkSAwcOhFRa/K6MGDECV69excaNG0tc5+TJk5GSkiI+7t2797qKT0RERG8ArQYgKysryGQyxMXFqU2Pi4uDnZ1dsctYW1tj586dyMjIQGRkJEJDQ2FiYgIXF5ci844cORK7d+/GkSNHUKVKlRLLIZfLYWZmpvYgIiKiikurAcjAwABeXl4IDAwUp6lUKgQGBqJ58+bPXVahUMDR0RH5+fnYtm0bunbtKr4mCAJGjhyJHTt24N9//0X16tVf2z4QERHR20dP2wUYN24c+vfvj8aNG6Np06ZYtGgRMjIyMHDgQABAv3794OjoiHnz5gEATp8+jejoaDRo0ADR0dGYMWMGVCoVJkyYIK5zxIgRWL9+PXbt2gVTU1NxPJG5uTkMDQ01v5NERET0RtF6APL390dCQgKmTZuG2NhYNGjQAPv37xcHRkdFRamN78nOzsbUqVNx584dmJiYoFOnTli7di0sLCzEeZYtWwYAaNu2rdq2Vq1ahQEDBrzuXSIiIqI3nNavA/Qmem3XARIEIC+z/NZHRET0NtM3AiSScltdWb6/td4CpFPyMoG5DtouBRER0ZthygPAwFgrm37rToMnIiIielVsAdIkfaOCtEtEREQF34tawgCkSRKJ1pr6iIiI6Al2gREREZHOYQAiIiIincMARERERDqHAYiIiIh0DgMQERER6RwGICIiItI5DEBERESkcxiAiIiISOcwABEREZHOYQAiIiIincMARERERDqHAYiIiIh0DgMQERER6RzeDb4YgiAAAFJTU7VcEiIiIiqtwu/twu/x52EAKkZaWhoAwMnJScslISIiorJKS0uDubn5c+eRCKWJSTpGpVLhwYMHMDU1hUQiKdd1p6amwsnJCffu3YOZmVm5rpueYD1rDutaM1jPmsO61ozXUc+CICAtLQ0ODg6QSp8/yoctQMWQSqWoUqXKa92GmZkZ/7E0gPWsOaxrzWA9aw7rWjPKu55f1PJTiIOgiYiISOcwABEREZHOYQDSMLlcjunTp0Mul2u7KBUa61lzWNeawXrWHNa1Zmi7njkImoiIiHQOW4CIiIhI5zAAERERkc5hACIiIiKdwwBEREREOocBSIOWLl2KatWqQaFQwNvbG2fOnNF2kd56M2bMgEQiUXvUqlVLfD07OxsjRoxA5cqVYWJigp49eyIuLk6LJX47HDt2DF26dIGDgwMkEgl27typ9rogCJg2bRrs7e1haGgIHx8fhIeHq82TlJSEgIAAmJmZwcLCAoMHD0Z6eroG9+Lt8KK6HjBgQJFj3M/PT20e1vWLzZs3D02aNIGpqSlsbGzQrVs3hIWFqc1Tms+LqKgodO7cGUZGRrCxscGXX36J/Px8Te7KG6009dy2bdsix/SwYcPU5tFEPTMAacimTZswbtw4TJ8+HRcuXED9+vXh6+uL+Ph4bRftrVenTh3ExMSIj+PHj4uvff755/jnn3+wZcsWHD16FA8ePECPHj20WNq3Q0ZGBurXr4+lS5cW+/p3332Hn376CcuXL8fp06dhbGwMX19fZGdni/MEBATg2rVrOHToEHbv3o1jx45hyJAhmtqFt8aL6hoA/Pz81I7xDRs2qL3Oun6xo0ePYsSIETh16hQOHTqEvLw8dOjQARkZGeI8L/q8UCqV6Ny5M3Jzc3Hy5EmsWbMGq1evxrRp07SxS2+k0tQzAHz66adqx/R3330nvqaxehZII5o2bSqMGDFCfK5UKgUHBwdh3rx5WizV22/69OlC/fr1i30tOTlZ0NfXF7Zs2SJOu3HjhgBACA4O1lAJ334AhB07dojPVSqVYGdnJ3z//ffitOTkZEEulwsbNmwQBEEQrl+/LgAQzp49K86zb98+QSKRCNHR0Ror+9vm2boWBEHo37+/0LVr1xKXYV2/nPj4eAGAcPToUUEQSvd5sXfvXkEqlQqxsbHiPMuWLRPMzMyEnJwcze7AW+LZehYEQWjTpo0wZsyYEpfRVD2zBUgDcnNzcf78efj4+IjTpFIpfHx8EBwcrMWSVQzh4eFwcHCAi4sLAgICEBUVBQA4f/488vLy1Oq9Vq1aqFq1Kuv9FURERCA2NlatXs3NzeHt7S3Wa3BwMCwsLNC4cWNxHh8fH0ilUpw+fVrjZX7bBQUFwcbGBjVr1sTw4cPx8OFD8TXW9ctJSUkBAFSqVAlA6T4vgoOD4enpCVtbW3EeX19fpKam4tq1axos/dvj2XoutG7dOlhZWaFu3bqYPHkyMjMzxdc0Vc+8GaoGJCYmQqlUqr2ZAGBra4vQ0FAtlapi8Pb2xurVq1GzZk3ExMRg5syZaNWqFa5evYrY2FgYGBjAwsJCbRlbW1vExsZqp8AVQGHdFXc8F74WGxsLGxsbtdf19PRQqVIl1n0Z+fn5oUePHqhevTpu376NKVOmoGPHjggODoZMJmNdvwSVSoWxY8eiZcuWqFu3LgCU6vMiNja22OO+8DVSV1w9A0Dfvn3h7OwMBwcHXL58GRMnTkRYWBi2b98OQHP1zABEb7WOHTuKf9erVw/e3t5wdnbG5s2bYWhoqMWSEZWP3r17i397enqiXr16cHV1RVBQENq3b6/Fkr29RowYgatXr6qNF6TyV1I9Pz0+zdPTE/b29mjfvj1u374NV1dXjZWPXWAaYGVlBZlMVuRsgri4ONjZ2WmpVBWThYUFatSogVu3bsHOzg65ublITk5Wm4f1/moK6+55x7OdnV2RAf75+flISkpi3b8iFxcXWFlZ4datWwBY12U1cuRI7N69G0eOHEGVKlXE6aX5vLCzsyv2uC98jZ4oqZ6L4+3tDQBqx7Qm6pkBSAMMDAzg5eWFwMBAcZpKpUJgYCCaN2+uxZJVPOnp6bh9+zbs7e3h5eUFfX19tXoPCwtDVFQU6/0VVK9eHXZ2dmr1mpqaitOnT4v12rx5cyQnJ+P8+fPiPP/++y9UKpX4YUcv5/79+3j48CHs7e0BsK5LSxAEjBw5Ejt27MC///6L6tWrq71ems+L5s2b48qVK2qB89ChQzAzM0Pt2rU1syNvuBfVc3EuXboEAGrHtEbqudyGU9Nzbdy4UZDL5cLq1auF69evC0OGDBEsLCzURrlT2X3xxRdCUFCQEBERIZw4cULw8fERrKyshPj4eEEQBGHYsGFC1apVhX///Vc4d+6c0Lx5c6F58+ZaLvWbLy0tTbh48aJw8eJFAYCwcOFC4eLFi0JkZKQgCILw7bffChYWFsKuXbuEy5cvC127dhWqV68uZGVlievw8/MTGjZsKJw+fVo4fvy44O7uLvTp00dbu/TGel5dp6WlCePHjxeCg4OFiIgI4fDhw0KjRo0Ed3d3ITs7W1wH6/rFhg8fLpibmwtBQUFCTEyM+MjMzBTnedHnRX5+vlC3bl2hQ4cOwqVLl4T9+/cL1tbWwuTJk7WxS2+kF9XzrVu3hFmzZgnnzp0TIiIihF27dgkuLi5C69atxXVoqp4ZgDRoyZIlQtWqVQUDAwOhadOmwqlTp7RdpLeev7+/YG9vLxgYGAiOjo6Cv7+/cOvWLfH1rKws4bPPPhMsLS0FIyMjoXv37kJMTIwWS/x2OHLkiACgyKN///6CIBScCv/1118Ltra2glwuF9q3by+EhYWprePhw4dCnz59BBMTE8HMzEwYOHCgkJaWpoW9ebM9r64zMzOFDh06CNbW1oK+vr7g7OwsfPrpp0V+OLGuX6y4OgYgrFq1SpynNJ8Xd+/eFTp27CgYGhoKVlZWwhdffCHk5eVpeG/eXC+q56ioKKF169ZCpUqVBLlcLri5uQlffvmlkJKSorYeTdSz5HGBiYiIiHQGxwARERGRzmEAIiIiIp3DAEREREQ6hwGIiIiIdA4DEBEREekcBiAiIiLSOQxAREREpHMYgIiIAEgkEuzcuVPbxSAiDWEAIiKtGzBgACQSSZGHn5+ftotGRBWUnrYLQEQEAH5+fli1apXaNLlcrqXSEFFFxxYgInojyOVy2NnZqT0sLS0BFHRPLVu2DB07doShoSFcXFywdetWteWvXLmCdu3awdDQEJUrV8aQIUOQnp6uNs/KlStRp04dyOVy2NvbY+TIkWqvJyYmonv37jAyMoK7uzv+/vtvtdevXr2Kjh07wsTEBLa2tvj444+RmJgovt62bVuMHj0aEyZMQKVKlWBnZ4cZM2aUYy0RUXlhACKit8LXX3+Nnj17IiQkBAEBAejduzdu3LgBAMjIyICvry8sLS1x9uxZbNmyBYcPH1YLOMuWLcOIESMwZMgQXLlyBX///Tfc3NzUtjFz5kz06tULly9fRqdOnRAQEICkpCQAQHJyMtq1a4eGDRvi3Llz2L9/P+Li4tCrVy+1daxZswbGxsY4ffo0vvvuO8yaNQuHDh16zbVDRGVWrrdWJSJ6Cf379xdkMplgbGys9pgzZ44gCAV3mB42bJjaMt7e3sLw4cMFQRCEFStWCJaWlkJ6err4+p49ewSpVCreOd3BwUH46quvSiwDAGHq1Kni8/T0dAGAsG/fPkEQBGH27NlChw4d1Ja5d++eAEAICwsTBEEQ2rRpI7zzzjtq8zRp0kSYOHFimeqDiF4/jgEiojfCu+++i2XLlqlNq1Spkvh38+bN1V5r3rw5Ll26BAC4ceMG6tevD2NjY/H1li1bQqVSISwsDBKJBA8ePED79u2fW4Z69eqJfxsbG8PMzAzx8fEAgJCQEBw5cgQmJiZFlrt9+zZq1KhRZB0AYG9vL66DiN4cDEBE9EYwNjYu0iVVXgwNDUs1n76+vtpziUQClUoFAEhPT0eXLl0wf/78IsvZ29uXah1E9ObgGCAieiucOnWqyHMPDw8AgIeHB0JCQpCRkSG+fuLECUilUtSsWROmpqaoVq0aAgMDX3r7jRo1wrVr11CtWjW4ubmpPZ5ueSKitwMDEBG9EXJychAbG6v2ePoMqy1btmDlypW4efMmpk+fjjNnzoiDnAMCAqBQKNC/f39cvXoVR44cwahRo/Dxxx/D1tYWADBjxgwsWLAAP/30E8LDw3HhwgUsWbKk1OUbMWIEkpKS0KdPH5w9exa3b9/GgQMHMHDgQCiVyvKtDCJ67dgFRkRvhP3796t1JQFAzZo1ERoaCqDgDK2NGzfis88+g729PTZs2IDatWsDAIyMjHDgwAGMGTMGTZo0gZGREXr27ImFCxeK6+rfvz+ys7Px448/Yvz48bCyssIHH3xQ6vI5ODjgxIkTmDhxIjp06ICcnBw4OzvDz88PUil/SxK9bSSCIAjaLgQR0fNIJBLs2LED3bp103ZRiKiC4M8WIiIi0jkMQERERKRzOAaIiN547KknovLGFiAiIiLSOQxAREREpHMYgIiIiEjnMAARERGRzmEAIiIiIp3DAEREREQ6hwGIiIiIdA4DEBEREekcBiAiIiLSOf8HUMcbGMo8u+AAAAAASUVORK5CYII=",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import matplotlib.pyplot as plt\n",
"\n",
"plt.plot(train_losses, label='Trainingsverlust')\n",
"plt.plot(valid_losses, label='Validierungsverlust')\n",
"plt.xlabel('Epochen')\n",
"plt.ylabel('Verlust')\n",
"plt.title('Trainings- und Validierungsverlust über die Zeit')\n",
"plt.legend()\n",
"plt.show()\n"
]
},
{
"cell_type": "code",
"execution_count": 18,
"id": "8e339354-a7cc-4e8a-9323-4be41ef62117",
"metadata": {},
"outputs": [],
"source": [
"# Laden der 'kirp' Liste aus der Pickle-Datei\n",
"with open('rick.pickle', 'rb') as f:\n",
" rick = pickle.load(f)\n"
]
},
{
"cell_type": "markdown",
"id": "be10a487-728e-4953-a081-9103d485378c",
"metadata": {},
"source": [
"## Hauptkomponentenanalyse (PCA)"
]
},
{
"cell_type": "code",
"execution_count": 19,
"id": "088db0b3-8c33-41ff-a543-1b1e50c5e589",
"metadata": {
"tags": []
},
"outputs": [
{
"ename": "ValueError",
"evalue": "setting an array element with a sequence.",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)",
"\u001b[0;31mTypeError\u001b[0m: only size-1 arrays can be converted to Python scalars",
"\nThe above exception was the direct cause of the following exception:\n",
"\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m/tmp/ipykernel_19797/2932508590.py\u001b[0m in \u001b[0;36m?\u001b[0;34m()\u001b[0m\n\u001b[0;32m---> 11\u001b[0;31m \u001b[0;32mimport\u001b[0m \u001b[0mnumpy\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 12\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0msklearn\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdecomposition\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mPCA\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 13\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0msklearn\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpreprocessing\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mStandardScaler\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 14\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m~/.local/lib/python3.8/site-packages/sklearn/utils/_set_output.py\u001b[0m in \u001b[0;36m?\u001b[0;34m(self, X, *args, **kwargs)\u001b[0m\n\u001b[1;32m 155\u001b[0m \u001b[0;34m@\u001b[0m\u001b[0mwraps\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 156\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mwrapped\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mX\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 157\u001b[0;31m \u001b[0mdata_to_wrap\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mX\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 158\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata_to_wrap\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtuple\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 159\u001b[0m \u001b[0;31m# only wrap the first output for cross decomposition\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 160\u001b[0m return_tuple = (\n",
"\u001b[0;32m~/.local/lib/python3.8/site-packages/sklearn/base.py\u001b[0m in \u001b[0;36m?\u001b[0;34m(self, X, y, **fit_params)\u001b[0m\n\u001b[1;32m 912\u001b[0m \u001b[0;31m# non-optimized default implementation; override when a better\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 913\u001b[0m \u001b[0;31m# method is possible for a given clustering algorithm\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 914\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0my\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 915\u001b[0m \u001b[0;31m# fit method of arity 1 (unsupervised transformation)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 916\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfit\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mX\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mfit_params\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtransform\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mX\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 917\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 918\u001b[0m \u001b[0;31m# fit method of arity 2 (supervised transformation)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 919\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfit\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mX\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mfit_params\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtransform\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mX\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m~/.local/lib/python3.8/site-packages/sklearn/preprocessing/_data.py\u001b[0m in \u001b[0;36m?\u001b[0;34m(self, X, y, sample_weight)\u001b[0m\n\u001b[1;32m 835\u001b[0m \u001b[0mFitted\u001b[0m \u001b[0mscaler\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 836\u001b[0m \"\"\"\n\u001b[1;32m 837\u001b[0m \u001b[0;31m# Reset internal state before fitting\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 838\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_reset\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 839\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpartial_fit\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mX\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msample_weight\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[0;32m~/.local/lib/python3.8/site-packages/sklearn/base.py\u001b[0m in \u001b[0;36m?\u001b[0;34m(estimator, *args, **kwargs)\u001b[0m\n\u001b[1;32m 1148\u001b[0m skip_parameter_validation=(\n\u001b[1;32m 1149\u001b[0m \u001b[0mprefer_skip_nested_validation\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0mglobal_skip_validation\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1150\u001b[0m )\n\u001b[1;32m 1151\u001b[0m ):\n\u001b[0;32m-> 1152\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mfit_method\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mestimator\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[0;32m~/.local/lib/python3.8/site-packages/sklearn/preprocessing/_data.py\u001b[0m in \u001b[0;36m?\u001b[0;34m(self, X, y, sample_weight)\u001b[0m\n\u001b[1;32m 871\u001b[0m \u001b[0mself\u001b[0m \u001b[0;34m:\u001b[0m \u001b[0mobject\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 872\u001b[0m \u001b[0mFitted\u001b[0m \u001b[0mscaler\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 873\u001b[0m \"\"\"\n\u001b[1;32m 874\u001b[0m \u001b[0mfirst_call\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mhasattr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"n_samples_seen_\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 875\u001b[0;31m X = self._validate_data(\n\u001b[0m\u001b[1;32m 876\u001b[0m \u001b[0mX\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 877\u001b[0m \u001b[0maccept_sparse\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"csr\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"csc\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 878\u001b[0m \u001b[0mdtype\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mFLOAT_DTYPES\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m~/.local/lib/python3.8/site-packages/sklearn/base.py\u001b[0m in \u001b[0;36m?\u001b[0;34m(self, X, y, reset, validate_separately, cast_to_ndarray, **check_params)\u001b[0m\n\u001b[1;32m 601\u001b[0m \u001b[0mout\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 602\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 603\u001b[0m \u001b[0mout\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mX\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 604\u001b[0m \u001b[0;32melif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mno_val_X\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0mno_val_y\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 605\u001b[0;31m \u001b[0mout\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcheck_array\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mX\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0minput_name\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m\"X\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mcheck_params\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 606\u001b[0m \u001b[0;32melif\u001b[0m \u001b[0mno_val_X\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mno_val_y\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 607\u001b[0m \u001b[0mout\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m_check_y\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0my\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mcheck_params\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 608\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m~/.local/lib/python3.8/site-packages/sklearn/utils/validation.py\u001b[0m in \u001b[0;36m?\u001b[0;34m(array, accept_sparse, accept_large_sparse, dtype, order, copy, force_all_finite, ensure_2d, allow_nd, ensure_min_samples, ensure_min_features, estimator, input_name)\u001b[0m\n\u001b[1;32m 913\u001b[0m \u001b[0marray\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mxp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mastype\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0marray\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdtype\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcopy\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mFalse\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 914\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 915\u001b[0m \u001b[0marray\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m_asarray_with_order\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0marray\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0morder\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0morder\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdtype\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mdtype\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mxp\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mxp\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 916\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mComplexWarning\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0mcomplex_warning\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 917\u001b[0;31m raise ValueError(\n\u001b[0m\u001b[1;32m 918\u001b[0m \u001b[0;34m\"Complex data not supported\\n{}\\n\"\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mformat\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0marray\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 919\u001b[0m ) from complex_warning\n\u001b[1;32m 920\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m~/.local/lib/python3.8/site-packages/sklearn/utils/_array_api.py\u001b[0m in \u001b[0;36m?\u001b[0;34m(array, dtype, order, copy, xp)\u001b[0m\n\u001b[1;32m 376\u001b[0m \u001b[0;31m# Use NumPy API to support order\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 377\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mcopy\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mTrue\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 378\u001b[0m \u001b[0marray\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnumpy\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0marray\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0marray\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0morder\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0morder\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdtype\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mdtype\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 379\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 380\u001b[0;31m \u001b[0marray\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnumpy\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0masarray\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0marray\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0morder\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0morder\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdtype\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mdtype\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 381\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 382\u001b[0m \u001b[0;31m# At this point array is a NumPy ndarray. We convert it to an array\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 383\u001b[0m \u001b[0;31m# container that is consistent with the input's namespace.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m~/miniconda3/envs/rl/lib/python3.8/site-packages/pandas/core/generic.py\u001b[0m in \u001b[0;36m?\u001b[0;34m(self, dtype)\u001b[0m\n\u001b[1;32m 1996\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m__array__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdtype\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mnpt\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mDTypeLike\u001b[0m \u001b[0;34m|\u001b[0m \u001b[0;32mNone\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m->\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mndarray\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1997\u001b[0m \u001b[0mvalues\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_values\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1998\u001b[0;31m \u001b[0marr\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0masarray\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mvalues\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdtype\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mdtype\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1999\u001b[0m if (\n\u001b[1;32m 2000\u001b[0m \u001b[0mastype_is_view\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mvalues\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdtype\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0marr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdtype\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2001\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0musing_copy_on_write\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;31mValueError\u001b[0m: setting an array element with a sequence."
]
}
],
"source": [
"import numpy as np\n",
"from sklearn.decomposition import PCA\n",
"from sklearn.preprocessing import StandardScaler\n",
"\n",
"# Angenommen, X ist Ihr Datensatz\n",
"# X = ...\n",
"X = rick\n",
"\n",
"# Standardisieren der Daten\n",
"scaler = StandardScaler()\n",
"X_scaled = scaler.fit_transform(X)\n",
"\n",
"# Erstellen des PCA-Objekts\n",
"pca = PCA(n_components=150) # Angenommen, Sie möchten 150 Hauptkomponenten behalten\n",
"\n",
"# Durchführen der PCA\n",
"X_pca = pca.fit_transform(X_scaled)\n",
"\n",
"# Die resultierenden Hauptkomponenten\n",
"print(\"Transformierte Daten:\", X_pca)\n",
"\n",
"# Variance Ratio für jede Komponente\n",
"print(\"Varianz erklärt durch jede Komponente:\", pca.explained_variance_ratio_)\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "b11bbe20-0494-4e7a-83ff-3cb0bfa82f3b",
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.8.18"
}
},
"nbformat": 4,
"nbformat_minor": 5
}