线性回归

应用LinearRegression或SGDRegressor实现回归预测

知道回归算法的评估标准及其公式

知道过拟合与欠拟合的原因以及解决方法

知道岭回归的原理及与线性回归的不同之处

应用Ridge实现回归预测

应用joblib实现模型的保存于加载

1、掌握线性回归的定义

利用回归方程(函数)对一个或多个自变量(特征值)和因变量(目标值)之间关系进行建模的一种分析方式。

线性回归的分类:线性关系 非线性关系

2、线性回归API

sklearn.linear_model.LinearRegression()

LinearRegression.coef_:回归系数

LinearRegression.intercept_:回归系数

from sklearn.linear_model import LinearRegression
#1、获取数据
x=[[80,86],
   [82,80],
   [85,78],
   [90,90],
   [86,82],
   [82,90],
   [78,80],
   [92,94]
   ]
y=[84.2,80.6,80.1,90,83.2,87.6,79.4,93.4]
#模型训练
#实例化一个估计器
estimate=LinearRegression()
#使用fit方法进行训练
estimate.fit(x,y)

print("",estimate.coef_)
print("",estimate.predict([[100,80]]))

3、函数求导

常见函数的导数

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qbwlE8iG-1647483250899)(C:\Users\ldw\AppData\Roaming\Typora\typora-user-images\image-20211015171327188.png)]

导数的四则运算

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0NFWi3v0-1647483250900)(C:\Users\ldw\AppData\Roaming\Typora\typora-user-images\image-20211015171409426.png)]

矩阵向量求导

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4I9cWlLk-1647483250900)(C:\Users\ldw\AppData\Roaming\Typora\typora-user-images\image-20211015171820114.png)]

4、线性回归的损失和优化

1、损失函数

J ( W ) = ( h ( x 1 ) − y 1 ) 2 + ( h ( x 2 ) − y 2 ) 2 + . . . + ( h ( x m ) − y m ) 2 = ∑ i = 1 m ( h ( x i ) − y i ) 2 J(W)=(h(x_1)-y_1)2+(h(x_2)-y_2)2+...+(h(x_m)-y_m)2=\sum_{i=1}^m(h(x_i)-y_i)2 J(W)=(h(x1)y1)2+(h(x2)y2)2+...+(h(xm)ym)2=i=1m(h(xi)yi)2

h ( x i ) 为 第 i 个 训 练 样 本 特 征 值 组 合 预 测 函 数 h(x_i)为第i个训练样本特征值组合预测函数 h(xi)i

y i 为 第 i 个 训 练 样 本 的 预 测 值 y_i为第i个训练样本的预测值 yii

又称最小二乘法

2、优化算法

正规方程和梯度下降

1、正规方程

w = ( X T X ) − 1 X T Y w=(X^TX)^{-1}X^TY w=(XTX)1XTY

优点: x为特征值矩阵,y为目标值矩阵,直到求导最好的结果. 缺点:当特征过多过复杂时,求解速度太慢并且得不到结果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZPaWB8Bp-1647483250901)(C:\Users\ldw\AppData\Roaming\Typora\typora-user-images\image-20211018101320531.png)]

推导公式

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gxP4Oo1v-1647483250902)(C:\Users\ldw\AppData\Roaming\Typora\typora-user-images\image-20211018102150815.png)]

2、梯度下降算法

在单变量函数中,梯度就是函数的微分,代表函数在某个定点的切线的斜率

在多变量函数中,梯度就是一个向量,向量有方向,梯度的方向就指出了函数在给定点的上升最快的方向

梯度下降算法公式
θ i + 1 = θ i − α δ / ϕ θ i j ( θ ) \theta_{i+1}=\theta_i-\alpha\delta/\phi\theta_ij(\theta) θi+1=θiαδ/ϕθij(θ)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zWcLgq1D-1647483250903)(C:\Users\ldw\AppData\Roaming\Typora\typora-user-images\image-20211020135148145.png)]

5、线性回归随机梯度下降学习API

sklearn.linear_model.SGDRegression(loss=“squared_loss”,fit_intercept=True,learning_rate=“invscaling”,eta=0.01)

SGDRegression类实现了随机梯度下降学习,它支持不同的loss函数和正则化惩罚项来拟合线性回归模型

loss 损失类型 loss="squared_loss"普通最小二乘法

fit_intercept:是否计算偏重

learning_rate:学习率填充

“invscaling”:eta=eta0/pow(t,pow_t) pow_t=0.25:存在父类当中

对于一个常数值的学习率来说,可以使用learning_rate=“constant”,并使用eta0来指定学习率。

6、波士顿房价预测

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9jvsqmW3-1647483250903)(C:\Users\ldw\AppData\Roaming\Typora\typora-user-images\image-20211020141150892.png)]

from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression, SGDRegressor
from sklearn.metrics import mean_squared_error


def linear1():
    # 正规方程对波士顿房价进行预测

    # 1)获取数据集
    boston = load_boston()
    # 2)划分数据集
    x_train, x_test, y_train, y_test = train_test_split(boston.data, boston.target, random_state=22)
    # 3)特征工程:无量纲化 - 标准化
    transfer = StandardScaler()
    x_train = transfer.fit_transform(x_train)
    x_test = transfer.transform(x_test)
    # 4)预估器流程 fit() --> 模型 coef_ intercept_
    estimator = LinearRegression()
    estimator.fit(x_train, y_train)

    # 5)模型评估
    print("正规方程权重系数为:\n", estimator.coef_)
    print("正规方程偏置为:\n", estimator.intercept_)
    # 6)模型评估
    y_predict = estimator.predict(x_test)
    print("预测房价:\n", y_predict)
    error = mean_squared_error(y_test, y_predict)
    print("梯度下降-均方误差为:\n", error)
    return None


def linear2():
    # 梯度下降对波士顿房价进行预测
    # 1)获取数据集
    boston = load_boston()
    # 2)划分数据集
    x_train, x_test, y_train, y_test = train_test_split(boston.data, boston.target, random_state=22)
    # 3)特征工程:无量纲化 - 标准化
    transfer = StandardScaler()
    x_train = transfer.fit_transform(x_train)
    x_test = transfer.transform(x_test)
    # 4)预估器流程 fit() --> 模型 coef_ intercept_
    estimator = SGDRegressor(learning_rate="constant", eta0=0.01, max_iter=10000, penalty="l1")
    estimator.fit(x_train, y_train)

    # 5)模型评估
    print("梯度下降权重系数为:\n", estimator.coef_)
    print("梯度下降偏置为:\n", estimator.intercept_)

    # 6)模型评估
    y_predict = estimator.predict(x_test)
    print("预测房价:\n", y_predict)
    error = mean_squared_error(y_test, y_predict)
    print("梯度下降-均方误差为:\n", error)
    return None


if __name__ == "__main__":
    # linear1()
    linear2()

7、欠拟合和过拟合

欠拟合:学习到数据的特征过少,在训练集表现不好,测试集也表现不好
解决方案:1、增加数据的特征数量 2、添加多项式特征
过拟合:原始特征过多,存在一些嘈杂特征, 模型过于复杂是因为模型尝试去兼顾各个测试数据点

在训练集表现好,测试集也表现不好

​ 解决方案:1、重新清洗数据集 2、增大数据的训练集 3、正则化 4、减少特征维度
​ L1正则化
​ 直接把高次项前面的系数变成0
​ LASSO
​ L2 正则化更常用
​ 把高次项前面的系数变得特别小
​ Ridge - 岭回归:带L2正则化的线性回归

8、正则化线性函数

image-20211020144032967

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jakuWGzo-1647483250904)(C:\Users\ldw\AppData\Roaming\Typora\typora-user-images\image-20211020144237757.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4u8f2Pbg-1647483250904)(C:\Users\ldw\AppData\Roaming\Typora\typora-user-images\image-20211020144257315.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7EPPkqEO-1647483250905)(C:\Users\ldw\AppData\Roaming\Typora\typora-user-images\image-20211020144428250.png)]

岭回归:就是把系数添加平方项,然后限制系数值的大小。α值越小,系数值越大。α值越大,系数值越小。

Lasso回归:对系数值进行绝对值处理。由于绝对值在顶点处不可导,所以进行计算的过程中产生很多0,最后得到的结果是:稀疏矩阵

Elastic Net 弹性网络:是前两个内容的综合,设置一个γ,如果γ=0,则岭回归。如果γ=1 则Lasso回归。

9、岭回归API

sklearn.linear_model.Range(alpha=1.0,fit_intercept=True,solve=“auto”,normalize=False)

具有L2正则化的线性回归

alpha正则化力度,也叫λ λ取值0-1 1-10

solve:根据数据自动选择优化方法 sag如果数据集、特征都比较大,选择该随机梯度下降优化

normalize:数据是否进行标准化,若为true,则standardscaler标准化数据

Range.intercept_:回归偏重

Range.coef_:回归权重

sklearn.linear_model.RangeCV(_BaseRidgeCV,RegressorMixin)

具有l2正则化的线性回归,可进行交叉验证

coef_:回归系数

正则化力度越大,权重系数越小

正则化力度越小,权重系数越大

def linear3():
    # 岭回归对波士顿房价进行预测
    # 1)获取数据集
    boston = load_boston()
    # 2)划分数据集
    x_train, x_test, y_train, y_test = train_test_split(boston.data, boston.target, random_state=22)
    # 3)特征工程:无量纲化 - 标准化
    transfer = StandardScaler()
    x_train = transfer.fit_transform(x_train)
    x_test = transfer.transform(x_test)
    # 4)预估器流程 fit() --> 模型 coef_ intercept_
    #estimator = Ridge(alpha=0.5, max_iter=10000)
    estimator = RidgeCV(alphas=(0.001,0.01,0.1,1.10,100))
    estimator.fit(x_train, y_train)

    # 5)模型评估
    print("岭回归权重系数为:\n", estimator.coef_)
    print("岭回归偏置为:\n", estimator.intercept_)

    # 6)模型评估
    y_predict = estimator.predict(x_test)
    #print("预测房价:\n", y_predict)
    error = mean_squared_error(y_test, y_predict)
    print("岭回归-均方误差为:\n", error)
    return None

10、模型的保存和加载

保存模型
from sklearn.externals import joblib
joblib.dump(estimator,“my_ridge.pkl”)

#加载模型
estimator = joblib.load(“my_ridge.pkl”)

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐