1.线性回归的拟合
首先我在 data.csv中写了几条数据,判断 id 和 money 之间的关系
将他制作成散点图
这个图,很容易让我们想到它是否满足某种函数关系,下面分别看看它和一次,二次函数的拟合度
计算一次函数的各项系数
看图或许会更形象
我们看到,这个曲线和散点已经非常接近了,那是不是就是他的函数关系呢?
先不急下结论,我们再看看二次函数
和上面的构造方法类似
如出一辙,其实只是加了二次项系数,看图
这个貌似更接近了
当然我们凭感觉是不准确的,错觉是存在的
所以我们通过实验来证明
np.corrcoef() 测试拟合度
因为0.9998>0.987 所以二次函数比一次函数更适合这组数据
即 result2 这个模型更好
还可以利用模型摘要比较
result.summary()
result2.summary()
一次和二次
注意这些参数
R-squared:判定系数,或者称为拟合度,其值范围是[ 0, 1] ,值越大,表示模型拟合的越好
coef:显示的是 b 和 k 的系数
std err:相应系数的标准差
注意:虽然前面数据都表明第二个比第一个模型好,但我们还没有检测 “残差”
残差图的纵坐标就是残差 ,通过残差图观察
如果残差图是 “可预测的” ,那么就说明该函数不能反映数据规律
这里由于数据较少,不够直观,但这种方法是可行的。
下面我们看另一种方法,这里构造了大量数据
2.scikit-learn的工具
著名的机器学习库 scikit-learn 提供了一个工具-------LinearRegression
(1)普通最小二乘法
先构造一些数据
尽管我们已经知道函数关系式了,但为了检测,所以假装不知道
引入这个类
它有一些参数
LinearRegression():是用OLS方法来完成线性回归的
fit_intercept:是否计算常数项,默认为True;如果为False,则不计算
normalize:默认为False。如果为False,则此参数被忽略
copy_X:s默认为True, 此时训练集数据会被复制; 若为Fslse,则会把原训练集数据覆盖
coef_:以数组形式返回变量的系数
intercept_:以数组形式返回截距
求各项系数
其实到这里系数已经出来了,只不过我们看不到,将它打印出来并检测
同样的,必不可少的一部分,绘制残差图并观察
毫无疑问,残差是不可预测的,所以这个模型是正确的
(2)多项式函数 (关键)
上面的讨论只是针对一次函数,如果是多项式呢,这里用另一个方法创建
PolynomialFeatures( degree=2, interaction_only=False, include_bias=True)
参数解释
degree: 整数,默认为2,表示多项式最高阶的次数。
interaction_only: 默认为False。如果为True, 则变量会产生交叉。
include_bias: 默认为True。通常线性函数表达式中都要有常数项,默认所创建的多项式也有常数项,并且是1,
通过训练得到其系数。如果 include_bias=False,则常数项为0.
结果不难理解,分别是2,3,4的0,1,2,3次方
再看一个有交叉项的例子
函数解释到此结束,接着划分数据并进行拟合测试
是一个正弦函数
最终我们发现这个一元六次函数和正弦函数拟合度很高
当然我们需要用残差图来检验,和上面步骤一样,结果也一样是不可预测的,此处省略
我们用另一个方法验证
import math
math.sin(math.pi/2)
1.0
model.predict([[math.pi/2]])
array( [1.0199] )
这样也可以验证