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.
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).
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.
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