diff --git a/algorithm/decision_tree/tree.py b/algorithm/decision_tree/tree.py
index 75bad482485e2ba99ea479c3b41f35b27eb83ea3..c04dc1f0c75e27faf72f6ec1b8ed57ae84371c56 100644
--- a/algorithm/decision_tree/tree.py
+++ b/algorithm/decision_tree/tree.py
@@ -55,6 +55,6 @@ class Tree:
 
     def str_content(self):
         if self.children:
-            return f'θ: {self.threshold}'
+            return f'Attr: {self.best_attribute}, θ: {self.threshold}'
         else:
             return f'Classification: {self.threshold}'
diff --git a/aufgaben/p10/evaluation.py b/aufgaben/p10/evaluation.py
index 9748118267d4281188711ec2ca6ab532a2e32c52..731165aeb45ad95de6b17a20aa01aa95572e5be6 100644
--- a/aufgaben/p10/evaluation.py
+++ b/aufgaben/p10/evaluation.py
@@ -9,7 +9,10 @@ from algorithm.k_nearest_neighbors.k_nearest_neighbors_algorithm import KNearest
 from aufgaben.p4.testdata import get_evaluation_data
 from aufgaben.p6.error_rate import ErrorRate
 from aufgaben.p6.multiclass_error_rate import Multiclass_ErrorRate
-
+from features.standard_deviation import standard_deviation
+from features.arithmetic_mean import arithmetic_mean
+from features.median import median
+from features.extremwerte import maximum
 
 def evaluate_algorithm(training_data, test_data, algorithm, evaluator, args=None):
     if args is None:
@@ -30,7 +33,7 @@ def evaluate_algorithm(training_data, test_data, algorithm, evaluator, args=None
 
 
 def evaluate():
-    test_data, training_data = get_evaluation_data(200, True)
+    test_data, training_data = get_evaluation_data(200, [standard_deviation, arithmetic_mean, median, maximum])
     classes = list(set(test[1] for test in test_data))
 
     # DecisionTree
@@ -44,7 +47,7 @@ def evaluate():
 
     # PLA
     print("\nPLA")
-    weights = [random.random(), random.random()]
+    weights = [random.random(), random.random(), random.random(), random.random()]
     threshold = 0.5
     perceptron = Perceptron(weights, threshold, numpy.tanh)
     train(perceptron, training_data, 10000, 0.1)
diff --git a/aufgaben/p4/testdata.py b/aufgaben/p4/testdata.py
index 543d7a02a9fba275c74065039d04a7f9006b4630..cb4ef8eef41d639361c8c1e059d4b1027dd6988c 100644
--- a/aufgaben/p4/testdata.py
+++ b/aufgaben/p4/testdata.py
@@ -79,45 +79,42 @@ def get_labeled_testdata():
     return test_data, training_data
 
 
-def get_evaluation_data(window_size, second_feature=False):
-    # Hole die aus den Sensordaten berechneten Merkmale
-    joggen_feature, kniebeuge_feature, jj_feature = classification_evaluation(window_size, standard_deviation)
-
-    # Wir nehmen nur DATA_LIMIT an Daten (sonst ist K-Nearest-Neighbors zu langsam)
-    joggen_feature = joggen_feature[: min(DATA_LIMIT_PER_TYPE, len(joggen_feature))]
-    kniebeuge_feature = kniebeuge_feature[: min(DATA_LIMIT_PER_TYPE, len(kniebeuge_feature))]
-    jj_feature = jj_feature[: min(DATA_LIMIT_PER_TYPE, len(jj_feature))]
-
-    # Wandel Liste an Merkmalen in einzelne Merkmalsvektoren um
-    if second_feature:
-        joggen_feature2, kniebeuge_feature2, jj_feature2 = classification_evaluation(window_size, arithmetic_mean)
-        joggen_feature2 = joggen_feature2[: min(DATA_LIMIT_PER_TYPE, len(joggen_feature2))]
-        kniebeuge_feature2 = kniebeuge_feature2[: min(DATA_LIMIT_PER_TYPE, len(kniebeuge_feature2))]
-        jj_feature2 = jj_feature2[: min(DATA_LIMIT_PER_TYPE, len(jj_feature2))]
-        joggen_vector = []
+def get_evaluation_data(window_size, feature_list: []):
+    joggen_vector = None
+    kniebeugen_vector = None
+    jj_vector = None
+
+    for feature in feature_list:
+        # Hole die aus den Sensordaten berechneten Merkmale
+        joggen_feature, kniebeuge_feature, jj_feature = classification_evaluation(window_size, feature)
+
+        if not joggen_vector:
+            joggen_vector = [[] for _ in joggen_feature][: min(DATA_LIMIT_PER_TYPE, len(joggen_feature))]
+            kniebeugen_vector = [[] for _ in kniebeuge_feature][: min(DATA_LIMIT_PER_TYPE, len(kniebeuge_feature))]
+            jj_vector = [[] for _ in jj_feature][: min(DATA_LIMIT_PER_TYPE, len(jj_feature))]
+
+        # Wir nehmen nur DATA_LIMIT an Daten (sonst ist K-Nearest-Neighbors zu langsam)
+        joggen_feature = joggen_feature[: min(DATA_LIMIT_PER_TYPE, len(joggen_feature))]
+        kniebeuge_feature = kniebeuge_feature[: min(DATA_LIMIT_PER_TYPE, len(kniebeuge_feature))]
+        jj_feature = jj_feature[: min(DATA_LIMIT_PER_TYPE, len(jj_feature))]
         for i in range(len(joggen_feature)):
-            joggen_vector.append([joggen_feature[i], joggen_feature2[i]])
-        kniebeugen_vector = []
+            joggen_vector[i].append(joggen_feature[i])
         for i in range(len(kniebeuge_feature)):
-            kniebeugen_vector.append([kniebeuge_feature[i], kniebeuge_feature2[i]])
-        jj_vector = []
+            kniebeugen_vector[i].append(kniebeuge_feature[i])
         for i in range(len(jj_feature)):
-            jj_vector.append([jj_feature[i], jj_feature2[i]])
-    else:
-        joggen_vector = ([element] for element in joggen_feature)
-        kniebeugen_vector = ([element] for element in kniebeuge_feature)
-        jj_vector = ([element] for element in jj_feature)
+            jj_vector[i].append(jj_feature[i])
+
 
     # Weise den Trainingsdaten eine Klasse zu
     # 0 = Kniebeuge, 1 = Joggen
-    training_data_joggen = list(zip(joggen_vector, [CLASS_JOGGEN] * len(joggen_feature)))
-    training_data_kniebeuge = list(zip(kniebeugen_vector, [CLASS_KNIEBEUGE] * len(kniebeuge_feature)))
-    training_data_jj = list(zip(jj_vector, [CLASS_JUMPINGJACK] * len(jj_feature)))
+    training_data_joggen = list(zip(joggen_vector, [CLASS_JOGGEN] * len(joggen_vector)))
+    training_data_kniebeuge = list(zip(kniebeugen_vector, [CLASS_KNIEBEUGE] * len(kniebeugen_vector)))
+    training_data_jj = list(zip(jj_vector, [CLASS_JUMPINGJACK] * len(jj_vector)))
 
     # Wir nehmen 90 % der Testdaten zum Trainieren und 10 % zum Testen
-    delimiter_joggen = floor(len(joggen_feature) * TRAINING_DATA_PERCENTAGE)
-    delimiter_kniebeuge = floor(len(kniebeuge_feature) * TRAINING_DATA_PERCENTAGE)
-    delimiter_jj = floor(len(jj_feature) * TRAINING_DATA_PERCENTAGE)
+    delimiter_joggen = floor(len(joggen_vector) * TRAINING_DATA_PERCENTAGE)
+    delimiter_kniebeuge = floor(len(kniebeugen_vector) * TRAINING_DATA_PERCENTAGE)
+    delimiter_jj = floor(len(jj_vector) * TRAINING_DATA_PERCENTAGE)
 
     training_data = training_data_joggen[:delimiter_joggen] + training_data_kniebeuge[:delimiter_kniebeuge] + training_data_jj[:delimiter_jj]
     test_data = training_data_joggen[delimiter_joggen:] + training_data_kniebeuge[delimiter_kniebeuge:] + training_data_jj[delimiter_jj:]