Подгонка нелинейной одномерной регрессии к данным временных рядов в Python - PullRequest
0 голосов
/ 01 июля 2018

Я недавно начал машинное обучение с использованием Python. Ниже приведен набор данных, который я взял в качестве примера вместе с кодами, над которыми я работал до сих пор. Выбран [2000 .... 2015] в качестве тестовых данных и данных поезда [2016, 2017].

Dataset  
      Years        Values
    0    2000      23.0
    1    2001      27.5
    2    2002      46.0
    3    2003      56.0
    4    2004      64.8
    5    2005      71.2
    6    2006      80.2
    7    2007      98.0
    8    2008     113.0
    9    2009     155.8
    10   2010     414.0
    11   2011    2297.8
    12   2012    3628.4
    13   2013   16187.8
    14   2014   25197.8
    15   2015   42987.8
    16   2016   77555.5
    17   2017  130631.9

import pandas as pd
import numpy as np

import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split

from sklearn.ensemble import RandomForestClassifier

df = pd.DataFrame([[i for i in range(2000,2018)], 
[23.0,27.5,46.0,56.0,64.8,71.2,80.2,98.0,113.0,155.8,414.0,2297.8,3628.4,16187.8,25197.8,42987.8,77555.5,130631.9]])


df = df.T
df.columns = ['Years', 'Values']

Приведенный выше код создает DataFrame. Еще одна важная вещь, которую нужно иметь в виду, это то, что мой столбец Years является ВРЕМЕННЫМ, а не просто непрерывным значением. Я не внес никаких изменений, чтобы приспособиться к этому.

Я хочу подобрать нелинейные модели, которые могут помочь и напечатать графики, как я делал для моего примера линейной модели. Вот что я пробовал использовать линейную модель. Кроме того, в моем собственном примере я, похоже, не учитываю тот факт, что мой столбец Years является временным рядом, а НЕ непрерывным.

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

X = df.iloc[:, :-1].values
y = df.iloc[:, 1].values
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.1, random_state = 0, shuffle = False)
lm = LinearRegression()
lm.fit(X_train, y_train)
y_pred = lm.predict(X_test)
plt.scatter(X_train, y_train, color = 'red')
plt.plot(X_train, lm.predict(X_train), color = 'blue')
plt.title('Years vs Values (training set)')
plt.xlabel('Years')
plt.ylabel('Values')
plt.show()

Output

Ответы [ 3 ]

0 голосов
/ 01 июля 2018

Тем временем я тоже пробовал

import numpy.polynomial.polynomial as poly
X = np.array(df.Years, dtype = float)
y = np.array(df.Values, dtype = float)
coefs = poly.polyfit(X, y, 4)
X_new = np.linspace(X[0], X[-1], num=17)
ffit = poly.polyval(X_new, coefs)
plt.plot(X, y, 'ro', label="Original data")
plt.plot(X_new, ffit, label = "Fitted data")
plt.legend(loc='upper left')
plt.show()

Это дало почти идеальную посадку. Но теперь мне неясно, как с их помощью можно прогнозировать значения на следующие пять лет.

Using poly, polyval

0 голосов
/ 02 июля 2018

Попробуйте это. Вы также можете распечатать прогнозные значения. Прогнозируется на 5 лет.

import numpy.polynomial.polynomial as poly
import pandas as pd
import numpy as np

import matplotlib.pyplot as plt

df = pd.DataFrame([[i for i in range(2000,2018)],
[23.0,27.5,46.0,56.0,64.8,71.2,80.2,98.0,113.0,155.8,414.0,2297.8,3628.4,16187.8,25197.8,42987.8,77555.5,130631.9]])
df = df.T
df.columns = ['Year', 'Values']
df['Year'] = df['Year'].astype(int)
df['Values'] = df['Values'].astype(int)
no_of_predictions = 5


X = np.array(df.Year, dtype = float)
y = np.array(df.Values, dtype = float)
Z = [2019,2020,2021,2022]
coefs = poly.polyfit(X, y, 4)
X_new = np.linspace(X[0], X[-1]+no_of_predictions, num=len(X)+no_of_predictions)
ffit = poly.polyval(X_new, coefs)
pred = poly.polyval(Z, coefs)
predictions = pd.DataFrame(Z,pred)
print predictions
plt.plot(X, y, 'ro', label="Original data")
plt.plot(X_new, ffit, label = "Fitted data")
plt.legend(loc='upper left')
plt.show()

image

0 голосов
/ 01 июля 2018

РЕДАКТИРОВАТЬ: МОЙ ответ неверен, Я ИСПОЛЬЗУЕТСЯ К КЛАССИФИКАТОРУ ВМЕСТО РЕГРЕССОРА; НЕ УДАЛЯЙТЕ ЭТО, ПОТОМУ ЧТО Я БОЙСЯ, ЧТОБЫ ПОЛУЧИТЬ САМ ЗАПРЕЩЕННЫЕ ОТ РАЗМЕЩЕНИЯ БОЛЬШЕ ОТВЕТА. НЕ ИСПОЛЬЗУЙТЕ ЭТО ОТВЕТ.

Попробуйте это

import pandas as pd
import numpy as np

import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split

from sklearn.ensemble import RandomForestClassifier

df = pd.DataFrame([[i for i in range(2000,2018)], 
[23.0,27.5,46.0,56.0,64.8,71.2,80.2,98.0,113.0,155.8,414.0,2297.8,3628.4,16187.8,25197.8,42987.8,77555.5,130631.9]])


df = df.T
df.columns = ['Year', 'Values']
df['Year'] = df['Year'].astype(int)
df['Values'] = df['Values'].astype(int)

Ваш DataFrame

X = df[['Year']]
y = df[['Values']]

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.1, random_state = 0, shuffle = False)
print(X_train.shape, y_train.shape, X_test.shape, y_test.shape)

clf = RandomForestClassifier(n_estimators=10)
clf.fit(X_train, y_train)


y_pred = clf.predict(X_test)

plt.scatter(X_train, y_train, color = 'red')
plt.plot(X_train, clf.predict(X_train), color = 'blue')
plt.title('Years vs Values (training set)')
plt.xlabel('Years')

plt.xticks(rotation=90)
plt.ylabel('Values')
plt.show()
...