Als ich nach einem guten Material als Beispiel für die Verwendung offener Daten suchte, stellte ich fest, dass Wasserstandsdaten auf der Website von Data City Sabae veröffentlicht wurden, und versuchte daher, maschinelles Lernen zu verwenden. Es war.
http://data.city.sabae.lg.jp/top_page/
Auf der Seite "Open Data" auf der obigen Site hat die Gruppe "Disaster Prevention" die folgende Notation.
Wasserstandsdaten(Sabae City, Präfektur Fukui)
Rontegawa Entwässerungspumpstation[CSV]
Es sind die Daten der Wasserstandsanzeige in der Stadt Sabae. Wasserstandseinheit:cm Daten:1000 Fälle
Standardmäßig wird gesagt, dass es 1.000 Daten gibt, aber ich werde sie verwenden, weil ich etwas mehr Daten erhalten könnte.
Darüber hinaus können vergangene Wetterdaten von der Meteorologischen Agentur heruntergeladen werden. Laden Sie daher die Niederschlagsdaten der nahe gelegenen Stadt Fukui herunter.
http://www.data.jma.go.jp/gmd/risk/obsdl/index.php
Verwenden Sie das Jupyter-Notizbuch, um die folgenden Bibliotheken zu laden.
python
from ipywidgets import FloatProgress
from IPython.display import display
%matplotlib inline
import matplotlib
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
import datetime
python
filename = "sparql.csv"
df = pd.read_csv(filename, header=None)
Lassen Sie es uns in einem Diagramm anzeigen.
python
tmp = []
for i in range(len(df)):
pos = len(df) - 1 - i
tmp.append(df.ix[pos][2])
pd.DataFrame({'level': np.array(tmp)}).plot(figsize=(15,5))
Die Wasserstandsdaten werden alle 5 Minuten erfasst und verarbeitet, um die Zeitreihen mit den Daten der Meteorologischen Agentur abzugleichen.
python
#Holen Sie sich Daten Start- und Enddaten
dt1 = datetime.datetime.strptime(df[1][len(df)-1],"%Y-%m-%dT%H:%M:%S+09:00")
dt1 = datetime.datetime(dt1.year,dt1.month,dt1.day,0,0)
dt2 = datetime.datetime.strptime(df[1][0],"%Y-%m-%dT%H:%M:%S+09:00")
print("dt1:",dt1)
print("dt2:",dt2)
#Holen Sie sich Tage voller Daten
dt = (dt2-dt1).days + 1
#Bereiten Sie ein Array zum Speichern von Stundendaten vor
level = [0] * dt * 24
dt_al = [0] * dt * 24
#Fortschrittsbalkeneinstellungen
fp = FloatProgress(min=0, max=len(df))
display(fp)
for i in range(len(df)):
wk = datetime.datetime.strptime(df[1][len(df)-i-1],"%Y-%m-%dT%H:%M:%S+09:00")
pos = (wk - dt1).days * 24 + wk.hour
dt_al[pos] = datetime.datetime(wk.year,wk.month,wk.day,wk.hour,0)
if wk.minute == 0:
level[pos] = df[2][len(df)-1-i]
fp.value = i
Lesen Sie die Daten und achten Sie darauf, dass die CSV Daten enthält, die nicht gezählt werden, und dass der Zeichencode Shift JIS ist. Versuchen Sie auch, die gelesenen Daten als Grafik anzuzeigen.
python
filename = "data.csv"
df = pd.read_csv(filename,encoding="SHIFT-JIS",skiprows=4)
df.plot(figsize=(15,5))
Speichern Sie die Daten in einem Array, um die Handhabung zu vereinfachen, und zeigen Sie dann das Diagramm an.
python
#Array-Vorbereitung
rain = [0]*len(level)
for i in range(len(df)):
wk = datetime.datetime.strptime(df.ix[i][0],"%Y/%m/%d %H:%M:%S")
if (wk < dt2) and (wk - dt1).days >= 0:
pos = (wk - dt1).days * 24 + wk.hour
rain[pos] = df.ix[i][1]
#Überprüfen Sie die Daten in der Grafik
pp = pd.DataFrame({'level': np.array(level), 'rain': np.array(rain)*15})
pp.plot(figsize=(15,5))
Es scheinen viele Daten zu fehlen ... (Schweiß)
In der Grafik sieht es so aus, als würde der Wasserstand nach dem Regen tendenziell ansteigen. Geben Sie also die Informationen über die Niederschlagsmenge von vor 48 Stunden bis zu diesem Zeitpunkt ein und verwenden Sie den Wasserstand als Ausgabedaten des Lehrers.
python
#Holen Sie sich 48 Stunden Niederschlag in einem zweidimensionalen Array
row = len(level)
tmp = np.zeros((row,48))
fp = FloatProgress(min=0, max=row)
display(fp)
for i in range(row):
for j in range(len(tmp[0])):
pos = row - 1 - i - j
tmp[row-1-i][j] = rain[pos]
fp.value = i
Wenn die Wasserstandsdaten nicht erhalten wurden, sind sie nicht erforderlich und werden entfernt.
python
#Überprüfen Sie die Anzahl der fehlenden Daten
num = 0
for i in range(len(level)):
if level[i] == 0:
num += 1
#Vorbereitung für die Datenspeicherung
X = np.empty((0,48))
y = []
for i in range(len(level)):
if level[i] > 0:
X = np.append(X, np.array([tmp[i]]), axis=0)
y.append(level[i])
#Überprüfen Sie die Daten in der Grafik
pp = pd.DataFrame({'level': np.array(y), 'rain': X[:,0]*20})
pp.plot(figsize=(15,5))
Wenn Sie sich das Diagramm ansehen, können Sie sehen, dass es ziemlich schön geworden ist.
Lernen Sie aus den bereinigten Daten und überprüfen Sie die Punktzahl des vorhergesagten Ergebnisses.
python
#Laden Sie das Kreuzvalidierungsmodul
from sklearn import cross_validation
#Trainingsset mit beschrifteten Daten(X_train, y_train)Und Testset(X_test, y_test)Eingeteilt in
X_train, X_test, y_train, y_test = cross_validation.train_test_split(X, y, test_size=.2, random_state=42)
#Normalisierung
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
scaler.fit(X_train)
X_train = scaler.transform(X_train)
X_test = scaler.transform(X_test)
#Modelleinstellungen (zufällige Gesamtstruktur)
from sklearn.ensemble import RandomForestClassifier
model = RandomForestClassifier(n_estimators=200, max_depth=50, random_state=42)
#Lernen und Vorhersagen
model.fit(X_train, y_train)
result = model.predict(X_test)
result.shape
#Ergebnis
print(model.score(X_test,y_test))
Ergebnis ist ...
python
0.185628742515
... Nein!
Die Punktzahl ist niedrig, aber lassen Sie uns das Ergebnis mit einem Diagramm überprüfen.
python
pp = pd.DataFrame({'act': np.array(y_test), "pred": np.array(result)})
pp.plot(figsize=(15,5))
... Hmm, subtil.
Mit ein wenig Einfallsreichtum werden die Daten wie unten gezeigt in Zeitreihen zum Lernen und Vorhersagen unterteilt.
python
num = int(len(X) * 0.8)
print(len(X), num, len(X)-num)
X_train = X[:num]
X_test = X[num:]
y_train = y[:num]
y_test = y[num:]
... was! Ein kleines schönes Gefühl (^ - ^)
Wenn Sie dann überlegen, was mit diesem Ergebnis erreicht werden kann, können Sie einen plötzlichen Anstieg des Wasserspiegels erkennen und eine Evakuierungswarnung geben, indem Sie den Wasserspiegel kontinuierlich anhand der Niederschlagsmenge vorhersagen.
Vor diesem Hintergrund hoffe ich, dass mehr lokale Regierungen solche Daten veröffentlichen werden.
Was soll ich als nächstes tun?
Ich habe die Genauigkeit durch eine andere Lernmethode als in diesem Artikel verbessert und konnte den Wasserstand eine Stunde später vorhersagen. Deshalb habe ich ihn erneut geschrieben. Wenn Sie interessiert sind, sehen Sie bitte auch die folgende URL.
Recommended Posts