我不确定问题是出在我的回归估计模型上,还是出在我对 r^2 拟合度测量实际含义的理解上。我正在使用 scikit learn 和大约 11 个不同的回归估计器进行一个项目,以产生(粗略的!)棒球幻想表现的预测。某些模型总是比其他模型表现更好(决策树回归和额外树回归产生最差的 r^2 分数,而 ElasticCV 和 LassoCV 产生最好的 r^2 分数,而且偶尔甚至可能是一个稍微正数!)。
如果一条水平线产生的 r^2 分数为 0,那么即使我所有的模型都毫无价值,并且实际上具有零预测值,并且完全随机地吐出数字,那么我不应该得到 r^ 的小正数2 有时,如果仅仅是因为愚蠢的运气?尽管在不同的数据集上运行了数百次,但我使用的 11 个估计器中有 8 个从未为 r^2 产生过哪怕很小的正数。
我是否误解了 r^2 的工作原理?
我也没有在 sklearn 的 .score 函数中切换顺序。我已经仔细检查了很多次。当我以错误的方式放置 y_pred, y_true 的顺序时,它会产生非常负的 r^2 值(例如 <-50 大)
事实上,这种情况实际上让我更加困惑,这里的 r^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,甚至那些估计器(elasticCV、lassoCV、linearRegression)大多数时候都是负数,尽管只是略微负数。
即使我正在构建的这些模型很糟糕。说它们是完全随机的,并且在涉及到目标时没有任何预测能力:它不应该比普通水平线预测得更好吗?一个不相关的模型如何始终如一地预测比水平线更差?