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