Zum Inhalt springen →

jentsch.io Beiträge

Live-Reload für Spring Boot und Thymeleaf in IntelliJ für eine beschleunigte Entwicklung

Die Entwicklung von Webapplikationen mit Spring Boot und Thymeleaf in IntelliJ kann zu einer frustrierenden Erfahrung werden, wenn man bei jeder kleinen Änderung an den Templates oder statischen Ressourcen wie CSS- und JavaScript-Dateien die Anwendung neu starten muss. Dieser Prozess verlangsamt die Entwicklung erheblich. Daher habe ich mich mal nach einer Lösung für das Problem umgesehen und glücklicherweise gibt es eine Reihe von Konfigurationseinstellungen in der application.properties-Datei, die dieses Problem lösen und einen nahtlosen Live-Reload der statischen Ressourcen und Templates ermöglichen. Standardmäßig ist Spring Boot für die Produktionsumgebung optimiert. Das bedeutet, dass Thymeleaf-Templates und statische Ressourcen aus Effizienzgründen zwischengespeichert werden. Während dies in der Produktion die Performance verbessert, führt es in der Entwicklung dazu, dass Änderungen an den Dateien nicht sofort…

Kommentare sind geschlossen

30 Tage scikit-learn – Tag 26: Unbalancierte Datensätze

TODO für Tag 26 Umgang mit unbalancierten Klassen (class_weight) In scikit-learn wird der Parameter class_weight in vielen Klassifikationsalgorithmen (wie z.B. LogisticRegression, SVC, DecisionTreeClassifier, RandomForestClassifier) verwendet, um mit unbalancierten Klassen umzugehen. Die Grundidee ist, den Loss beim Training des Modells für die unterrepräsentierte(n) Klasse(n) höher zu gewichten. Wenn z.B. eine Klasse deutlich mehr Instanzen hat als andere (z.B. 90% Klasse A, 10% Klasse B), neigen viele Algorithmen dazu, die Mehrheitsklasse übermäßig gut zu lernen und die Minderheitsklasse zu ignorieren. Das liegt daran, dass der Standard-Loss-Funktion jeder Fehler gleich viel „kostet“. Ein Modell, das einfach immer die Mehrheitsklasse vorhersagt, hätte bereits eine hohe Accuracy, aber eine schlechte Leistung für die Minderheitsklasse. Um dem Problem zu begegnen, gibt es den Parameter class_weight. Er…

Kommentare sind geschlossen

30 Tage scikit-learn – Tag 25: Advanced Cross-Validation: Stratified KFold

TODO für Tag 25 Stratifikation bei Klassifikationsproblemen anwenden Stratified K-Fold Cross-Validation ist eine Variante der K-Fold Cross-Validation, die besonders nützlich ist, wenn man mit imbalancierten Datensätzen in Klassifikationsproblemen arbeiten. Ziel ist es, eine robustere Schätzung der Leistungsfähigkeit eines Modells auf unbekannten Daten zu erhalten und Overfitting zu vermeiden. Standard K-Fold teilt den Datensatz in K gleiche Teile (Folds). Mit den Daten wird das Modell dann K-mal trainiert. Jedes Mal wird ein anderer Fold als Testset verwendet und die restlichen K-1 Folds als Trainingsset. Die Genauigkeit der K Durchläufe werden dann gemittelt. Standard K-Fold hat aber ein Problem mit imbalancierten Daten. Das ist der Fall, wenn die verschiedenen Klassen nicht annähernd gleich häufig vorkommen (z.B. 90% Klasse A, 10% Klasse B). Bei einer zufälligen…

Kommentare sind geschlossen

30 Tage scikit-learn – Tag 24: Mehrfeature-Datensätze verwenden

TODO für Tag 24 California Housing Dataset Das California Housing Dataset in scikit-learn ist ein populärer Datensatz, der häufig für Regressionsaufgaben im maschinellen Lernen herangezogen wird. Sein Ziel ist die Vorhersage des Haus-Werts in Kalifornien. Was diesen Datensatz besonders kennzeichnet und für die Praxis relevant macht, ist seine Natur als Mehrfeature-Datensatz. Das bedeutet, dass die Vorhersage des Hauspreises nicht auf einer einzelnen Eigenschaft basiert, sondern auf einer Kombination verschiedener Merkmale, die jeden geografischen Block beschreiben. Zu diesen Merkmalen gehören beispielsweise das Einkommen der Haushalte in einem Block, das Durchschnittsalter der Häuser, die durchschnittliche Anzahl der Zimmer und Schlafzimmer pro Haushalt, die Bevölkerungsdichte sowie die geografische Lage, ausgedrückt durch Längen- und Breitengrade. Jedes dieser Attribute liefert eine andere Facette an Information,…

Kommentare sind geschlossen

30 Tage scikit-learn – Tag 23: Regression: Ridge und Lasso

TODO für Tag 23 Unterschied zu einfacher LinearRegression Die einfache LinearRegression in scikit-learn versucht, eine Gerade oder Hyperebene zu finden, die die Summe der quadrierten Abweichungen zwischen den vorhergesagten und den tatsächlichen Werten minimiert. Sie ist anfällig für Overfitting, besonders bei vielen Features oder wenn Features stark miteinander korrelieren, was zu instabilen Koeffizienten führen kann. Ridge-Regression fügt der Kostenfunktion der einfachen linearen Regression einen zusätzlichen Term hinzu. Dieser Term ist die Summe der quadrierten Werte aller Koeffizienten, multipliziert mit einem Regularisierungsparameter namens alpha. Durch diese sogenannte L2-Regularisierung werden die Koeffizienten dazu gezwungen, kleiner zu werden. Sie werden zwar in Richtung 0 geschrumpft, erreichen aber selten exakt 0. Das Ergebnis ist ein Modell, das robuster gegenüber kleinen Änderungen in den Trainingsdaten ist und eine…

Kommentare sind geschlossen

30 Tage scikit-learn – Tag 22: Modell speichern und laden

TODO für Tag 22 joblib zum Speichern und Laden von Modellen verwenden Joblib ist eine Python-Bibliothek, die eine Reihe von Werkzeugen bereitstellt, um häufige Aufgaben in der wissenschaftlichen Datenverarbeitung und im maschinellen Lernen zu vereinfachen und zu beschleunigen. Eine der bekanntesten Funktionen ist die Serialisierung und Deserialisierung von Python-Objekten, insbesondere solcher, die große NumPy-Arrays enthalten, wie es bei trainierten scikit-learn-Modellen der Fall ist. Dies bedeutet, dass joblib beliebige Python-Objekte in Dateien auf der Festplatte speichern kann, sodass sie später wieder geladen und verwendet werden können, ohne dass ein erneutes Training oder eine Neuberechnung erforderlich ist. Die Installation von joblib ist unkompliziert und erfolgt üblicherweise über den Python-Paketmanager pip mit dem Befehl pip install joblib. In den meisten fällen ist das aber nicht nötig, da…

Kommentare sind geschlossen

30 Tage scikit-learn – Tag 21: Textdaten mit scikit-learn

TODO für Tag 21 Einfaches Bag-of-Words Modell mit CountVectorizer Ein Bag-of-Words Modell stellt eine Methode dar, um Text in ein numerisches Format umzuwandeln, das von Computeralgorithmen verarbeitet werden kann. Bei diesem Modell wird ein Textdokument als eine ungeordnete Sammlung seiner Wörter betrachtet, wobei die Grammatik und die Reihenfolge der Wörter vollständig ignoriert werden. Der Fokus liegt einzig auf der Häufigkeit, mit der jedes Wort im Dokument vorkommt. In scikit-learn implementiert der CountVectorizer dieses Bag-of-Words Konzept auf eine einfache und effiziente Weise. Seine Hauptaufgabe ist es, eine Sammlung von Textdokumenten, zu nehmen und daraus eine Matrix von Wort-Zählungen zu erstellen. Zunächst analysiert der CountVectorizer den gesamten Korpus, um ein Vokabular aller einzigartigen Wörter zu erstellen, die im Text vorkommen. Dieses Vokabular bildet die Grundlage für…

Kommentare sind geschlossen

30 Tage scikit-learn – Tag 20: Dimensionalitätsreduktion mit PCA

TODO für Tag 20 Prinzipielle Einführung in PCA Die Hauptkomponentenanalyse, als PCA abgekürzt, ist eine Technik zur Dimensionalitätsreduktion. Ihr Hauptziel besteht darin, die Anzahl der Dimensionen eines Datensatzes zu verringern, während gleichzeitig so viel wie möglich von der ursprünglichen Varianz, also der Information, in den Daten erhalten bleibt. Dies ist besonders nützlich bei hochdimensionalen Datensätzen, wo viele Merkmale redundant sein können. Die grundlegende Idee hinter PCA ist es, einen neuen Satz von Features zu finden, die sogenannten Hauptkomponenten. Diese Hauptkomponenten sind Kombinationen der ursprünglichen Merkmale. Die erste Hauptkomponente ist die Richtung im Merkmalsraum, entlang derer die Daten die größte Varianz aufweisen. Jede nachfolgende Hauptkomponente wird so gewählt, dass sie die nächstgrößte verbleibende Varianz erklärt, unter der Bedingung, dass sie unkorreliert…

Kommentare sind geschlossen

30 Tage scikit-learn – Tag 19: Pipeline + Cross-Validation kombinieren

TODO für Tag 18 Cross-Validation innerhalb einer Pipeline durchführen Die Durchführung von Kreuzvalidierung innerhalb einer Pipeline ist ein Ansatz, der dabei hilft, robuste und verlässliche Modelle zu entwickeln. Das Prinzip ist, sicherzustellen, dass alle Schritte der Datenvorverarbeitung, wie Skalierung, Imputation fehlender Werte oder Merkmalsextraktion, korrekt innerhalb jedes einzelnen Kreuzvalidierungs-Splits angewendet werden. Dies verhindert ein sogenanntes „Data Leakage“, bei dem Informationen aus den Testdaten (oder Validierungsdaten innerhalb eines Folds) unbeabsichtigt in den Trainingsprozess der Vorverarbeitungsschritte einfließen und so zu optimistischen und unrealistischen Leistungsschätzungen führen. Eine Pipeline führt eine Sequenz von Datentransformatoren und einem finalen Schätzer (dem eigentlichen Modell) zu einem einzigen Objekt zusammen. Wenn dieses Pipeline-Objekt dann einer Kreuzvalidierungsfunktion wie GridSearchCV übergeben wird, behandelt die Kreuzvalidierungslogik die gesamte Pipeline als eine Einheit. Die…

Kommentare sind geschlossen

30 Tage scikit-learn – Tag 18: Mehr Klassifikatoren vergleichen

TODO für Tag 18 Erst mal eine kurze Vorstellung der 3 Algorithmen, auch wenn sie schon in den vorherigen Tagen der 30 Tage scikit-learn Challenge verwendet wurden. Logistic Regression Die Logistische Regression ist ein Algorithmus der hauptsächlich für Klassifikationsaufgaben verwendet wird, insbesondere für binäre Klassifikationsprobleme (d.h. Probleme mit zwei möglichen Ergebnissen, z.B. Ja/Nein, 0/1, Spam/Kein Spam). Trotz des Namens „Regression“ im Titel ist das primäre Ziel die Klassifikation. Ähnlich wie die lineare Regression berechnet sie eine gewichtete Summe der Eingabemerkmale (plus einem Bias-Term). Das Ergebnis dieser linearen Kombination wird dann durch die Sigmoid-Funktion geleitet. Diese Funktion „quetscht“ jeden beliebigen reellen Eingabewert in einen Ausgabewert zwischen 0 und 1. Der Ausgabewert der Sigmoid-Funktion wird als Wahrscheinlichkeit interpretiert, dass die gegebene Eingabe zur positiven Klasse gehört…

Kommentare sind geschlossen