Прогнозирование временных рядов: как мне улучшить мои регрессионные модели? - PullRequest
0 голосов
/ 13 апреля 2020

Я анализирую данные Citi Bike за сентябрь 2019 года (данные временных рядов) для моей диссертации, чтобы построить прогностические регрессионные модели. Набор данных можно найти здесь . В настоящее время я собираю набор данных из 2,4 миллионов строк, чтобы получить почасовую потребность в велосипедах для каждой станции на каждый день в течение всего месяца. Вот как выглядит агрегат: citibike aggregate data Я разделил набор данных с помощью train_test_split и применил различные алгоритмы обучения, в основном из scikit-learn. Тем не менее, результаты этих моделей выводят очень низкое значение R2. Например, для линейной регрессии scikit-learn я получаю R2 0.09019569965308272, следовательно, модели не распознают шаблон в данных. Вот код для модели линейной регрессии:

def lr(X_train, X_test, y_train, y_test):
    #Create a linear regression object
    reg = LinearRegression()

    sc_X = StandardScaler()

    X_train, X_test = scaleData(X_train, X_test, "robust")

    print(X_train)
    print(X_test)

    reg.fit(X_train, y_train)
    print("reg.score(X, y): {} \n".format(reg.score(X_test, y_test)))
    print("reg.coef_: {} \n".format(reg.coef_))
    print("reg.intercept_: {} \n".format(reg.intercept_))

    pred = reg.predict(X_test)
    print("Pred: {} \n".format(pred))

    results = pd.DataFrame({'Actual': y_test.flatten(), 'Predicted': pred.flatten()})
    print(results)

    PlotResultsGetPerformance(results)

lr(X_train, X_test, y_train, y_test)

Метод scaledata:

def scaleData(X_train, X_test, scalingType, X=None):
    scaler = []
    stype = scalingType.lower()
    if stype == "standard":
        scaler = StandardScaler()
    elif stype == "minmax":
        scaler = MinMaxScaler()
    elif stype == "robust":
        scaler = RobustScaler()

    if X == None:
        scaler = scaler.fit(X_train)

        X_train = scaler.transform(X_train)
        X_test = scaler.transform(X_test)

        return X_train, X_test
    else:
        X = scaler.fit_transform(X)

        return X

Вывод алгоритма бегущей линейной регрессии:

reg.score(X, y): 0.09019569965308272 
reg.coef_: [[-4.71123839  0.87411394 -0.1425281   1.33332683]] 
reg.intercept_: [4.94247875] 

Pred: [[ 4.16553018]
 [10.71438879]
 [ 5.21549358]
 ...
 [10.23551752]
 [ 4.94370368]
 [ 4.10551935]] 

enter image description here

enter image description here

Средняя абсолютная ошибка: 4.833603206597555 Средняя квадратичная ошибка: 61,94697363477656 Root средняя ошибка в квадрате: 7.870639976188503 R2: 0,09019569965308272

В чем проблема? Это проблема с данными или проблема с моделью? Любая помощь будет оценена.

1 Ответ

0 голосов
/ 13 апреля 2020

В этом случае, я думаю, ваша модель страдает under-fitting (high bias). Похоже, в пояснительных переменных недостаточно информации. Вам нужно больше столбцов в ваших данных. Вы можете создать новые столбцы или попытаться найти дополнительные объясняющие переменные и добавить их в модель. Также, пожалуйста, проверьте качество переменных, которые у вас уже есть, возможно, некоторые преобразования могут помочь улучшить прогнозы. Вот более подробное объяснение: https://towardsdatascience.com/what-are-overfitting-and-underfitting-in-machine-learning-a96b30864690

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...