线性回归

线性回归:线性回归时利用数理统计中的回归分析,来确定两个或两个以上变量间相互依赖的定量关系的一种统计分析方法。

分类:

  1. 一元线性回归分析
    只包括一个自变量和一个因变量,且两者的关系可用一直直线近似表示,这种回归分析称为一元线性回归分析。
  2. 多元线性回归分析
    回归分析中包括两个或两个以上的自变量,且因变量与自变量之间是线性近似关系,则称为多元线性回归分析。

特点:

  1. 用于解决回归问题
  2. 思想简单,容易实现
  3. 是需要强大的非线性模型的基础
  4. 结果具有很好的解释性

适用场景

对大量的观测数据进行处理,从而得到比较符合事物内部规律的数学表达式。也就是说寻找到数据与数据之间的规律所在,从而就可以模拟出结果,也就是对结果进行预测。解决的就是通过已知的数据得到未知的结果。例如:对房价的预测、判断信用评价、电影票房预估等。

实现方法:

1. 最小二乘法:

又叫最小平方法。是一种数学优化技术,它通过最小化误差的平方和寻找数据的最佳函数匹配。希望找到一条直线,这条直线尽可能的离每一个样本都足够近。

1.1模型评测:

最小二乘法(OLS)的基本原则是:最优拟合直线应该是使各点到回归直线的距离和最小的直线,即平方和最小。换言之,OLS是基于距离的,而这个距离就是我们用的最多的欧几里得距离。为什么它会选择使用欧式距离作为误差度量呢(即Mean squared error, MSE),主要有以下几个原因:

  • 简单,计算方便;
  • 欧氏距离是一种很好的相似性度量标准;
  • 在不同的表示域变换后特征性质不变。
    MSE:均方误差是指参数估计值与参数真值之差平方的期望值;
    MSE可以评价数据的变化程度,MSE的值越小,说明预测模型描述实验数据具有更好的精确度。

RMSE:均方根误差,为MSE的算术平方根,相当于L2范数,次数越高。计算结果就越与较大的值有关,而忽略较小的值,这就是RMSE针对异常值更敏感的原因。

注意: 不论是RMSE还是MSE。都无法评判相同的算法,在不同业务上的好坏。

MAE :Mean Absolute Error

平均绝对误差是绝对误差的平均值
平均绝对误差能更好地反映预测值误差的实际情况.

python 二元线性回归 算法 二元线性回归分析_python 二元线性回归 算法

1.2 过拟合、欠拟合如何解决

使用正则化项,也就是给loss function加上一个参数项,正则化项有L1正则化、L2正则化、ElasticNet。加入这个正则化项好处:

  • 控制参数幅度,不让模型“无法无天”。
  • 限制参数搜索空间
  • 解决欠拟合与过拟合的问题。
1.2 公式

python 二元线性回归 算法 二元线性回归分析_python 二元线性回归 算法_02

最小二乘法代码:
x_mean = np.mean(x)   #np.mean()   =>求平均值
y_mean = np.mean(y)
num = 0.0
d = 0.0
for x_i,y_i in zip(x,y):   #zip(a,b)   =>将a,b两个数据集合打包在一起,类似拉链操作
    num +=(x_i-x_mean) * (y_i-y_mean)
    d += (x_i-x_mean) ** 2
a = num / d  				#参数a
b = y_mean - a*x_mean		#参数b
#模型预测
predict_y = a*x+b
plt.scatter(x,y)   		#绘制x和y散点图
plt.plot(x,predict_y,color='r')		#以x和预测的y值作图
plt.show()
#向量化操作
vector_num = (x - x_mean).dot(y - y_mean)
vector_d = (x-x_mean.dot(x-x.mean)
a = vector_num / vector_d 
predict_y = a * x+b
#评测指标
mse = np.sum((y - predict_y)**2) /len(y)    #MSE均方误差
rmse = np.sqrt(mse)     #RMSE均方根误差
mae = np.sum(np.absolute((y-predict_y))) / len(y)   #MAE平均绝对误差

波士顿房价实战:

import numpy as np
import matplotlib.pyplot as plt
from  sklearn import  datasets    #导入数据集

boston=datasets.load_boston()  #加载数据集
x=boston.data[:,5]    
y=boston.target
#移除上线数据(异常点)
x=x[y<50]
y=y[y<50]
plt.scatter(x,y)
plt.show()


x_mean = np.mean(x)   #np.mean()   =>求平均值
y_mean = np.mean(y)

#快捷操作,向量化操作
vector_num = (x - x_mean).dot(y - y_mean)
vector_d = (x-x_mean.dot(x-x.mean)
a = vector_num / vector_d 
predict_y = a * x+b
               
            
#模型评测,通过导包,传参直接得出结果
from sklearn.metrics immport mean_squared_error
from sklearn.metrics immport mean_absolute_error
mean_squared_error(test_label,predict_test)     #MSE值
mean_absolute_error(test_label,predict_test)    #MAE值

正规方程解

***只要特征数量并不是特别大,对于线性回归问题正规方程是一个比梯度下降算法更快的替代算法。***但是当特征数量非常多的时候或者模型更复杂的时候(比如logistic regression等),正规方程就不再适用了。而梯度下降方法都可以使用。另外,当(X.T)X是奇异矩阵(也称退化矩阵,不可逆)时,正规方程也不能使用,但是这种情况很少会发生(m≤n或者存在有依赖关系的特征)。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OpOqKNat-1582544037181)(E:\Typora图片\正规方程和梯度下降法的区别.png)]

python 二元线性回归 算法 二元线性回归分析_python 二元线性回归 算法_03

import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
boston = datasets.load_boston()
x = boston.data
y = boston.target
import sklearn.model_selection import train_test_split
train_data,test_data,train_label,test_label=train_test_split(x,y,test_size=0.2,random_state=666)
Xb = np.hstack([np.ones((len(train_data),1)),train_data])   #第一列添加1矩阵。得到Xb
theta=np.linalg.inv((Xb.T.dot(Xb))).dot(Xb.T).dot(train_label)  #求Ø的公式
jj = theta[0]   #截距
cs = threta[0:] #参数列表
#模型预测
Xb_test = np.hstack([np.ones((len(test_data),1)),test_data])
predict_label = Xb_test.dot(theta)

sklearn中的线性回归

from sklearn.linear_model import LinearRegression
lin_reg = LinearRegression()
lin_reg.fit(train_data,train_label)
lin_reg.conf_       #取得参数列表
lin_reg.intercepl_  #取得截距
lin_reg.predict(test_data)  #返回预测结果
lin_reg.score(test_data,test_label) #评测标准为R²
     
     
#特征的重要程度
boston.feature_names    #查看参数
boston.feature_names[np.argsort(lin_reg.conf_)] #参数排序再显示,参数越大,说明相关度越高
#返回预测结果
 lin_reg.score(test_data,test_label) #评测标准为R²#特征的重要程度
 boston.feature_names #查看参数
 boston.feature_names[np.argsort(lin_reg.conf_)] #参数排序再显示,参数越大,说明相关度越高