[PYTHON] J'ai essayé de prédire la présence ou l'absence de neige par apprentissage automatique.

Ce que je voulais faire

En tant que débutant en apprentissage automatique, je voulais utiliser la bibliothèque d'apprentissage automatique de Python scikit-learn pour étudier l'apprentissage automatique. J'ai réfléchi à ce qu'il fallait prévoir pendant un moment, mais j'ai commencé à penser qu'il serait intéressant de prédire si de la neige s'accumule ou non sur le sol dans des conditions spécifiques.

Au fait, c'est la première fois que j'écris une application Python. Je me demandais si je pouvais faire quelque chose avec le Ruby familier, mais Python semble être fort dans ce domaine, et j'ai commencé avec Python parce que je suis une personne paresseuse qui ne veut pas trébucher et avoir des problèmes.

Collectez des données pour la formation

Eh bien, tout d'abord, préparez les données réelles de couverture de neige pour entraîner le moteur d'apprentissage automatique. Ici, les données d'observation réelles sont supprimées du Site de téléchargement des données météorologiques de l'Agence météorologique. Cette fois, nous avons utilisé les données météorologiques de la ville de Sakai, dans la préfecture de Toyama, qui a beaucoup de neige, comme données d'entraînement.

data_2013_2015.csv


Temps de téléchargement: 2016/03/20 20:31:19

,Sakai,Sakai,Sakai,Sakai,Sakai,Sakai,Sakai,Sakai,Sakai,Sakai,Sakai,Sakai,Sakai,Sakai
Date et l'heure,Température(℃),Température(℃),Température(℃),La couverture de neige(cm),La couverture de neige(cm),La couverture de neige(cm),vitesse du vent(m/s),vitesse du vent(m/s),vitesse du vent(m/s),vitesse du vent(m/s),vitesse du vent(m/s),Précipitation(mm),Précipitation(mm),Précipitation(mm)
,,,,,,,,,Direction du vent,Direction du vent,,,,
,,information de qualité,Nombre homogène,,information de qualité,Nombre homogène,,information de qualité,,information de qualité,Nombre homogène,,information de qualité,Nombre homogène
2013/2/1 1:00:00,-3.3,8,1,3,8,1,0.4,8,Ouest,8,1,0.0,8,1
2013/2/1 2:00:00,-3.7,8,1,3,8,1,0.3,8,Nord,8,1,0.0,8,1
2013/2/1 3:00:00,-4.0,8,1,3,8,1,0.2,8,Silencieux,8,1,0.0,8,1
2013/2/1 4:00:00,-4.8,8,1,3,8,1,0.9,8,Sud-sud-est,8,1,0.0,8,1
...

Les données ressemblent à ceci. Vous pouvez sélectionner les éléments nécessaires sur le site ci-dessus de l'Agence météorologique, mais j'ai sélectionné «température», «couverture de neige», «vitesse du vent», «direction du vent» et «précipitations». Cependant, je n'ai pas utilisé la vitesse et la direction du vent ...

De plus, étant donné que la quantité de données pouvant être supprimées à un moment donné est limitée sur le site Web de l'Agence météorologique, les données de 2004 à février et mars 2015 ont été supprimées en quatre parties.

cette

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

Conversion de SJIS en UTF-8 de cette manière, et suppression des lignes inutiles dans un fichier [ici](https://github.com/hiroeorz/snow-forecast/blob/master/ sample_data / data.csv).

De l'exécution de l'apprentissage à la prédiction

Après cela, utilisez scicit-learn pour vous entraîner et essayez de faire des prédictions à l'aide du modèle entraîné. Le script est le suivant.

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"""Initialiser chaque variable d'instance"""
        self.clf = None
        self.data = {"target" : [], "data" : []}
        self.weather_data = None
        self.days_data = {}
        self.days_snow = {}

    def load_csv(self):
        u"""Lire un fichier CSV pour apprendre"""
        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 != "":
                    # [Température,Précipitation, 昨日のTempérature,Chutes de neige d'hier]
                    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"""Renvoie 1 si la neige est empilée, 0 si non empilée."""
        return self.days_snow[daytime_str]

    def predict_with_date(self, daytime_str):
        u"""Prédisez la présence ou l'absence de neige en utilisant les données de la date donnée."""
        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"""Prédire la présence ou l'absence de neige en utilisant les paramètres donnés."""
        return self.clf.predict([[temp, precipitation, temp_yeaterday, accumulation_yesterday]])[0]

    def train_data(self):
        u"""Renvoie les données pour l'entraînement. Renvoie-le s'il a déjà été lu, s'il n'est pas encore lu à partir du fichier CVS"""
        if self.weather_data is None:
            self.weather_data = self.load_csv()

        return self.weather_data

    def accumulation_exist(self, accumulation):
        u"""Chute de neige(cm)Et renvoie 1 s'il y a de la neige, 0 sinon"""
        if accumulation > 0:
            return 1
        else:
            return 0

    def best_score_clf(self):
        u"""Calculez le score pour chaque type de modèle d'entraînement et stockez l'objet avec le score le plus élevé comme variable d'instance.."""
        features = self._features()
        labels = self._labels()

        #Cette fois, seules 4 quantités sont utilisées pour calculer la quantité d'objets, donc la quantité d'objets n'est pas réduite. Par conséquent, ce qui suit est un commentaire.
        # 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) #Réduit lorsque la quantité de fonctionnalités est réduite_Utiliser les fonctionnalités
            score  = sum(scores) / len(scores)  #Mesurer le taux de réponse correct du modèle
            print("%score de s:%s" % (clf_name,score))
            if score >= best_score:
                best = clf
                best_name = clf_name
                best_score = score

        print("------\n Modèle à utiliser: %s" % best_name)
        return clf

    def train(self):
        u"""Effectuer l'apprentissage. Déterminez le modèle à utiliser avant l'entraînement réel et laissez-le être sélectionné automatiquement."""
        self.clf = self.best_score_clf()
        self.clf.fit(self._features(), self._labels())

    def _features(self):
        u"""Renvoie les données d'entraînement."""
        weather = self.train_data()
        return weather["data"]

    def _labels(self):
        u"""Renvoie l'étiquette résultante."""
        weather = self.train_data()
        return weather["target"]

    def judge(self, datetime_str):
        u"""Reçoit la chaîne de caractères de date et détermine la couverture de neige."""
        print("------")
        result = forecaster.predict_with_date(datetime_str)
        print("%s:Attendu:%s Réel:%s" % (datetime_str, result, forecaster.is_snow_exist(datetime_str)))

        if result == 1:
            print("La neige s'accumule")
        else:
            print("La neige ne s'entasse pas")

if __name__ == "__main__":
    forecaster = SnowForecast()
    forecaster.train()
    
    #####################################################
    #Le jugement se fait en précisant la date et en donnant les paramètres utilisés pour l'apprentissage.
    #####################################################
    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")
    
    #######################################
    #Donnez directement les paramètres et laissez-les prédire.
    #######################################
    print("------")
    temp = 0.0
    precipitation = 0
    temp_yeaterday = 3.0
    accumulation_yesterday = 2 
    result = forecaster.predict(temp, precipitation, temp_yeaterday, accumulation_yesterday)
    print("[Température:%s] [Précipitation:%s] [昨日のTempérature:%s] [Chutes de neige d'hier:%s]" %
          (temp, precipitation, temp_yeaterday, accumulation_yesterday))
    
    print("résultat du jugement: %s" % result)
    
    if result == 1:
        print("La neige s'accumule")
    else:
        print("La neige ne s'entasse pas")
        
    #########################################################
    #Donnez des paramètres directement et essayez de prédire(La température d'hier-3.Changer à 0 ° C)。
    #########################################################
    print("------")
    temp_yeaterday = -3.0
    result = forecaster.predict(temp, precipitation, temp_yeaterday, accumulation_yesterday)
    print("[Température:%s] [Précipitation:%s] [昨日のTempérature:%s] [Chutes de neige d'hier:%s]" %
          (temp, precipitation, temp_yeaterday, accumulation_yesterday))
    
    print("résultat du jugement: %s" % result)
    
    if result == 1:
        print("La neige s'accumule")
    else:
        print("La neige ne s'entasse pas")
        
    print("------")

Comme c'est ma première fois avec Python, je vous serais reconnaissant de bien vouloir souligner des points étranges.

L'exécution est la suivante

$ python snow_forecaster.py

Le résultat de l'exécution est le suivant.

Score LinearSVC:0.965627801273
Score du classificateur AdaBoost:0.969820996581
Score du classificateur ExtraTrees:0.961194223678
GradientBoostingClassifier score:0.966826266875
Score de RandomForestClassifier:0.958078728911
------
Modèle à utiliser: AdaBoostClassifier
------
2006/2/19 00:00:00:Attendu:1 Réel:1
La neige s'accumule
------
2012/2/2 00:00:00:Attendu:1 Réel:1
La neige s'accumule
------
2014/2/2 13:00:00:Attendu:0 Réel:0
La neige ne s'entasse pas
------
2015/2/28 00:00:00:Attendu:0 Réel:0
La neige ne s'entasse pas
------
[Température:0.0] [Précipitation:0] [昨日のTempérature:3.0] [Chutes de neige d'hier:2]
résultat du jugement: 0
La neige ne s'entasse pas
------
[Température:0.0] [Précipitation:0] [昨日のTempérature:-3.0] [Chutes de neige d'hier:2]
résultat du jugement: 1
La neige s'accumule
------

Calculez d'abord le score sur plusieurs modèles puis effectuez l'entraînement sur le modèle avec le meilleur score. Il semble que ʻAdaBoostClassifier` soit adopté ici.

Au fait, le code de la pièce pour sélectionner le modèle est le code de je l'ai appris en 2 mois jusqu'à ce que je lance le produit en tant que putain d'amateur en apprentissage automatique Je l'ai utilisé.

Ensuite, l'apprentissage est exécuté et le jugement est effectué. Dans la seconde moitié, j'ai essayé de changer la température hier en faisant la même chose pour la température, la quantité de précipitations et la quantité de neige hier. S'il y avait 2 cm de neige hier et que la température était de 3,0 ° C hier, on juge qu'il n'y a pas de neige aujourd'hui, mais quand j'ai changé la température à -3,0 ° C hier et que j'ai prédit "il y a de la neige". Cela a changé pour le jugement. Cela semble intuitivement correct, car il était enneigé hier et ne fondra probablement pas si la température est basse.

Impressions etc.

Je ne comprends aucune théorie, mais même un débutant pourrait essayer l'application d'apprentissage automatique en quelques heures. Au fait, en ce qui concerne la prévision de la couverture de neige, j'essayais de la prédire uniquement avec les données d'aujourd'hui, mais cela n'a pas fonctionné, et lorsque j'ai donné les données d'hier, la précision de la prévision a soudainement augmenté à près de 97%. Certes, si la neige s'accumule depuis hier, il est fort probable qu'elle s'accumule le lendemain, donc si vous apportez quel type de paramètres donner dans un tel endroit à partir d'un endroit réaliste, la précision s'améliorera. pensée. C'est intéressant, alors je vais essayer un peu plus, et quand je m'y habituerai, j'étudierai un peu la théorie.

Recommended Posts

J'ai essayé de prédire la présence ou l'absence de neige par apprentissage automatique.
Prédire la présence ou l'absence d'infidélité par l'apprentissage automatique
J'ai essayé de prédire l'évolution de la quantité de neige pendant 2 ans par apprentissage automatique
[Apprentissage automatique] J'ai essayé de résumer la théorie d'Adaboost
J'ai essayé de vérifier la classification yin et yang des membres hololive par apprentissage automatique
J'ai essayé l'histoire courante de l'utilisation du Deep Learning pour prédire la moyenne Nikkei
J'ai essayé de compresser l'image en utilisant l'apprentissage automatique
J'ai essayé de prédire la victoire ou la défaite de la Premier League en utilisant le SDK Qore
J'ai essayé de comparer la précision des modèles d'apprentissage automatique en utilisant kaggle comme thème.
J'ai fait apprendre à RNN la vague de péché et j'ai essayé de prédire
Essayez de prédire le triplet de la course de bateaux en classant l'apprentissage
J'ai essayé de prédire les ventes de logiciels de jeux avec VARISTA en me référant à l'article du Codexa
J'ai essayé de créer Othello AI avec tensorflow sans comprendre la théorie de l'apprentissage automatique ~ Implémentation ~
J'ai essayé d'appeler l'API de prédiction du modèle d'apprentissage automatique de WordPress
J'ai essayé de trouver l'itinéraire optimal du pays des rêves par recuit (quantique)
J'ai essayé de vérifier et d'analyser l'accélération de Python par Cython
J'ai essayé de visualiser le modèle avec la bibliothèque d'apprentissage automatique low-code "PyCaret"
J'ai essayé de vérifier le résultat du test A / B avec le test du chi carré
J'ai essayé de prédire le comportement du nouveau virus corona avec le modèle SEIR.
J'ai essayé de corriger la forme trapézoïdale de l'image
J'ai essayé de vectoriser les paroles de Hinatazaka 46!
J'ai essayé de créer Othello AI avec tensorflow sans comprendre la théorie de l'apprentissage automatique ~ Battle Edition ~
Essayez de prédire la valeur de la jauge de niveau d'eau par apprentissage automatique en utilisant les données ouvertes de Data City Sabae
J'ai essayé de prédire la détérioration de la batterie lithium-ion en utilisant le SDK Qore
J'ai essayé d'organiser les index d'évaluation utilisés en machine learning (modèle de régression)
J'ai essayé de traiter et de transformer l'image et d'élargir les données pour l'apprentissage automatique
J'ai essayé de récupérer les données de l'ordinateur portable en le démarrant sur Ubuntu
J'ai essayé de déplacer l'apprentissage automatique (détection d'objet) avec TouchDesigner
J'ai essayé de prédire le match de la J League (analyse des données)
Prédire le sexe des utilisateurs de Twitter grâce à l'apprentissage automatique
J'ai essayé de visualiser les informations spacha de VTuber
J'ai essayé d'effacer la partie négative de Meros
J'ai essayé d'augmenter ou de diminuer le nombre en programmant
J'ai essayé de classer les voix des acteurs de la voix
J'ai essayé de résumer les opérations de chaîne de Python
J'ai essayé de prédire le nombre de personnes infectées par le virus corona au Japon par la méthode du dernier article en Chine
J'ai essayé de comprendre attentivement la fonction d'apprentissage dans le réseau de neurones sans utiliser la bibliothèque d'apprentissage automatique (première moitié)
[Keras] J'ai essayé de résoudre le problème de classification des zones de type beignet par apprentissage automatique [Étude]
J'ai essayé de prédire les courses de chevaux en faisant tout, de la collecte de données à l'apprentissage en profondeur
J'ai essayé "Lobe" qui peut facilement entraîner le modèle d'apprentissage automatique publié par Microsoft.
J'ai essayé de trouver l'entropie de l'image avec python
[Courses de chevaux] J'ai essayé de quantifier la force du cheval de course
Essayez d'évaluer les performances du modèle d'apprentissage automatique / de régression
J'ai essayé de trouver la moyenne de plusieurs colonnes avec TensorFlow
J'ai essayé d'implémenter la détection d'anomalies par apprentissage de structure clairsemée
Essayez d'évaluer les performances du modèle d'apprentissage automatique / de classification
J'ai essayé l'apprentissage automatique pour convertir des phrases en style XX
Comment augmenter le nombre d'images de jeux de données d'apprentissage automatique
[Python] J'ai essayé de visualiser la relation de suivi de Twitter
J'ai essayé d'implémenter ListNet d'apprentissage de rang avec Chainer
[TF] J'ai essayé de visualiser le résultat de l'apprentissage en utilisant Tensorboard
J'ai essayé de combattre le minimum local de la fonction Goldstein-Price
J'ai essayé de prédire l'infection d'une nouvelle pneumonie en utilisant le modèle SIR: ☓ Wuhan edition ○ Hubei province edition
J'ai essayé de prédire le genre de musique à partir du titre de la chanson sur le réseau neuronal récurrent
Confirmé la différence de présence ou d'absence de traitement aléatoire lors de l'apprentissage par mini-lots avec chainer
J'ai essayé de bien le comprendre en implémentant l'algorithme Adaboost en machine learning (+ j'ai approfondi ma compréhension du calcul de tableaux)