[PYTHON] Ich habe versucht, das Vorhandensein oder Nichtvorhandensein von Schnee durch maschinelles Lernen vorherzusagen.

Was ich machen wollte

Als Anfänger im maschinellen Lernen wollte ich Pythons Bibliothek für maschinelles Lernen "scikit-learn" verwenden, um maschinelles Lernen zu studieren. Ich überlegte eine Weile, was ich vorhersagen sollte, aber ich begann zu denken, dass es interessant wäre, vorherzusagen, ob sich unter bestimmten Bedingungen Schnee auf dem Boden ansammelt oder nicht.

Übrigens schreibe ich zum ersten Mal eine Python-App. Ich habe mich gefragt, ob ich mit dem bekannten Ruby etwas anfangen könnte, aber Python scheint auf diesem Gebiet stark zu sein, und ich habe mit Python angefangen, weil ich eine faule Person bin, die nicht stolpern und kämpfen will.

Sammeln Sie Daten für das Training

Bereiten Sie zunächst die tatsächlichen Schneedeckendaten vor, um die Engine für maschinelles Lernen zu trainieren. Hier werden die tatsächlichen Beobachtungsdaten von der Download-Site für meteorologische Daten der Meteorologischen Agentur gelöscht. Dieses Mal haben wir die meteorologischen Daten von Sakai City, Präfektur Toyama, die viel Schnee hat, als Trainingsdaten verwendet.

data_2013_2015.csv


Heruntergeladene Zeit: 2016/03/20 20:31:19

,Sakai,Sakai,Sakai,Sakai,Sakai,Sakai,Sakai,Sakai,Sakai,Sakai,Sakai,Sakai,Sakai,Sakai
Datum (und Uhrzeit,Temperatur(℃),Temperatur(℃),Temperatur(℃),Schneedecke(cm),Schneedecke(cm),Schneedecke(cm),Windgeschwindigkeit(m/s),Windgeschwindigkeit(m/s),Windgeschwindigkeit(m/s),Windgeschwindigkeit(m/s),Windgeschwindigkeit(m/s),Niederschlag(mm),Niederschlag(mm),Niederschlag(mm)
,,,,,,,,,Windrichtung,Windrichtung,,,,
,,Qualitätsinformationen,Homogene Zahl,,Qualitätsinformationen,Homogene Zahl,,Qualitätsinformationen,,Qualitätsinformationen,Homogene Zahl,,Qualitätsinformationen,Homogene Zahl
2013/2/1 1:00:00,-3.3,8,1,3,8,1,0.4,8,Westen,8,1,0.0,8,1
2013/2/1 2:00:00,-3.7,8,1,3,8,1,0.3,8,Norden,8,1,0.0,8,1
2013/2/1 3:00:00,-4.0,8,1,3,8,1,0.2,8,Ruhig,8,1,0.0,8,1
2013/2/1 4:00:00,-4.8,8,1,3,8,1,0.9,8,Süd-Südost,8,1,0.0,8,1
...

Die Daten sehen so aus. Sie können die erforderlichen Elemente auf der oben genannten Website der Meteorologischen Agentur auswählen, aber ich habe "Temperatur", "Schneedecke", "Windgeschwindigkeit", "Windrichtung" und "Niederschlag" ausgewählt. Allerdings habe ich die Windgeschwindigkeit und -richtung nicht genutzt ...

Da die Datenmenge, die auf einmal gelöscht werden kann, auf der Website der Meteorologischen Agentur begrenzt ist, wurden die Daten für Februar und März 2004 bis 2015 in vier Teilen gelöscht.

Dies

iconv -f Shift-JIS -t UTF-8 sample_data_sjis/data_2004_2006.csv >> sample_data/data.csv

Konvertieren von SJIS zu UTF-8 auf diese Weise und Löschen unnötiger Zeilen in einer Datei hier sample_data / data.csv).

Von der Ausführung des Lernens bis zur Vorhersage

Verwenden Sie danach scikit-learn, um mit dem trainierten Modell zu trainieren und Vorhersagen zu treffen. Das Skript ist wie folgt.

snow_forecaster.py


import csv
from sklearn.svm import LinearSVC
from sklearn.ensemble import AdaBoostClassifier,ExtraTreesClassifier,GradientBoostingClassifier,RandomForestClassifier
from sklearn.decomposition import TruncatedSVD
from sklearn import datasets
from sklearn.cross_validation import cross_val_score

class SnowForecast:

    CLF_NAMES = ["LinearSVC","AdaBoostClassifier","ExtraTreesClassifier" ,
                 "GradientBoostingClassifier","RandomForestClassifier"]

    def __init__(self):
        u"""Initialisieren Sie jede Instanzvariable"""
        self.clf = None
        self.data = {"target" : [], "data" : []}
        self.weather_data = None
        self.days_data = {}
        self.days_snow = {}

    def load_csv(self):
        u"""Lesen Sie eine CSV-Datei zum Lernen"""
        with open("sample_data/data.csv", "r") as f:
            reader = csv.reader(f)
            accumulation_yesterday = 0
            temp_yeaterday = 0
            date_yesterday = ""
            
            for row in reader:
                if row[4] == "":
                    continue

                daytime = row[0]
                date = daytime.split(" ")[0]
                temp = int(float(row[1]))
                accumulation = int(row[4])
                wind_speed = float(row[7])
                precipitation = float(row[12])

                if date_yesterday != "":
                    # [Temperatur,Niederschlag, 昨日のTemperatur,Schneefall von gestern]
                    sample = [temp, precipitation, temp_yeaterday, accumulation_yesterday]
                    exist = self.accumulation_exist(accumulation)
                    self.data["data"].append(sample)
                    self.data["target"].append(exist)
                    self.days_data[daytime] = sample
                    self.days_snow[daytime] = exist

                if date_yesterday != date:
                    accumulation_yesterday = accumulation
                    temp_yeaterday = temp
                    date_yesterday = date

        return self.data

    def is_snow_exist(self, daytime_str):
        u"""Gibt 1 zurück, wenn Schnee angehäuft ist, 0, wenn nicht angehäuft ist."""
        return self.days_snow[daytime_str]

    def predict_with_date(self, daytime_str):
        u"""Prognostizieren Sie das Vorhandensein oder Fehlen von Schnee anhand der Daten des angegebenen Datums."""
        sample = self.days_data[daytime_str]
        temp = sample[0]
        precipitation = sample[1]
        temp_yeaterday = sample[2]
        accumulation_yesterday = sample[3]
        return self.predict(temp, precipitation, temp_yeaterday, accumulation_yesterday)

    def predict(self, temp, precipitation, temp_yeaterday, accumulation_yesterday):
        u"""Prognostizieren Sie das Vorhandensein oder Fehlen von Schnee anhand der angegebenen Parameter."""
        return self.clf.predict([[temp, precipitation, temp_yeaterday, accumulation_yesterday]])[0]

    def train_data(self):
        u"""Gibt Daten für das Training zurück. Gibt es zurück, wenn es bereits gelesen wurde, falls es noch nicht aus der CVS-Datei gelesen wurde"""
        if self.weather_data is None:
            self.weather_data = self.load_csv()

        return self.weather_data

    def accumulation_exist(self, accumulation):
        u"""Schneefall(cm)Und gibt 1 zurück, wenn es Schnee gibt, 0, wenn nicht"""
        if accumulation > 0:
            return 1
        else:
            return 0

    def best_score_clf(self):
        u"""Berechnen Sie die Punktzahl für jeden Typ von Trainingsmodell und speichern Sie das Objekt mit der höchsten Punktzahl als Instanzvariable.."""
        features = self._features()
        labels = self._labels()

        #Dieses Mal werden nur 4 Mengen zur Berechnung der Merkmalsmenge verwendet, sodass die Merkmalsmenge nicht reduziert wird. Daher ist das Folgende ein Kommentar.
        # lsa = TruncatedSVD(3)
        # reduced_features = lsa.fit_transform(features)

        best = LinearSVC()
        best_name = self.CLF_NAMES[0]
        best_score = 0

        for clf_name in self.CLF_NAMES:
            clf    = eval("%s()" % clf_name) 
            scores = cross_val_score(clf, features, labels, cv=5) #Reduziert, wenn der Funktionsumfang reduziert wird_Verwenden Sie Funktionen
            score  = sum(scores) / len(scores)  #Messen Sie die richtige Antwortrate des Modells
            print("%s Punktzahl:%s" % (clf_name,score))
            if score >= best_score:
                best = clf
                best_name = clf_name
                best_score = score

        print("------\n Zu verwendendes Modell: %s" % best_name)
        return clf

    def train(self):
        u"""Führen Sie das Lernen durch. Bestimmen Sie, welches Modell vor dem eigentlichen Training verwendet werden soll, und lassen Sie es automatisch auswählen."""
        self.clf = self.best_score_clf()
        self.clf.fit(self._features(), self._labels())

    def _features(self):
        u"""Gibt Trainingsdaten zurück."""
        weather = self.train_data()
        return weather["data"]

    def _labels(self):
        u"""Gibt das resultierende Etikett zurück."""
        weather = self.train_data()
        return weather["target"]

    def judge(self, datetime_str):
        u"""Erhält die Datumszeichenfolge und bestimmt die Schneedecke."""
        print("------")
        result = forecaster.predict_with_date(datetime_str)
        print("%s:Erwartet:%s Ist:%s" % (datetime_str, result, forecaster.is_snow_exist(datetime_str)))

        if result == 1:
            print("Schnee türmt sich auf")
        else:
            print("Schnee sammelt sich nicht")

if __name__ == "__main__":
    forecaster = SnowForecast()
    forecaster.train()
    
    #####################################################
    #Die Beurteilung erfolgt durch Angabe des Datums und Angabe der für das Lernen verwendeten Parameter.
    #####################################################
    forecaster.judge("2006/2/19 00:00:00")
    forecaster.judge("2012/2/2 00:00:00")
    forecaster.judge("2014/2/2 13:00:00")
    forecaster.judge("2015/2/28 00:00:00")
    
    #######################################
    #Geben Sie die Parameter direkt an und lassen Sie sie vorhersagen.
    #######################################
    print("------")
    temp = 0.0
    precipitation = 0
    temp_yeaterday = 3.0
    accumulation_yesterday = 2 
    result = forecaster.predict(temp, precipitation, temp_yeaterday, accumulation_yesterday)
    print("[Temperatur:%s] [Niederschlag:%s] [昨日のTemperatur:%s] [Schneefall von gestern:%s]" %
          (temp, precipitation, temp_yeaterday, accumulation_yesterday))
    
    print("Urteilsergebnis: %s" % result)
    
    if result == 1:
        print("Schnee türmt sich auf")
    else:
        print("Schnee sammelt sich nicht")
        
    #########################################################
    #Geben Sie die Parameter direkt an und versuchen Sie vorherzusagen(Die Temperatur von gestern-3.Auf 0 ° C wechseln)。
    #########################################################
    print("------")
    temp_yeaterday = -3.0
    result = forecaster.predict(temp, precipitation, temp_yeaterday, accumulation_yesterday)
    print("[Temperatur:%s] [Niederschlag:%s] [昨日のTemperatur:%s] [Schneefall von gestern:%s]" %
          (temp, precipitation, temp_yeaterday, accumulation_yesterday))
    
    print("Urteilsergebnis: %s" % result)
    
    if result == 1:
        print("Schnee türmt sich auf")
    else:
        print("Schnee sammelt sich nicht")
        
    print("------")

Da ich zum ersten Mal mit Python arbeite, würde ich es begrüßen, wenn Sie auf merkwürdige Punkte hinweisen könnten.

Die Ausführung ist wie folgt

$ python snow_forecaster.py

Das Ausführungsergebnis ist wie folgt.

LinearSVC-Punktzahl:0.965627801273
AdaBoost Classifier Punktzahl:0.969820996581
ExtraTrees Classifier Punktzahl:0.961194223678
GradientBoostingClassifier-Punktzahl:0.966826266875
RandomForestClassifier-Punktzahl:0.958078728911
------
Modell zu verwenden: AdaBoostClassifier
------
2006/2/19 00:00:00:Erwartet:1 Ist:1
Schnee türmt sich auf
------
2012/2/2 00:00:00:Erwartet:1 Ist:1
Schnee türmt sich auf
------
2014/2/2 13:00:00:Erwartet:0 Ist:0
Schnee sammelt sich nicht
------
2015/2/28 00:00:00:Erwartet:0 Ist:0
Schnee sammelt sich nicht
------
[Temperatur:0.0] [Niederschlag:0] [昨日のTemperatur:3.0] [Schneefall von gestern:2]
Urteilsergebnis: 0
Schnee sammelt sich nicht
------
[Temperatur:0.0] [Niederschlag:0] [昨日のTemperatur:-3.0] [Schneefall von gestern:2]
Urteilsergebnis: 1
Schnee türmt sich auf
------

Berechnen Sie zuerst die Punktzahl für mehrere Modelle und führen Sie dann das Training für das Modell mit der besten Punktzahl durch. Es scheint, dass wir hier "AdaBoostClassifier" übernommen haben.

Der Code des Teils zur Auswahl des Modells ist übrigens der Code von Ich habe in 2 Monaten gelernt, bis ich das Produkt als maschinell lernender Amateur veröffentlicht habe Ich benutzte es.

Dann wird das Lernen ausgeführt und das Urteil durchgeführt. In der zweiten Hälfte habe ich gestern versucht, die Temperatur zu ändern, indem ich die Temperatur, die Niederschlagsmenge und die Schneefallmenge gestern gleich gemacht habe. Wenn es gestern 2 cm Schnee gab und die Temperatur gestern 3,0 ° C betrug, wird beurteilt, dass es heute keinen Schnee gibt, aber als ich gestern die Temperatur auf -3,0 ° C änderte und voraussagte, dass "es Schnee gibt". Es änderte sich zum Urteil. Dies scheint intuitiv richtig zu sein, da es gestern geschneit hat und bei niedriger Temperatur wahrscheinlich ungeschmolzen bleibt.

Impressionen etc.

Ich verstehe keine Theorie, aber selbst ein Anfänger könnte die App für maschinelles Lernen in wenigen Stunden ausprobieren. Übrigens habe ich in Bezug auf die Vorhersage der Schneedecke versucht, nur die heutigen Daten vorherzusagen, aber es hat nicht funktioniert, und als ich die Daten von gestern angegeben habe, hat sich die Vorhersagegenauigkeit plötzlich auf fast 97% erhöht. Wenn sich ab gestern Schnee angehäuft hat, ist es sehr wahrscheinlich, dass er am nächsten Tag angehäuft wird. Wenn Sie also die an einem solchen Ort anzugebenden Parameter von einem realistischen Ort aus angeben, verbessert sich die Genauigkeit. habe gedacht. Es ist interessant, also werde ich ein bisschen mehr versuchen, und wenn ich mich daran gewöhnt habe, werde ich die Theorie ein wenig studieren.

Recommended Posts

Ich habe versucht, das Vorhandensein oder Nichtvorhandensein von Schnee durch maschinelles Lernen vorherzusagen.
Vorhersage des Vorhandenseins oder Nichtvorhandenseins von Untreue durch maschinelles Lernen
Ich habe versucht, die Veränderung der Schneemenge für 2 Jahre durch maschinelles Lernen vorherzusagen
[Maschinelles Lernen] Ich habe versucht, die Theorie von Adaboost zusammenzufassen
Ich habe versucht, die Yin- und Yang-Klassifikation hololiver Mitglieder durch maschinelles Lernen zu überprüfen
Ich habe die übliche Geschichte ausprobiert, Deep Learning zu verwenden, um den Nikkei-Durchschnitt vorherzusagen
Ich habe versucht, das Bild mithilfe von maschinellem Lernen zu komprimieren
Ich habe versucht, den Sieg oder die Niederlage der Premier League mit dem Qore SDK vorherzusagen
Ich habe versucht, die Genauigkeit von Modellen für maschinelles Lernen mit Kaggle als Thema zu vergleichen.
Ich ließ RNN Sin Wave lernen und versuchte vorherzusagen
Versuchen Sie, das Triplett des Bootsrennens vorherzusagen, indem Sie das Lernen bewerten
Ich habe versucht, den Verkauf von Spielesoftware mit VARISTA anhand des Artikels von Codexa vorherzusagen
Ich habe versucht, Othello AI mit Tensorflow zu erstellen, ohne die Theorie des maschinellen Lernens zu verstehen ~ Implementierung ~
Ich habe versucht, die Vorhersage-API des maschinellen Lernmodells von WordPress aus aufzurufen
Ich habe versucht, die optimale Route des Traumlandes durch (Quanten-) Tempern zu finden
Ich habe versucht, die Beschleunigung von Python durch Cython zu verifizieren und zu analysieren
Ich habe versucht, das Modell mit der Low-Code-Bibliothek für maschinelles Lernen "PyCaret" zu visualisieren.
Ich habe versucht, das Ergebnis des A / B-Tests mit dem Chi-Quadrat-Test zu überprüfen
Ich habe versucht, das Verhalten des neuen Koronavirus mit dem SEIR-Modell vorherzusagen.
Ich habe versucht, die Trapezform des Bildes zu korrigieren
Ich habe versucht, die Texte von Hinatazaka 46 zu vektorisieren!
Ich habe versucht, Othello AI mit Tensorflow zu erstellen, ohne die Theorie des maschinellen Lernens zu verstehen ~ Battle Edition ~
Versuchen Sie, den Wert des Wasserstandsmessers durch maschinelles Lernen unter Verwendung der offenen Daten von Data City Sabae vorherzusagen
Ich habe versucht, die Verschlechterung des Lithium-Ionen-Akkus mithilfe des Qore SDK vorherzusagen
Ich habe versucht, die beim maschinellen Lernen verwendeten Bewertungsindizes zu organisieren (Regressionsmodell).
Ich habe versucht, das Bild zu verarbeiten und zu transformieren und die Daten für maschinelles Lernen zu erweitern
Ich habe versucht, die Daten des Laptops durch Booten unter Ubuntu zu retten
Ich habe versucht, maschinelles Lernen (Objekterkennung) mit TouchDesigner zu verschieben
Ich habe versucht, das Spiel in der J League vorherzusagen (Datenanalyse)
Prognostizieren Sie das Geschlecht von Twitter-Nutzern durch maschinelles Lernen
Ich habe versucht, die Spacha-Informationen von VTuber zu visualisieren
Ich habe versucht, den negativen Teil von Meros zu löschen
Ich habe versucht, die Anzahl durch Programmieren zu erhöhen oder zu verringern
Ich habe versucht, die Stimmen der Sprecher zu klassifizieren
Ich habe versucht, die String-Operationen von Python zusammenzufassen
Ich habe versucht, die Anzahl der mit dem Coronavirus infizierten Menschen in Japan nach der Methode des neuesten Papiers in China vorherzusagen
Ich habe versucht, die Lernfunktion im neuronalen Netzwerk sorgfältig zu verstehen, ohne die Bibliothek für maschinelles Lernen zu verwenden (erste Hälfte).
[Keras] Ich habe versucht, das Problem der Klassifizierung des Donut-Typ-Bereichs durch maschinelles Lernen zu lösen. [Studie]
Ich habe versucht, Pferderennen vorherzusagen, indem ich alles von der Datenerfassung bis zum tiefen Lernen getan habe
Ich habe "Lobe" ausprobiert, mit dem das von Microsoft veröffentlichte Modell des maschinellen Lernens problemlos trainiert werden kann.
Ich habe versucht, die Entropie des Bildes mit Python zu finden
[Pferderennen] Ich habe versucht, die Stärke des Rennpferdes zu quantifizieren
Versuchen Sie, die Leistung des Modells für maschinelles Lernen / Regression zu bewerten
Ich habe versucht, mit TensorFlow den Durchschnitt mehrerer Spalten zu ermitteln
Ich habe versucht, die Erkennung von Anomalien durch spärliches Strukturlernen zu implementieren
Versuchen Sie, die Leistung des Modells für maschinelles Lernen / Klassifizierung zu bewerten
Ich habe versucht, durch maschinelles Lernen Sätze in den XX-Stil umzuwandeln
So erhöhen Sie die Anzahl der Datensatzbilder für maschinelles Lernen
[Python] Ich habe versucht, die folgende Beziehung von Twitter zu visualisieren
Ich habe versucht, ListNet of Rank Learning mit Chainer zu implementieren
[TF] Ich habe versucht, das Lernergebnis mit Tensorboard zu visualisieren
Ich habe versucht, das lokale Minimum der Goldstein-Preis-Funktion zu bekämpfen
Ich habe versucht, die Infektion mit einer neuen Lungenentzündung mithilfe des SIR-Modells vorherzusagen: ☓ Wuhan ed. ○ Hubei ed.
Ich habe versucht, das Musikgenre anhand des Songtitels im Recurrent Neural Network vorherzusagen
Bestätigt den Unterschied im Vorhandensein oder Fehlen einer zufälligen Verarbeitung während des Mini-Batch-Lernens mit Chainer
Ich habe versucht, es sorgfältig zu verstehen, während ich den Algorithmus Adaboost beim maschinellen Lernen implementiert habe (+ ich habe mein Verständnis der Array-Berechnung vertieft)