线性回归原理
参考链接:https://www.cnblogs.com/geo-will/p/10468253.html
线性回归是回归问题中的一种,线性回归假设目标值与特征之间线性相关,即满足一个多元一次方程。通过构建损失函数,来求解损失函数最小时的参数w和b。通长我们可以表达成如下公式:
损失函数:
就是求测试值与真实值的残差平方和:
衡量参数 的优劣的评估指标,⽤来求解优参数的⼯具
损失函数小,模型在训练集上表现优异,拟合充分,参数优秀
损失函数大,模型在训练集上表现差劲,拟合不足,参数糟糕
我们追求,能够让损失函数小化的参数组合
最小二乘法:
1)最小二乘法(least square method)
求解 w 和 b 是使损失函数最小化的过程,在统计中,称为线性回归模型的最小二乘“参数估计”(parameter estimation)。我们可以将 L(w,b) 分别对 w 和 b 求导,得到
令上述两式为0,可得到 w 和 b 最优解的闭式(closed-form)解:
2)梯度下降(gradient descent)
梯度下降核心内容是对自变量进行不断的更新(针对w和b求偏导),使得目标函数不断逼近最小值的过程
线性回归的优缺点
优点
- 运算速度快。由于算法很简单,而且符合非常简洁的数学原理,不管是建模速度,还是预测速度都是非常快的。
- 可解释性强。由于最终我们可以得到一个函数公式,根据计算出的公式系数就可以很明确地知道每个变量的影响大小。
- 对线性关系拟合效果好。当然,相比之下,如果数据是非线性关系,那么就不合适了。
缺点
- 预测的精确度较低。由于获得的模型只是要求最小的损失,而不是对数据良好的拟合,所以精确度略低。
- 不相关的特征会影响结果。对噪声数据也比较难处理,所以在数据处理阶段需要剔除不相关的特征以及噪声数据。
- 容易出现过拟合。尤其在数据量较少的情况下,可能出现这种问题。
Python代码用例
对个人医疗费用进行预测, 里面有如下7个变量
年龄:主要受益人年龄
性别:保险承包商性别,女,男
bmi:身体质量指数,提供对身体的了解,体重相对于身高是高还是低,
子女:健康保险覆盖的子女人数/受抚养人人数
吸烟者:吸烟
地区:受益人在美国、东北、东南、西南、西北的住宅区。
费用:由健康保险支付的个人医疗费用
老规矩先读取数据, 看下数据概况
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
data=pd.read_csv("insurance.csv")
data.head()
个人喜欢先看看数据概况, 大致有没有问题, 实际上做数据处理的时候, 开始并没有这个习惯, 后来四处碰壁, 结果看看数据对以后的数据模型选择计算等, 都有帮助, 我一般最先看看大小, 空值, 描述性统计等.
数据编码转换
# 数据转换 使用LabelEncoder
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
for col in data.columns:
data[col]=le.fit_transform(data[col])
data.head()
# 线性回归
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
# 划分自变量, 因变量
X = data.iloc[:,:-1]
y = data.iloc[:,-1]
# 划分测试集和训练集
x_train, x_test, y_train, y_test = train_test_split(X,y, test_size=0.2, random_state = 42)
linear_model=LinearRegression()
linear_model.fit(x_train,y_train)
# R2得分
from sklearn.metrics import r2_score
y_pred=linear_model.predict(x_test)
print(r2_score(y_test,y_pred))
多项式回归
将高次项看做对一次项特征的扩展得到:
那么一元多项式回归即可以看做为多元线性回归,可以使用LinearRegression模型对样本数据进行模型训练。
所以一元多项式回归的实现需要两个步骤:
- 将一元多项式回归问题转换为多元线性回归问题(只需给出多项式最高次数即可)。
- 将1步骤得到多项式的结果中 w1 w2 … 当做样本特征,交给线性回归器训练多元线性模型。
# 多项式回归
from sklearn.preprocessing import PolynomialFeatures
# PolynomialFeatures是多项式特征扩展器
poly = PolynomialFeatures(degree=2) # degee最高次幂方程的最高次幂
x_poly = poly.fit_transform(X)
x_train, x_test, y_train, y_test = train_test_split(x_poly,y, test_size=0.2, random_state = 42)
poly_model = linear_model.fit(x_train,y_train)
y_pred = poly_model.predict(x_test)
#R2得分
print(r2_score(y_test,y_pred))
个人习惯, 其实看看可特征的相关性, 是否存在多重共线性
import matplotlib.pyplot as plt
import seaborn as sns
correlation = data.iloc[:,0:-1].corr()
plt.figure()
sns.heatmap(correlation, annot = True)
检验是否存在多重共线性, 从统计学上来讲
- 自变量之间相关系数均 > 0.7,且P值均 < 0.05,表明自变量间相关性较强,说明自变量之间存在共线性。
- Tolerance(容忍度)和VIF(方差膨胀因子)。一般认为如果Tolerance < 0.2或VIF > 10,则要考虑自变量之间存在多重共线性的问题
自相关系数和方差膨胀因子python都可以实现. 这里推荐这个链接可以学习多重共线性的检验: https://blog.csdn.net/m0_47256162/article/details/113788093
多重共线性是指线性回归模型中的解释变量之间由于存在精确相关关系或高度相关关系而使模型估计失真或难以估计准确。如果存在多重共线性, 则需要优化模型, 或者使用其他模型, 例如岭回归, 使得模型训练效果更好.