线性回归中的负准确率

我的线性回归模型的判定系数R²是值。

这是怎么发生的?任何想法都很有帮助。

这是我的数据集:

year,population1960,22151278.01961,22671191.01962,23221389.01963,23798430.01964,24397022.01965,25013626.01966,25641044.01967,26280132.01968,26944390.01969,27652709.01970,28415077.01971,29248643.01972,30140804.01973,31036662.01974,31861352.01975,32566854.01976,33128149.01977,33577242.01978,33993301.01979,34487799.01980,35141712.01981,35984528.01982,36995248.01983,38142674.01984,39374348.01985,40652141.01986,41965693.01987,43329231.01988,44757203.01989,46272299.01990,47887865.01991,49609969.01992,51423585.01993,53295566.01994,55180998.01995,57047908.01996,58883530.01997,60697443.01998,62507724.01999,64343013.02000,66224804.02001,68159423.02002,70142091.02003,72170584.02004,74239505.02005,76346311.02006,78489206.02007,80674348.02008,82916235.02009,85233913.02010,87639964.02011,90139927.02012,92726971.02013,95385785.02014,98094253.02015,100835458.02016,103603501.02017,106400024.02018,109224559.0

LinearRegression模型的代码如下:

import pandas as pdfrom sklearn.linear_model import LinearRegressiondata =pd.read_csv("data.csv", header=None )data = data.drop(0,axis=0)X=data[0]Y=data[1]from sklearn.model_selection import train_test_split X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size = 0.1,shuffle =False)lm = LinearRegression()lm.fit(X_train.values.reshape(-1,1), Y_train.values.reshape(-1,1))Y_pred = lm.predict(X_test.values.reshape(-1,1))accuracy = lm.score(Y_test.values.reshape(-1,1),Y_pred)print(accuracy)
output-3592622948027972.5

回答:

Scikit-learn的LinearRegression评分使用的是𝑅2分数。负的𝑅2意味着模型对数据的拟合非常差。因为𝑅2比较模型拟合与原假设(一条水平直线)的拟合情况,当模型的拟合比水平线还要差时,𝑅2就会是负值。

𝑅2 = 1 - (SUM((y - ypred)**2) / SUM((y - AVG(y))**2))

所以如果SUM((y - ypred)**2大于SUM((y - AVG(y))**2,那么𝑅2将是负值。

原因及修正方法

问题1:你对时间序列数据进行了随机分割。随机分割会忽略时间维度。
解决方案:保持时间流动(见下方代码)

问题2:目标值非常大。
解决方案:除非使用基于树的模型,否则你需要对目标进行特征工程以将数据缩放到模型可以学习的范围内。

这里是一个代码示例。使用LinearRegression的默认参数和目标值的log|exp变换,我的尝试得到了大约87%的𝑅2分数:

import pandas as pdimport numpy as np# 我们需要转换/特征工程我们的目标# 我将使用numpy的log。使用np.log和np.exp使值可学习from sklearn.linear_model import LinearRegressionfrom sklearn.compose import TransformedTargetRegressor# 你的数据,df# 转换年份为参考年df = df.assign(ref_year = lambda x: x.year - 1960)df.population = df.population.astype(int)split = int(df.shape[0] *.9) #在90%处分割,大约10%df = df[['ref_year', 'population']]train_df = df.iloc[:split]test_df = df.iloc[split:]X_train = train_df[['ref_year']]y_train = train_df.populationX_test = test_df[['ref_year']]y_test = test_df.population# 回归器regressor = LinearRegression()lr = TransformedTargetRegressor(        regressor=regressor,         func=np.log, inverse_func=np.exp)lr.fit(X_train,y_train)print(lr.score(X_test,y_test))

对于那些希望改进它的人来说,这里是一种读取该数据集的方法

import pandas as pdimport iodf = pd.read_csv(io.StringIO('''year,population1960,22151278.0 1961,22671191.0 1962,23221389.0 1963,23798430.0 1964,24397022.0 1965,25013626.0 1966,25641044.0 1967,26280132.0 1968,26944390.0 1969,27652709.0 1970,28415077.0 1971,29248643.0 1972,30140804.0 1973,31036662.0 1974,31861352.0 1975,32566854.0 1976,33128149.0 1977,33577242.0 1978,33993301.0 1979,34487799.0 1980,35141712.0 1981,35984528.0 1982,36995248.0 1983,38142674.0 1984,39374348.0 1985,40652141.0 1986,41965693.0 1987,43329231.0 1988,44757203.0 1989,46272299.0 1990,47887865.0 1991,49609969.0 1992,51423585.0 1993,53295566.0 1994,55180998.01995,57047908.0 1996,58883530.0 1997,60697443.0 1998,62507724.0 1999,64343013.0 2000,66224804.0 2001,68159423.0 2002,70142091.0 2003,72170584.0 2004,74239505.02005,76346311.02006,78489206.0 2007,80674348.0 2008,82916235.0 2009,85233913.0 2010,87639964.0 2011,90139927.0 2012,92726971.0 2013,95385785.0 2014,98094253.0 2015,100835458.0 2016,103603501.0 2017,106400024.0 2018,109224559.0'''))

结果:输入图片说明

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注