Sinir Ağı gerilemesi negatif performans
Çok katmanlı bir algılayıcı regresörünün (sinir ağı) performansıyla ilgili bir sorunum var ve nedenini çözemiyorum.
Görev: Bir zaman serisi tahminini geliştirmeye çalışıyorum. Yarı gerçek değerlerle birlikte son 4 yılın fiziksel bir parametresine ilişkin tahminlerim var. O gün için daha iyi bir tahmin elde etmek için NN'yi özellik olarak ilgilendiğim gün boyunca +1 güne kadar tahminlerle eğitiyorum.
Sorun: NN'nin çıktısı, hem eğitim hem de test verileri için ilgilendiğim günün özelliğinden daha kötü. Hem RMSE hem de MAE açısından. Çıktının en azından NN'ye girdiğim özellik ile aynı seviyede olmasını bekliyordum.
Yöntem: Sklearn ile Python. İyi bir hiper parametre elde etmek için çapraz doğrulamalı bir ızgara araması kullanıyorum. Farklı gizli katman yapılandırmalarını, etkinleştirme işlevlerini, öğrenme oranını ve düzenleme cezası güçlerini test ediyorum. Verileri eğitim için% 66'ya ve kalan verileri test etmek için böldüm.
Sorunumun burada ne olduğunu nasıl anlayacağıma dair ipuçları için gerçekten minnettarım.
DÜZENLEME: Aktivasyon fonksiyonları olarak 'kimlik', 'lojistik', 'tanh' ve 'relu' sağlayan sklearn.neural_network.MLPRegressor kullanıyorum ve hepsini grid aramasında test ettim.
Özellik matrisini ölçeklendirmedim çünkü tüm özellikler istenen çıktıyla aynı birimdedir ve yaklaşık -1 ile +1 arasında değişir.
DÜZENLEME2:
tuned_parameters = [{'hidden_layer_sizes': [int(2/3*number_features),
(int(2/3*number_features), int(4/9*number_features)),
(int(2/3*number_features), int(4/9*number_features), int(8/27*number_features))],
'alpha': 10.0 ** -np.arange(1, 4),
'activation': ["identity", "relu", "logistic", "tanh"],
'learning_rate': ['adaptive', "invscaling"],
'solver': ['lbfgs'],
'early_stopping': [True],
'max_iter': [600]}]
regr = GridSearchCV(MLPRegressor(), tuned_parameters, n_jobs=3, verbose=2)
regr.fit(feature_training_matrix, combined_training_target_vector)
Veri : Kullandığım tahmin verileri aşağıdaki yapıya sahip: son ~ 4 yılın her günü, sonraki 90 gün için tahminler yapıldı. Her gün için -90d ile + 90d arası verilere sahip bir metin dosyam var. NN'yi önümüzdeki 10 gün için daha iyi bir tahmin tahmin etmesi için eğitmeye çalışıyorum. Bunun için özellik olarak mevcut tahmin günü civarında -7 ila +1 gün (şu anda kullanılan tahmin etmeye başladıktan 1-10 gün sonra) alıyorum. Bu, ilgilendiğim günün tahmininin bir özellik olarak dahil edildiği anlamına geliyor.
feature example: [0.16272058, 0.13296574, 0.14213905, 0.25064893, 0.23302285,
0.21019931, 0.20733988, 0.1466959 , 0.17029025, 0.15876942]
corresponding target: 0.174652
Yanıtlar
Orijinal modelin zaten çok iyi bir iş çıkarması oldukça olası - onu geliştirmek mümkün değil. Örneğin, orijinal girdi değişkenleri ile hedef arasındaki gerçek ilişki doğrusal olabilir, bu nedenle bir sinir ağı hiçbir şey eklemez.
Bir test olarak, hidden_layer_sizes'i arttırırdım ve early_stopping = False olarak ayarlardım ve hatta sadece bir ızgara araması yapardım (CV olmadan): RMSE Eğitimi , RMSE Özelliğinden daha iyi olmalıdır . Büyük olasılıkla RMSE Testi daha kötü olacaktır, ancak en azından başka beklenmedik durumlar olmadığına dair kanıtınız olacaktır (örn. Kodda bir hata).
Bir temel modelin tahminlerini girdi olarak kullanmak mantıklıdır. Özellikle bu orijinal temel model bir şekilde kısıtlanmışsa ve yeni modelinizin orijinal modelden daha iyi performans göstermesini bekliyorsanız, çünkü yeni modelde bu kısıtlamaya sahip değilsiniz. Örneğin, orijinal model doğrusal (ARIMA veya ARIMAX) olabilirken, sizinki doğrusal değildir - bir sinir ağı.
Girdiler ve hedef arasındaki gerçek ilişki doğrusal olmasa bile, burada bir sinir ağı için çok fazla oyun odanız yok (bir temel modelden daha iyi performans göstermek istediğimizi unutmayın). Anladığım kadarıyla yalnızca ~ 4 * 365 gözleminiz var. Birçok nöronla kolayca aşırı antrenman yapabilirsiniz, ancak yalnızca birkaç nöron eğitimi yerel minimumda kalabilir.