有监督学习的回归算法【标签是连续数据类型】
研究父子身高关系
研究父辈身高(自变量x)如何决定子辈身高(因变量y)
建立方程表征关系:y = kx+b-------------这个方程是 回归方程
什么是线性?
什么是线性回归方程 什么是非线性回归方程?
①y = kx+b ②y=$a_1x_1^2+a_2x_2^2 + c$ ③ $y = a_1x_1+a_2x_2 + c$
①和③是线性方程 ----自变量x的幂 是1次方
②非线性方程----自变量x的幂 大于等于2
方程①有一个未知数 ----研究一个特征和标签之间的关系【一元线性回归】
方程③有2个未知数 ----研究2个特征和标签之间的关系【多元线性回归】
通过寻找特征和标签之间的关系,生成一个线性方程,通过线性方程预测未知标签
算法的结果是一个线性方程
如果特征有一个------>对应的方程 就是一元线性方程
如果特征有N个------>对应的方程 就是N元线性方程
1.结果具有可解释性(根据线性方程可以明确的得出结果是如何计算出来的)
2.是逻辑回归算法的基础
3.特征与标签之间具有线性关系
因为一元线性方程为:y=kx+b,k与b的值比较好求,且实际过程中一元线性关系较少,我们再次不做讨论。
由一元线性方程可得出多元线性方程为:
则假设,具有n个特征的样本的标签和特征存在一种线性关系,则可定义出多元线性回归
利用均方误差损失函数进行求导,可以获取回归系数。
均方误差损失函数:
令均方误差损失函数的导数为0,求取回归系数。
对该函数求导,可得到
举例:比如元数据集中共有n个特征,那么求导数的结果会变成一个n+1个特征,1列的数组,分别对象多元线性回归方程中的b值和k值
最小二乘法:利用均方误差 求解最优化的方式 称为最小二乘法
from sklearn.linear_model import LinearRegression
# 实例化
alg = LinearRegression()
# 拟合
alg.fit(X_train, y_train)
# 查看回归系数
print('回归系数:', alg.coef_) # 返回的是一个数组
# 查看截距
print('截距:', alg.intercept_)
# 查看预测结果
y_pred = alg.predict(X_test)
print('预测结果:', y_pred)
# 查看R2
score = alg.score(X_test, y_test)
print('R2:', score)
在使用随机梯度下降法时,需要提前对数据进行标准化
随机梯度下降法,不仅使用了倒数,还使用了偏导数。所谓偏导即为,将要求偏导的项的x作为未知数,其余项全视作常数项,然后进行求导。
和正规方程解类似的,随机梯度下降也在寻找导数等于0的情况。因此,随机梯度下降法也需要使用均方误差损失函数Loss
预测值为:
lr表示学习率,lr是一个小于零的数字,当求出偏导太大时,减去一个很大的值,容易跳过导数等于0的点,因此需要使用学习率lr来控制w的梯度下降的幅度。
from sklearn.linear_model import SGDRegerssor
# 实例化
alg = SGDRegerssor()
# 参数:random_state=1
# 拟合
alg.fit(X_train, y_train)
# 查看回归系数
print('回归系数:', alg.coef_) # 返回的是一个数组
# 通过观察回归系数的大小可以观察出哪个系数对应的特征对标签影响最大或最小
# 查看截距
print('截距:', alg.intercept_)
# 查看预测结果
y_pred = alg.predict(X_test)
print('预测结果:', y_pred)
# 查看R2
score = alg.score(X_test, y_test)
print('R2:', score)
'''
随机梯度下降可以将样本分为多个分批次操作,避免数据量太大造成影响
'''
数据集量小-------正规方程解【正规方程解可能不存在】
数据集量大-------随机梯度下降
泛化能力:是指模型在未知数聚集上的表现能力。
算法目的:建立一个泛化能力较强的模型(即算法模型不仅在测试集表现好,更在其他未知数据集表现也好)
在训练集上拟合的不够,在训练集上的效果很差,在测试集上的效果也很差,在未知数据上也很差
原因:
特征多项式处理
将原始数据增加至少两列,一列为x的0次方,一列为x的平方
这样可以将原始的线性方程转为非线性的方程
举例子:
在特征多项式处理前:
经过特征多项式处理后:
处理之后的线变成了曲线,就能处理欠拟合的情况了
from sklearn.preprocession import PolynomialFeatures
# 实例化
pf = PolynomialFeatures(degree=2) # 最大特征大2次方
# 拟合并转化fit_transform
X_new = pf.fit_transform(X)
print('处理后:', X_new)
# 接下来就使用转化后的X_new来进行算法处理
在训练集上过分拟合,在训练集上效果很好,但是在测试集上效果很差,为止数据集效果差
原因:
特征正则化处理:
L1正则化(套索回归):会将部分特征的系数变为0,用来减少特征数量。
L2正则化(岭回归):会将部分特征的系数据趋近于0,用来减少冗余特征与标签的相关性。
L1正则化基于Sklearn实现
from sklearn.linear_model import Lasso
# 实例化
alg = Lasso()
# 参数:alpha:空值正则化力度,等于1就等同于普通线性回归,alpha越大变化的值越多
# 拟合
alg.fit(X_train, y_train)
# 查看回归系数
print('回归系数:', alg.coef_)
# 查看截距
print('截距:', alg.intercept_)
# 查看R2
score = alg.predict(X_test, y_test)
print('R2:', score)
L2正则化基于sklearn实现
from sklearn.linear_model import Ridge
# 实例化
alg = Ridge()
# 参数:alpha:空值正则化力度,等于1就等同于普通线性回归,alpha越大变化的值越多
# alpha 控制正则化的力度
# alpha=0 就 等于普通的线性回归
# alpha=1 就部分系数变为0
# alg = Lasso(alpha=100)
# 拟合
alg.fit(X_train, y_train)
# 查看回归系数
print('回归系数:', alg.coef_)
# 查看截距
print('截距:', alg.intercept_)
# 查看R2
score = alg.predict(X_test, y_test)
print('R2:', score)
总结
正则化可以通过网格搜索来判断最好的alpha,欠拟合使用多项式特征处理,过拟合使用套索回归和岭回归。但是大多数情况下使用岭回归(部分特征趋近于0 ),因为套索回归会把部分特征变成0