Python 线性回归模型中如何降低均方误差提高R2

Python 线性回归模型中如何降低均方误差提高R2,python,machine-learning,scikit-learn,linear-regression,Python,Machine Learning,Scikit Learn,Linear Regression,我尝试用python执行一个线性回归模型的示例。 目的是在我的数据集中找到两个特征之间的线性关系,这两个特征是“年”和“肥胖%”。我想训练我的模型来预测世界肥胖的未来趋势。 问题是我的MSE太高,R2太低。如何改进我的模型 这是我找到数据集的地方;肥胖-cleaned.csv 代码 按国家分列的肥胖症分析 作为pd进口熊猫 以某人的身份出生 将matplotlib.pyplot作为plt导入 将numpy作为np导入 导入sklearn 从SKM学习导入度量 从sklearn.linear\u模

我尝试用python执行一个线性回归模型的示例。 目的是在我的数据集中找到两个特征之间的线性关系,这两个特征是“年”和“肥胖%”。我想训练我的模型来预测世界肥胖的未来趋势。 问题是我的MSE太高,R2太低。如何改进我的模型

这是我找到数据集的地方;肥胖-cleaned.csv

代码

按国家分列的肥胖症分析 作为pd进口熊猫 以某人的身份出生 将matplotlib.pyplot作为plt导入 将numpy作为np导入 导入sklearn 从SKM学习导入度量 从sklearn.linear\u模型导入线性回归 从sk学习导入预处理 地址='C:/Users/Andre/Desktop/Python/firstMN/csv' dt=pd.read\u csvaddress 消除多余数据 dt.dropdt['Obsety%'][dt['Obsety%'].值=='No data'].索引,就地=真 对于我在兰格伦特: dt['Obsety%].values[i]=floatdt['Obsety%].values[i].拆分[0] obMean=dt[‘肥胖%’)。平均值 打印“%0.3f”%obMean,“\n” dt['Obsety%]=dt['Obsety%].astypefloat转换为浮动中的il tipo group=dt.按“国家”分组 打印组[['年','肥胖%']]。表示'\n' dt1=dt[dt[‘性别’]=“两性”] printdt1[dt1['Obsety%]==dt1['Obsety%].max],'\n' sb.lmplot‘年’、‘肥胖%’,dt1 节目 线性回归预测 group1=dt1。按“年”分组 x=np.arraynp.linspace1975、2016、2016-1975+1.tolist y=np.array[group1['Obsety%].mean].tolist[0] x1=np.数组[1975、1976、1977、1978、1979、1980、1981、1982、1983、1984、1985、1986、1987、1988、1989、1990、1991、1992、1993、1994、1995、1996、1997、1998、1999、2000、2001、2002、2003、2004、2005、2006、2007、2008、2009、2010、2011、2012、2013、2014、2015、2016]。重塑-1,1 y1=np.array[group1['Obsety%].mean]。重塑-1,1 lr=线性回归拟合\截距=假 lr.fitx1,y1 plt.plotx,y 节目 打印“系数:”,lr.coef\u 打印截距:,lr.intercept\u y_hat=lr.x1 打印'MSE:',sklearn.metrics.mean_squared_errory_hat,y1 打印'R^2:',lr.scorex1,y1 打印'var:',y1.var 输出

Coefficients:  [[0.00626604]]
Intercept:  0.0
MSE:  15.09451970012738
R^2:  0.03779706109503678
var:  15.687459567838905 

Correlation among years and obesity (%) is:  (0.9960492544111168, 1.0885274634054143e-43)
强制fit_intercept=False对模型来说是一个巨大的约束,在决定这样做之前,您应该确保自己确切地知道自己在做什么

在简单线性回归中,无截距拟合实际上意味着,当单一特征X为0时,响应Y也应为0;在这里,这意味着在0年,不管这意味着什么,肥胖率也应该是0。考虑到这一点,报告的糟糕结果并不令人惊讶,ML不是魔术,这当然意味着我们在模型中包含了现实的假设

现在还不清楚你为什么决定这么做,但我非常怀疑你是否打算这么做。您应该从模型中删除此不必要的约束。

强制拟合_intercept=False对模型来说是一个巨大的约束,您应该确保在决定这样做之前,您确切地知道自己在做什么

在简单线性回归中,无截距拟合实际上意味着,当单一特征X为0时,响应Y也应为0;在这里,这意味着在0年,不管这意味着什么,肥胖率也应该是0。考虑到这一点,报告的糟糕结果并不令人惊讶,ML不是魔术,这当然意味着我们在模型中包含了现实的假设

现在还不清楚你为什么决定这么做,但我非常怀疑你是否打算这么做。您应该从模型中删除此不必要的约束。

删除代码中的fit\u intercept=False。如果真实模型截距真的为零,截距项将近似为零,因此无需将fit_intercept设置为False。据我所知,你基本上是在限制模型,如果我错了,没有任何理由这样做来纠正我

从:

是否计算此模型的截距。如果设置为False,则计算中将不使用截距,即数据预期居中

我没有看到你把数据集中在哪里。因此,您的结果是有缺陷的。要纠正这种情况,只需删除fit_intercept=False,因为它默认为True

删除代码中的fit\u intercept=False。如果真实模型截距真的为零,截距项将近似为零,因此无需将fit_intercept设置为False。据我所知,你基本上是在限制模型,如果我错了,没有任何理由这样做来纠正我

从:

是否计算此模型的截距。如果设置为False,则计算中将不使用截距,即数据预期居中

我没有看到你把数据集中在哪里。因此,您的结果是有缺陷的。要纠正这种情况,只需删除fit_intercept=False,因为它默认为True

是的,只需删除fit_intercept=False即可 使用问题中提供的相同代码,我能够将MSE值降低到0.124是的,通过删除fit_intercept=False并使用问题中提供的相同代码,我能够将MSE值降低到0.124