как мне спрогнозировать данные (в моем случае осадки) на будущее после того, как я обучу модель с использованием scikit_learn и pandas?

#python #machine-learning #scikit-learn #forecasting #sklearn-pandas

#python #машинное обучение #scikit-learn #прогнозирование #sklearn-pandas

Вопрос:

Я обучаю модель для прогнозирования данных об осадках в будущем. Я уже завершил обучение модели. Я использую этот набор данных: https://www.kaggle.com/redikod/historical-rainfall-data-in-bangladesh Это выглядит следующим образом :

               Station   Yea  Month Day Rainfall dayofyear
1970-01-01  1   Dhaka   1970    1   1   0           1
1970-01-02  1   Dhaka   1970    1   2   0           2
1970-01-03  1   Dhaka   1970    1   3   0           3
1970-01-04  1   Dhaka   1970    1   4   0           4
1970-01-05  1   Dhaka   1970    1   5   0           5
  

Я завершил обучение с использованием обучающих и тестовых данных, используя код, который я нашел в Интернете в качестве ссылки. И затем я также сверил прогнозируемое значение с истинным значением.

Вот код,

 import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import tensorflow as tf

#data is in local folder
df = pd.read_csv("data.csv")
df.head(5)

df.drop(df[(df['Day']>28) amp; (df['Month']==2) amp; (df['Year']%4!=0)].index,inplace=True)
df.drop(df[(df['Day']>29) amp; (df['Month']==2) amp; (df['Year']%4==0)].index,inplace=True)
df.drop(df[(df['Day']>30) amp; ((df['Month']==4)|(df['Month']==6)|(df['Month']==9)|(df['Month']==11))].index,inplace=True)

date = [str(y) '-' str(m) '-' str(d) for y, m, d in zip(df.Year, df.Month, df.Day)]
df.index = pd.to_datetime(date)
df['date'] = df.index
df['dayofyear']=df['date'].dt.dayofyear
df.drop('date',axis=1,inplace=True)

df.head()
df.size()
df.info()

df.plot(x='Year',y='Rainfall',style='.', figsize=(15,5))

train = df.loc[df['Year'] <= 2015]
test = df.loc[df['Year'] == 2016]
train=train[train['Station']=='Dhaka']
test=test[test['Station']=='Dhaka']

X_train=train.drop(['Station','StationIndex','dayofyear'],axis=1)
Y_train=train['Rainfall']
X_test=test.drop(['Station','StationIndex','dayofyear'],axis=1)
Y_test=test['Rainfall']

from sklearn import svm
from sklearn.svm import SVC
model = svm.SVC(gamma='auto',kernel='linear')
model.fit(X_train, Y_train)

Y_pred = model.predict(X_test)

df1 = pd.DataFrame({'Actual Rainfall': Y_test, 'Predicted Rainfall': Y_pred})  
df1[df1['Predicted Rainfall']!=0].head(10)
  

После этого я попытался фактически использовать модель для прогнозирования осадков на несколько дней / месяцев / лет в будущем. Я использовал несколько, например, те, которые используются для определения цен на акции (после корректировки кода). Но, похоже, ни один из них не работает.
Поскольку я уже обучил модель, я подумал, что было бы легко просто спрогнозировать несколько дней в будущем. Предположим, я тренировался с данными за 1970-2015 годы, тестировал с данными за 2016 год. Теперь я хочу предсказать, каким будет количество осадков в 2017 году. Что-то вроде этого.

Мой вопрос в том, как я могу сделать это интуитивно понятным способом?

Я был бы очень признателен, если кто-нибудь сможет ответить на этот вопрос.

Редактировать @Mercury: это фактический результат после использования этого кода. Я сомневаюсь, что модель работает вообще… Это изображение фактического результата: https://i.stack.imgur.com/81Vk1.png

Комментарии:

1. должен ли я удалить изображение после «Редактировать @ Mercury: это фактический результат после использования этого кода. Я сомневаюсь, что модель вообще запущена …»? извините, я действительно новичок в stackoverflow

2. Да. Что случилось с прогнозами, так это то, что использование SVC на самом деле не очень хорошо моделирует проблему временных рядов. Использование SVC рассматривает это как проблему классификации (кстати, ваше прогнозирование временных рядов на самом деле больше похоже на регрессию), и я уверен, что данные содержат подавляющее количество нулей (например, более 60%, верно?). Итак, что произошло, так это то, что модель научилась постоянно предсказывать значения 0 — и, поступая таким образом, она получает точность почти 70%. Что вы можете сделать, так это изучить надлежащие методы прогнозирования временных рядов, такие как скрытый марков, авторегрессия и т.д.

3. понятно, тогда я потрачу на это день или два. и сообщите здесь, получу ли я какие-либо результаты. и да, у нее действительно огромное количество значений 0.

Ответ №1:

Я заметил здесь очень простую ошибку:

 X_train=train.drop(['Station','StationIndex','dayofyear'],axis=1)
Y_train=train['Rainfall']
X_test=test.drop(['Station','StationIndex','dayofyear'],axis=1)
Y_test=test['Rainfall']
  

Вы не удалили Rainfall столбец из своих обучающих данных.

Я сделаю смелое предположение и скажу, что вы получаете идеальную 100% точность как при обучении, так и при тестировании, верно? Вот причина. Ваша модель видит, что все, что присутствует в столбце «Осадки» в данных обучения, всегда является ответом, поэтому она делает именно это во время тестирования, таким образом получая идеальный результат — но на самом деле она вообще ничего не предсказывает!

Попробуйте запустить следующим образом:

 X_train=train.drop(['Station','StationIndex','dayofyear','Rainfall'],axis=1)
Y_train=train['Rainfall']
X_test=test.drop(['Station','StationIndex','dayofyear','Rainfall'],axis=1)
Y_test=test['Rainfall']

from sklearn import svm
model = svm.SVC(gamma='auto',kernel='linear')
model.fit(X_train, Y_train)
print('Accuracy on training set: {:.2f}%'.format(100*model.score(X_train, Y_train)))
print('Accuracy on testing set: {:.2f}%'.format(100*model.score(X_test, Y_test)))
  

Комментарии:

1. на самом деле да, mae всегда был равен 0. позвольте мне попробовать это и посмотреть, каков результат.

2. Хорошо, я попробовал несколько вещей. это в основном подтверждает, что я должен уменьшить количество осадков. или показатель достоверности всегда равен 1. mae всегда 0. yikes… но когда я сбрасываю осадки из X_train и X_test, модель ничего не делает. Я пытаюсь получить результаты, но ничего не появляется. Неправильный ли код на базовом уровне?

3. Она должна запуститься. Для завершения / конвергенции может потребоваться больше времени, поскольку модель фактически обучается сейчас. Если вы используете среду jupyter, попробуйте обновить / перезапустить сеанс и попробуйте код, который я включил выше. Модель. завершение работы fit и model.score может занять некоторое время.

4. да, я использую jupyter. я попытаюсь сделать это после очистки и перезапуска.

5. Я добавил результат в основной пост. я попробовал то же самое в spyder, а затем в pycharm. в основном тот же результат (то есть все равно 0)

Ответ №2:

Данные очень просты. Если вы участвуете в конкурсе kaggle, то интерпретируемость также не является большой проблемой, только точность, вы можете использовать любую сложную модель и получать хорошие результаты. Однако, если я хочу интерпретируемость, то я бы использовал дерево решений глубиной не более 4. Уменьшите глубину, и вы увидите более обобщенные деревья решений. Это даст вам хорошее представление о данных.

Некоторые предложения могут быть-

  1. Полностью удалив столбцы «День», «месяц», эта информация уже сохранена в атрибуте «день года» (високосные годы на самом деле не такая уж большая проблема).
  2. У вас осталось только три столбца: год, станция и день года.
  3. Посмотрите, важен столбец Year или нет (важные решения дерева решений присутствуют на первых 2-3 глубинах), если это не так, возможно, покончите с этим. В реальном мире, где изменения намного более непредсказуемы, чем более обобщенная модель, тем она лучше. Станция и день года являются важными факторами, и их нельзя игнорировать.

Затем проверьте наличие сложных моделей, повышают ли они вашу точность? Они могли бы.

Если они это сделают, то используйте их или придерживайтесь более простых моделей из-за их высокой интерпретируемости, более быстрого времени вычисления.

Комментарии:

1. извините за поздний ответ. Я попытался сделать это сегодня, и я пришел к выводу, что мой набор данных просто плохо работает с этими алгоритмами, и, как сказал один пользователь выше, я должен попробовать использовать временные ряды. спасибо за совет, хотя я получил возможность изучить некоторые новые вещи, о существовании которых я не знал.