• 【机器学习】正规方程与梯度下降API及案例预测


    正规方程与梯度下降API及案例预测

    1. 正规方程与梯度下降

    回归模型是机器学习中用于预测连续数值(实数)的模型,通常用于解决回归问题。两种常见的回归模型求解方法是正规方程和梯度下降。

    正规方程(Normal Equation)

    正规方程是一种封闭解法,用于直接计算线性回归模型的权重(系数)。

    原理
    给定一个线性回归模型的数据集,我们的目标是找到最佳的权重(系数)w,使得模型的预测值尽可能接近实际值。正规方程的原理是通过最小化损失函数来找到最佳权重。对于线性回归问题,损失函数通常是均方误差(Mean Squared Error):
    J ( w ) = 1 2 m ∑ i = 1 m ( h w ( x ( i ) ) − y ( i ) ) 2 J(w) = \frac{1}{2m} \sum_{i=1}^{m} (h_w(x^{(i)}) - y^{(i)})^2 J(w)=2m1i=1m(hw(x(i))y(i))2

    其中,m 是训练样本数量,
    h w ( x ( i ) ) h_w(x^{(i)}) hw(x(i))
    是模型的预测值,
    y ( i ) y^{(i)} y(i)
    是实际值。

    正规方程的目标是找到权重w,使损失函数J(w)最小化。通过求解损失函数的梯度等于零的方程,可以得到权重w的解析解:

    ∇ J ( w ) = 0 \nabla J(w) = 0 J(w)=0

    这个方程的解即为最佳权重w,从而得到线性回归模型。

    优点

    • 正规方程提供了封闭解,不需要手动选择学习率或迭代次数。
    • 适用于小型数据集,通常在特征数量较少时表现良好。

    缺点

    • 对于大型数据集,计算复杂度高,需要计算特征矩阵的逆,时间复杂度较高。
    • 不适用于非线性模型。

    梯度下降(Gradient Descent)

    梯度下降是一种迭代优化算法,用于调整模型的参数,使损失函数最小化。

    原理
    梯度下降的核心思想是通过迭代来更新模型参数,使损失函数逐渐减小。对于线性回归,梯度下降的损失函数是均方误差(Mean Squared Error),目标是最小化这个损失函数。

    梯度下降的迭代过程如下:

    1. 初始化权重w。
    2. 计算损失函数J(w)关于权重 w w w的梯度
      ∇ J ( w ) \nabla J(w) J(w)
    3. 更新权重w,通常按照以下规则更新:
      w = w − α ∇ J ( w ) w = w - \alpha \nabla J(w) w=wαJ(w)
      ,其中α是学习率,控制每次更新的步长。
    4. 重复步骤2和3,直到满足停止条件(例如,达到最大迭代次数或损失函数收敛)。

    梯度下降的关键是学习率α的选择,过大的学习率可能导致算法不收敛,过小的学习率可能导致收敛速度慢。

    优点

    • 适用于大型数据集和高维特征,计算复杂度较低。
    • 可以用于各种不同类型的模型和损失函数,包括非线性模型。

    缺点

    • 需要手动选择学习率和迭代次数,选择不当可能导致收敛问题或性能下降。
    • 对特征缩放和初始化敏感。

    2. API

    sklearn.linear_model.LinearRegression(fit_intercept=True)

    • 通过正规方程优化
    • fit_intercept:是否计算偏置
    • LinearRegression.coef_:回归系数
    • LinearRegression.intercept_:偏执

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

    • SGDRegressor类实现了随机梯度下降学习,它支持不同的loss函数和正则化惩罚项来拟合线性回归模型
    • loss:损失类型
      • loss=“squared_loss”:普通最小二乘法
    • fit_intercept:是否计算偏置
    • learning_rate:string,optional
      • 学习率填充
      • “constant”:eta=eta0
      • “optimal”:eta=1.0/(alpha*(t+t0))[default]
      • “invscaling”:eta=eta0/pow(t,power_t),power_t存在父类之中
      • 对于一个常数值的学习率来说,可以使用learning_rate=“constant”,并使用eta0来指定学习率
    • SGDRegressor.coef_:回归系数
    • SGDRegressor.intercept_:偏置

    3. 波士顿房价预测

    • 实例数量:506,属性数量:13数值型或类别墅,帮助预测的属性
    • 属性信息:
      • CRIM城镇人均犯罪率
      • ZN占地面积超过2.5万平方英尺的住宅用地比例
      • INDUS城镇非零售业务地区的比例
      • CHAS查尔斯河虚拟变量(=1,如果土地在河边;否则是0)
      • NOX一氧化氮浓度(每1000万份)
      • RM平均每居民房数
      • AGE在1940年之前建成的所有者占用单位的比例
      • DIS与五个波士顿就业中心的加权距离
      • RAD辐射状公路的可达性指数
      • TAX每10000美元的全额物业税率
      • PTRATIO城镇师生比例
      • B 1000(Bk-0.63)^2其中Bk是城镇中的黑人比例
      • LSTAT人口中地位较低人群的百分数
      • MEDV以1000美元计算的自由住房的中位数
    • 缺失属性值:无

    流程:

    • 获取数据集
    • 划分数据集
    • 特征工程:无量纲化处理–标准化
    • 预估器流程,fit()–>模型:coef_,intercept_
    • 模型评估
    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
    
    def linear_demo():
        """
        正规方程的方法对波士顿房价进行预测
        :return:
        """
        # 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. 预估器
        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("y_predict:\n", y_predict)
        print("直接对比真实值和预测值:\n", y_test == y_predict)
        score = estimator.score(x_test, y_test)
        print("准确率为:\n", score)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    from sklearn.datasets import load_boston
    from sklearn.model_selection import train_test_split
    from sklearn.preprocessing import StandardScaler
    from sklearn.linear_model import SGDRegressor
    
    def linear_demo():
        """
        梯度下降的方法对波士顿房价进行预测
        :return:
        """
        # 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. 预估器
        estimator = SGDRegressor()
        estimator.fit(x_train, y_train)
        # 5. 得出模型
        print("权重系数为:\n", estimator.coef_)
        print("偏置为:\n", estimator.intercept_)
        # 6. 模型评估
        y_predict = estimator.predict(x_test)
        print("y_predict:\n", y_predict)
        print("直接对比真实值和预测值:\n", y_test == y_predict)
        score = estimator.score(x_test, y_test)
        print("准确率为:\n", score)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
  • 相关阅读:
    docker elasticsearch 7.16.3安装ik分词器
    奇淫巧技,CompletableFuture 异步多线程是真的优雅
    【MyBatis】多条件查询、动态SQL、多表操作、注解开发
    【python基础】函数的使用
    逆向通达信 x 逆向微信 x 逆向Qt
    虹科方案 | 虹科ATTO加速虚拟存储管理
    下班时间做抖音小店,连直播都不会的我,7天销售额流水50多万
    IC设计职位介绍|如何成为一名合格的数字前端设计工程师?
    AI算法平台及视频智能分析系统在高速公路场景中的智能化应用
    LangChain转换链:让数据处理更精准
  • 原文地址:https://blog.csdn.net/likinguuu/article/details/134224075