Форум сайта python.su
Есть некий датафрейм pandasdf, длиной порядка 5000 строк.
Делаем с ними вот такое:
pandasdf['label'] = pandasdf[forecast_col].shift(-forecast_out) # смещаем данные о цене назад на n строк, "имитируя" будущее X = np.array(pandasdf.drop(['label'], 1)) # features X = preprocessing.scale(X) # нормализуем данные X_lately = X[-forecast_out:] # берём только данные без labels для прогноза X = X[:-forecast_out] # не учитываем данные без labels pandasdf.dropna(inplace=True) # удаляем строки с пустыми значениями y = np.array(pandasdf['label']) # labels X_train, X_test, y_train, y_test = cross_validation.train_test_split(X, y, test_size=0.3) # проходим кросс-валидацию на 30% данных (test_size=0.3) clf = LinearRegression(n_jobs=-1) # указываем классификатор clf.fit(X_train, y_train) # обучаемся accuracy = int(clf.score(X_test, y_test) * 100) # проверяем точность с помощью кросс-валидации forecast_set = clf.predict(X_lately) # предсказываем на последних/неизвестных данных
Отредактировано m0rtal (Фев. 20, 2017 09:13:33)
Офлайн
Для наглядности, а может и для себя, чтобы лучше понимать.
Исходный датафрейм
pandasdf['label'] = pandasdf[forecast_col].shift(-forecast_out)
X = np.array(pandasdf.drop(['label'], 1))
X = preprocessing.scale(X)
X_lately = X[-forecast_out:]
X = X[:-forecast_out] y = np.array(pandasdf['label'])[:-forecast_out]
X_train, X_test, y_train, y_test = cross_validation.train_test_split(X, y, test_size=0.3)
clf = LinearRegression(n_jobs=-1) clf.fit(X_train, y_train)
accuracy = int(clf.score(X_test, y_test) * 100)
forecast_set = clf.predict(X_lately)
Отредактировано m0rtal (Фев. 20, 2017 09:12:12)
Офлайн
Time series dependencies - проверьте свою логику тут.
PS. Нормализация и масштабирование это разные вещи
PSS. Если я все правильно понял, то у вас не CV, а данные просто сплитятся на тестовую и обучающую подвыборки, пусть и перемешиваясь. Для реализации кросс-валидации я например использую (from sklearn.model_selection import cross_val_score).
PSSS. Кстати обновите sklearn.
PSSSS. Кстати линейная модель на временных рядах, для реальных данных не подходит. пруф по ссылке выше (ну и если посмотреть на то как это под капотом работает станет понятно).
Отредактировано noob_saibot (Фев. 21, 2017 09:32:27)
Офлайн
noob_saibot
Time series dependencies - проверьте свою логику тут.
PS. Нормализация и масштабирование это разные вещи
PSS. Если я все правильно понял, то у вас не CV, а данные просто сплитятся на тестовую и обучающую подвыборки, пусть и перемешиваясь. Для реализации кросс-валидации я например использую (from sklearn.model_selection import cross_val_score).
PSSS. Кстати обновите sklearn.
PSSSS. Кстати линейная модель на временных рядах, для реальных данных не подходит. пруф по ссылке выше (ну и если посмотреть на то как это под капотом работает станет понятно).Да тут я даже ни секунды не сомневаюсь. Я учусь, хотелось попробовать что-то простое… и на нём так дико застрял…
Отредактировано m0rtal (Фев. 21, 2017 20:42:29)
Офлайн
m0rtalЯ не об этом, вы прямо "Time series dependencies" найдите на странице, там расписаны моделирования зависимостей. Вы должны учить свою модель предсказывать будущие значения по предыдущим. Ну а если у вас известны лейблы для будущих моделей, то делаете модель в которой будут и лейблы и предыдущие значения учитываться.
вроде “то”… стр. 37, создаём из features матрицу X, которой с помощью эстиматора подбираем веса коэффициентов, чтобы получить y.
m0rtalЯ подумал что у вас старая версия поскольку модуль sklearn.cross_validation скопировали в model_selection начиная с 0.18 версии.
0.18.1. Или бета нужна?
m0rtalПредсказанием временных рядов не занимался, но в тренде видел нейронные сети, поэтому реализуете их на theano/lasagne. Ну и задачу для обучения вы выбрали не самую простую, воспользуйтесь www.kaggle.com, там есть задачи и данные (тот же Титаник или классификация ирисов), и очень много подробно расписанных стратегий решения (правда порой без обоснования). + Обязательно считаю нужным ознакомится с курсом Воронцова
Я правильно понимаю, Lasso или ElasticNet должны быть правильным выбором?
Отредактировано noob_saibot (Фев. 22, 2017 06:36:31)
Офлайн
noob_saibotОх… ушёл читать/смотреть )))
Офлайн
m0rtalПокажите ошибку.
завелось только на первых двух
Офлайн
noob_saibotээээ…. сегодня уже никакой ошибки не выдаёт… может, я ночью что-то не то вчера написал… пардон ))
Офлайн
А TimeSeriesSplit разве не будет лучшим вариантом в моём случае?
Офлайн
Проблема оказалась в жуткой автокорреляции в 97% между close и label. Для алгоритма оказалось очевидным, что раз такая взаимосвязь, то label ~ close * 0.97.
Думаю, как победить.
Офлайн