** 2016/8/31 Corrigé car le calcul de l'AUC ne voyait que «bien» **
En parlant de CNN (réseau de neurones convolutifs) en Deep Learning, bien que le traitement d'image soit le principal, je n'ai fait aucune analyse liée au traitement d'image, donc cette fois je voudrais vérifier ** si les prévisions météorologiques peuvent être faites à partir d'images météorologiques ** pense.
Des images météorologiques ont été téléchargées à partir du site de l'Université de Kochi. Obtenez les données de janvier 2015 à juillet 2016. J'ai utilisé l'image comme celle-ci. De plus, comme il y a des données toutes les heures, j'ai eu les données à 17h00.
Source: Fourni par l'Université de Kochi, Université de Tokyo, Agence météorologique
Le temps passé peut être obtenu auprès de la [page] de l'Agence météorologique (http://www.data.jma.go.jp/risk/obsdl/index.php). Il s'agit également de données météorologiques quotidiennes de janvier 2015 à juillet 2016. L'endroit était Tokyo et j'ai utilisé la météo de jour.
Le problème est "de prédire le beau temps et la pluie du lendemain à partir de l'image météo près du Japon à 17h00 la veille". Le temps de l'Agence météorologique comprend «pluie après beau temps» et «nuageux», mais si la pluie est incluse, elle est traitée comme «pluie», sinon elle est traitée comme «fine», et c'est un problème de classification binaire.
La météo de demain sera affectée non seulement par le mouvement des nuages près de Tokyo, mais également par les vents d'ouest, nous avons donc besoin d'une plus large gamme d'images météorologiques, mais nous n'avons pas besoin de la météo loin du Japon. Donc, je vais recadrer l'image pour en faire des données près du Japon.
import numpy as np
from PIL import Image
import datetime as dt
w = 640
h = 480
"""Réglage à couper uniquement autour du Japon"""
sw = 320
sh = 65
ew = 540
eh = 320
"""Compression d'image"""
is_comp = False
def get_mat(dates=[]):
"""
:param dates:
:return:
"""
l = len(dates)
if not is_comp:
wr = ew - sw
hr = eh - sh
else:
wr = 50
hr = 50
mat = np.zeros((l,3,wr,hr),dtype=np.float32)
file_base = base_file_dir + "fe.%s" + base_hour + ".jpg "
j = 0
err_dates = []
for ddd in dates:
dd = dt.datetime.strptime(ddd,"%Y/%m/%d")
dd_str = dd.strftime("%y%m%d")
try:
im = Image.open(file_base % (dd_str))
im = im.crop((sw,sh,ew,eh))
im = im.resize((wr, hr))
mat0 = np.array(im)
for i in range(0,3):
mat[j,i,:,:] = mat0[:,:,i].T
j += 1
except:
err_dates.append(ddd)
print dd_str + " --> Error!!"
return mat[0:j],err_dates
Il prend une liste de dates, renvoie les images sous forme de matrice numpy et renvoie également la date à laquelle l'erreur s'est produite. L'objet image im contient une image, mais si vous la convertissez en matrice avec numpy, elle sera dans l'ordre de (largeur, hauteur, canal), alors faites attention à ce qu'elle soit transposée. Ici, le rognage est effectué à partir de l'image (480x640) dans la mesure où l'archipel japonais est inclus. Cela ressemble à ce qui suit.
Étant donné que les données après avoir créé une matrice contiennent des données de 0 à 255 dans chaque cellule, divisez-les par 255 et convertissez-les en données de 0 à 1.
En raison du temps d'apprentissage de CNN après cela, j'ai pensé à compresser l'image, mais cette fois j'ai arrêté.
Le modèle du réseau de neurones convolutif utilise celui qui était utilisé auparavant. Konohen ou Konohen ou [Konohen](http: // qiita) Voir .com / wbh / items / da881fac695f17042b19).
Les réglages des paramètres sont les suivants.
params = {"clm_dim":clm_dim,"in_channels":3,"out_channels":3,"row_dim":row_dim,"filt_clm":3,"filt_row":3,"pool_clm":3,"pool_row":3,"batchsize":200,"hidden_dim":500,"n_classes":2}
clm_dim et row_dim correspondent à la largeur et à la hauteur de chaque image. De plus, comme le nombre de canaux est RVB, il est réglé sur 3. Utilisez également la mise en commun maximale. Si vous augmentez la taille du filtre ou la taille du pool, le calcul prendra plus de temps. (accro à)
Même avec ce paramètre, cela prend beaucoup de temps sur mon macbook pro. Donc, cette fois, j'ai mis epoch = 50.
Comme cela prend beaucoup de temps de calcul, les données de formation sont pour un an du 1er janvier 2015 au 31 décembre 2015, et les données de test sont du 1er janvier 2016 au 31 juillet 2016. Même cela prend du temps. Le traitement d'image fait peur ...
Le processus d'apprentissage et la précision des tests sont les suivants.
En outre, la précision d'apprentissage est susceptible d'augmenter, mais la précision du test ne rattrape pas.
En AUC ~~ 0,78 ~~ ** 0,70 **, divers indicateurs sont les suivants.
Precision | Recall | F-Score | |
---|---|---|---|
pluie | 0.54 | 0.67 | 0.6 |
Bien | 0.83 | 0.74 | 0.78 |
moyenne | 0.74 | 0.72 | 0.72 |
Je pense que c'est une assez bonne impression de ce que j'ai fait. Cependant, des prévisions de pluie, seulement 54% ont effectivement plu.
Tracons le taux de pluie réel et le rapport fin en les arrangeant par ordre décroissant avec la probabilité de pluie.
Il semble que ce ne soit pas aléatoire mais prédictif. C'est vrai, car le taux de pluie réel dans les données de test est de 30% et le rapport ensoleillé est de 60%.
Il semble que l'une des raisons pour lesquelles la précision ne s'améliore pas est le traitement du "trouble". Il y a des cas de «soleil puis nuageux» et de «pluie temporaire nuageuse», et le taux de nébulosité dans les données réelles dépasse 70%. (Trop nuageux) Cette fois, le premier est traité comme une amende et le second comme une pluie. Par conséquent, il semble que vous ne savez pas quelle est la situation délicate. Ceci est un défi. Cependant, dans ce résultat, il semble que la pluie évidente soit frappée avec un bon degré de précision.
La classification trivalente est un problème difficile car la nébulosité devient dominante.
Le prévisionniste météorologique est incroyable.
Je me demande si c'est l'algorithme, mais pour les données, par exemple, il est possible de prendre la différence avec l'image de la veille ou de supprimer les pixels de la carte de base. Je pense que je vais le faire petit à petit.
Recommended Posts