Мы сгенерируем синтетические данные трех случайных величин x1, x2 и x3 и оценим ответ y, добавив некоторый шум к линейной комбинации. Чтобы сформулировать проблему таким образом, чтобы мы могли предоставить нашим моделям больших данных как можно более полные данные, этот скрипт Python будет генерировать окна с учетом данных временного ряда. /сильный>»

Во-первых, давайте посмотрим, какие данные у нас есть и какую терапию мы собираемся применять.

N = 600, —

Np.arange(0, N, 1).reshape(-1,1) t = t

t = np.array([t[i] + np.random.rand(1)/4 для I в диапазоне(len(t))])

T = np.array([t[i]-np.random.rand(1)/7 в диапазоне(len(t))]) для I

Np.array(np.round(t, 2)) t =

Np.round((np.random.random(N) * 5).reshape(-1,1), 2) x1 =

Np.round((np.random.random(N) * 5).reshape(-1,1), 2) x2 =

Np.round((np.random.random(N) * 5).reshape(-1,1), 2) x3 =

N = np.round((np.random.random(N) * 2).reshape(-1,1), 2)

(y+n, 2) y = np.раунд

Затем у нас есть функция «у», которая является ответом и дополнительным шумом из 3 независимых случайных величин. Отклик также напрямую коррелирует с лагами независимых переменных, а не только с их значениями в данной точке. Таким образом мы обеспечиваем зависимость от времени и заставляем наши модели больших данных распознавать это поведение.

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

Чтобы добиться сильной нелинейности результатов, мы включили в большие данные экспоненциальные и логарифмические операторы.

Формирование окна больших данных

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

Посмотрим, как мы это сделаем.

На изображении показаны только оси времени и отклика. Обратите внимание, что в нашем случае есть еще 3 переменные, отвечающие за значения «t».

Изображение вверху показывает окна выбранного (и фиксированного) размера w, который в данном случае равен 4. Это означает, что модель будет отображать данные, содержащиеся в этих окнах, с прогнозом в момент времени t+1. В размере ответа есть буква «r», так как в прошлом мы могли захотеть оценить несколько мер времени. Это будет дружба со многими. Мы будем работать с r=1 для согласованности и упрощения визуализации.

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

Но во-первых, мы не хотим, чтобы время было абсолютным числом, нас больше интересует распознавание времени между прошедшими наблюдениями (помните, что данные НЕ распределены равномерно!). Поэтому давайте построим ⁇ t и посмотрим на нашу информацию.

Набор данных = pd. DataFrame(np.concatenate((t, x1, x2, x3, y), ось = 1),

Столбец=['t','x1','x2','x3','y']))))

DeltaT = np.array([(dataset.t[i + 1]-dataset.t[i]) в диапазоне (len(dataset)-1)])) для I

DeltaT = np.concatenate((np.array([0]), deltaT))

Dataset.insert(1, ‘альфа’, дельтаТ)

Голова(3) набор данных.head(3)

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

Для окна размера 4 в моделях больших данных

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

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

Результат, который должна вернуть функция, должен выглядеть так.

Мы сможем построить l = n-(w+r)+1 окон, потому что первые строки отсутствуют, потому что у нас нет предыдущих деталей для первого значения Y(0).

Все перечисленные нами задержки функционируют как предикторы новой модели (предыдущие значения Y не включены в эту визуализацию, они будут следовать так же, как Xi. Затем метки времени (прошедшие), где мы хотим сделать прогноз ⁇ t (4) и соответствующее значение того, каким должен быть прогноз Y (4).Обратите внимание, что, поскольку мы хотим стандартизировать каждое окно, чтобы оно находилось в одном и том же диапазоне, все первые ⁇ t (0) инициализируются до 0.

Чтобы выполнить этот процесс, вот созданный код.

Базовые модели больших данных для создания Windows

ш = 5

TrainBuilder = WindowSlider)

Train-windows = train-builder.collect-windows(trainset.iloc[:,1:],,

Прошлое-y = Ложь)

WindowSlider) (тест-конструктор=

Тестовые окна = построитель тестов. Соберите окна (testset.iloc [:, 1:],,]

Прошлое-y = Ложь)

WindowSlider) (обучающая функция Object() { [собственный код] } y inc=

Train-windows-and-inc = train-builder-and-inc.collect-windows(trainset.iloc[:,1:],

Прошлое-y = Истина)

WindowSlider) (тестовая функция Object() { [собственный код] } y inc =

Test-windows-y-inc = test-builder-y-inc.collect-windows(testset.iloc[:,1:],,

предыдущий г = правда)

Окна.главный поезд(3)

Мы можем видеть, как окна несут в себе историю остальных переменных, записи временных шагов (длины окна) и накопительную сумму ⁇ t. для каждой проекции.

Прогноз = Текущий

# Y пред = настоящее Y

Cp.deepcopy(набор поездов) = набор поездов bl

Cp.deepcopy(набор тестов) = набор тестов bl

DataFrame(bl testset['y])) ‘bl y = pd.

Bl y pred = bl y.shift (периоды = 1)

Bl остатки = bl y pred-bl y pred

Bl rmse = np.sqrt (np.sum (np.power (остатки bl, 2)) / len (остатки bl))

Print(‘RMSE = .2f процента ‘bl rmse процента)

Print('Время обучения = 0 секунд')

# # СКО = 11,28 = 11,28

Чтобы сравнить наши ближайшие результаты, у нас уже есть значение. Ввиду моего текущего значения мы применили основное правило в качестве прогноза. Этот подход часто может неожиданно работать лучше, чем алгоритм ML для временных рядов, где значение ответа более постоянное (также известное как стационарное). Зигзаг больших данных в этом случае печально известен, что приводит к низкой предсказательной способности.

Множественная регрессия в линейных моделях больших данных

Наша следующая стратегия — разработать модель множественной линейной регрессии.

МНОЖЕСТВЕННАЯ ЛИНЕЙНАЯ РЕГРЕССИЯ #

Импорт LinearRegression из импорта модели sklearn.linear

Lr модель = линейная регрессия)

Trainset.iloc[:,:-1], lr model.fit, trainset.iloc[:,-1])

(t0 = время.время))

Значения lr y = testset['y].

Lr y fit = lr model.predict(trainset.iloc[:,:-1])

Lr y pred = lr model.predict(testset.iloc[:,:-1])

tF = время.время)

Lr остатки= lr y пред-lr y пред-lr yy

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

Символическая регрессия в больших данных

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

Генетическое программирование является основой символической регрессии и, таким образом, представляет собой эволюционный алгоритм (также известный как генетический алгоритм-ГА).

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

Таким образом, алгоритм начинается с первого поколения большой популяции деревьев, которые будут измеряться в соответствии с функцией пригодности, в нашем случае RMSE. Затем лучшие особи каждого поколения скрещиваются между собой, и даже добавляются некоторые мутации, включающие экспериментирование и случайность. Когда выполняется условие остановки, эти итерационные алгоритмы завершаются.

Заключение

С почти идеальным соответствием результатов проверки мы увидели, что символьная регрессия работает очень хорошо. Удивительно, но, включив только четыре самых простых оператора (сложение, вычитание, умножение и деление) с недостатком большего времени обучения, я добился наилучшей точности. Я призываю вас опробовать различные параметры модели и разработать результаты. Вы можете узнать больше на Онлайн-обучении по работе с большими данными.