Почему мои значения r^2 настолько отрицательны?

Я не уверен, связана ли проблема с моими моделями оценки регрессии или с моим пониманием того, что на самом деле означает мера соответствия r^2. Я работаю над проектом с использованием scikit learn и ~ 11 различных регрессионных оценок, чтобы получить (грубые!) Прогнозы производительности бейсбольных фантазий. Некоторые модели всегда работают лучше, чем другие (регрессия дерева решений и регрессия дополнительных деревьев дают худшие оценки r ^ 2, в то время как ElasticCV и LassoCV дают лучшие оценки r ^ 2, и время от времени может даже быть немного положительным числом!).

Если горизонтальная линия дает оценку r ^ 2, равную 0, то даже если все мои модели оказались бесполезными и буквально имеют нулевое прогностическое значение, а числа выплевывают совершенно случайно, разве я не получу небольшие положительные числа для r ^ +2 иногда, если из чистого тупого везения одному? 8 из 11 оценщиков, которые я использую, несмотря на то, что сотни раз перебирали разные наборы данных, ни разу не дали даже крошечного положительного числа для r^2.

Я неправильно понимаю, как работает ^ ^ 2?

Я не переключаю порядок в функции склеарна.score. Я дважды проверил это много раз. Когда я неправильно выставляю порядок y_pred, y_true, он выдает r ^ 2 значения, которые являются чрезвычайно отрицательными (например, <-50 big)

Тот факт, что это так, на самом деле дает мне больше недоразумений относительно того, как г ^ 2 здесь является мерой приспособленности, но я отвлекся...

## I don't know whether I'm supposed to include my df4 or even a
##sample, but suffice to say here is just a single row to show what
##kind of data we have.  It is all normalized and/or zscore'd
"""

>> print(df4.head(1))

        HomeAway  ParkFactor    Salary  HandedVs  Hand  oppoBullpen  \
Points                                                                       
3.0          1.0      -1.229 -0.122111       1.0          0.0     -0.90331   

        RibRunHistory  BibTibHistory  GrabBagHistory  oppoTotesRank  \
Points                                                                
3.0          0.964943       0.806874       -0.224993      -0.846859   

        oppoSwipesRank  oppoWalksRank      Temp    Precip  WindSpeed  \
Points                                                                 
3.0           -1.40371      -1.159115 -0.665324 -0.380048  -0.365671   

        WindDirection  oppoPositFantasy  oppoFantasy  
Points                                                
3.0          0.229944         -1.011505     0.919269  

"""



def ElasticNetValidation(df4):
    X = df4.values
    y = df4.index
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.1)

    ENTrain = ElasticNetCV(cv=20)
    ENTrain.fit(X_train, y_train)
    y_pred = ENTrain.predict(X_test)

    EN = ElasticNetCV(cv=20)
    ENModel = EN.fit(X, y)

    print('ElasticNet R^2: ' + str(r2_score(y_test, y_pred)))
    scores = cross_val_score(ENModel, X, y, cv=20)
    print("ElasticNet Accuracy: %0.2f (+/- %0.2f)" % (scores.mean(), scores.std() * 2))

    return ENModel

Когда я запускаю этот оценщик вместе с десятью другими оценщиками регрессии, с которыми я экспериментировал, я получаю и r2_score(), и cross_val_score(). Mean(), показывающие отрицательные числа почти каждый раз. Определенные оценки ВСЕГДА дают отрицательные оценки, которые даже не близки к нулю (регрессор дерева решений, регрессор дополнительного дерева). Некоторые оценщики работают лучше и даже иногда дают крошечный положительный балл, но не более 0,01, и даже те оценки (asticCV, lassoCV, linearRegression) в большинстве случаев являются отрицательными, хотя и лишь слегка отрицательными.

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

0 ответов

Скорее всего, у вас проблемы с переобучением. Как вы правильно отметили, отрицательные значения R2 могут возникнуть, если ваша модель работает хуже, чем просто подгонка члена перехвата. Ваши модели, вероятно, не отражают никакой "реальной" базовой зависимости, а просто соответствуют случайному шуму. Вы вычисляете балл R2 на небольшом тестовом наборе, и вполне возможно, что такая подгонка шума дает постоянно худший результат, чем простой член перехвата на тестовом наборе.

Это типичный случай компромисса смещения и дисперсии. У ваших моделей низкий уровень смещения и высокая дисперсия, поэтому они плохо работают с тестовыми данными. Существуют определенные модели, которые направлены на уменьшение переобучения / дисперсии, например, Lasso и Elastic Net. Эти модели на самом деле относятся к числу моделей, которые, по вашему мнению, работают лучше.

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

Другие вопросы по тегам