Я пытаюсь предсказать несколько целей (например, скорость ветра и высоту волны) в определенном месте. Учитывая прошлые исторические данные, я пытаюсь оценить вероятность и наиболее вероятное значение (значение P50) для будущей даты этих двух выходных данных.
Я нашел такие алгоритмы, как регрессор с несколькими выходами, в пакете sklearn, который может предсказать множественные цели. Тем не менее, я не могу получить вероятностный диапазон c для прогноза. Есть ли способ получить это? Кроме того, вы рекомендуете другие методы для достижения этой цели?
Ниже приведен код, который я реализовал с использованием случайно сгенерированных данных о ветре и волне между 1970 и 2019 годами. В конце вы можете увидеть результаты предсказанного значения с использованием алгоритма вывода множественной регрессии, но без вероятности c неопределенность, которую я ищу.
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn import preprocessing
from sklearn.ensemble import RandomForestRegressor
from sklearn.pipeline import make_pipeline
from sklearn.model_selection import GridSearchCV
from sklearn.metrics import mean_squared_error, r2_score
from sklearn.externals import joblib
from sklearn.preprocessing import RobustScaler
from sklearn.linear_model import LinearRegression
import random
numberOfDataSet = 3000
startYear = 1970
endYear = 2019
numberOfDays = 31
numberOfMonths = 12
numberOfHours = 24
## Here I create random dates including hours, months, days, and years
years = []
months = []
days = []
hours = []
windSpeed = []
waveHeight = []
for data in range(numberOfDataSet):
years.append(random.randint(startYear,endYear))
months.append(random.randint(0,numberOfMonths-1))
days.append(random.randint(0,numberOfDays-1))
hours.append(random.randint(0,numberOfHours-1))
## Here I create random data for the wind and wave height:
windSpeed.append(random.randint(5,20))
waveHeight.append(random.randint(3,8))
X = np.zeros((numberOfDataSet,4)) ## Array to store the year, month, day and hour for X values in the prediction
Y = np.zeros((numberOfDataSet,2)) ## Array to store the wind and wave height:
## Assign data to dates and create a target array --- ## 1 if wind and wave is not violating the limit of wind speed or wave height, 0 otherwise.:
for datex in range(numberOfDataSet):
year = years[datex] - startYear
month = months[datex]
day = days[datex]
hour = hours[datex]
X[datex][0] = year
X[datex][1] = month
X[datex][2] = day
X[datex][3] = hour
Y[datex][0] = windSpeed[datex]
Y[datex][1] = waveHeight[datex]
### Machine Learning Part:
import numpy as np
import matplotlib.pyplot as plt
from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_linnerud
from sklearn.ensemble import GradientBoostingRegressor
from sklearn.multioutput import MultiOutputRegressor
X_train, X_test, y_train, y_test = train_test_split(
X, Y, random_state=4)
regr_multirf =MultiOutputRegressor(GradientBoostingRegressor(), n_jobs=-1).fit(X_train, y_train)
regr_multirf.fit(X_train, y_train)
y_multirf = regr_multirf.predict(X_test)
print y_multirf[:, 0],y_multirf[:, 1] ## the prediction of test values
## Testing on future date:
predictedYear = 2022 - startYear
predictedMonth = 8
predictedDay = 12
predictedHour = 11
y_multirf_test = regr_multirf.predict([[predictedYear,predictedMonth,predictedDay,predictedHour]])
print y_multirf_test
print regr_multirf.score(X_test,y_test)
print y_multirf_test.predict_proba(X_test)