超详细机器学习-线性回归案例(正规方程、梯度下降、岭回归)

一、线性回归

  • 定义

线性回归通过一个或者多个自变量与因变量之间之间进行建模的回归分析。其中特点为一个或多个称为回归系数的模型参数的线性组合。

  • 分类

一元线性回归:涉及到的变量只有一个。
多元线性回归:涉及到的变量两个或两个以上。

  • 公式
    超详细机器学习-线性回归案例(正规方程、梯度下降、岭回归)_第1张图片

  • 图例

    • 单变量超详细机器学习-线性回归案例(正规方程、梯度下降、岭回归)_第2张图片

    • 多变量 超详细机器学习-线性回归案例(正规方程、梯度下降、岭回归)_第3张图片

  • 最小二乘法

    • 说明

    线性回归中的最小二乘法是用来求线性回归中的损失函数(误差大小),我们通常通过减少这个损失来提高回归模型的可靠性。

    • 公式
      超详细机器学习-线性回归案例(正规方程、梯度下降、岭回归)_第4张图片
    • 最小二乘法之回归方程
      • 适用场景:小规模数据
      • 公式
        在这里插入图片描述
      • 图例(单变量)
        超详细机器学习-线性回归案例(正规方程、梯度下降、岭回归)_第5张图片
      • API
        超详细机器学习-线性回归案例(正规方程、梯度下降、岭回归)_第6张图片

    • 最小二乘法之梯度下降
      • 适用场景:大规模数据

      • 公式
        我们以单变量中的w0,w1为例子:
        超详细机器学习-线性回归案例(正规方程、梯度下降、岭回归)_第7张图片
        为学习速率,需要手动指定

        的在这里插入图片描述
        表示方向

        沿着这个函数下降的方向找,最后就能找到山谷的最低点,然后
        更新W值

      • 图例(单变量)
        超详细机器学习-线性回归案例(正规方程、梯度下降、岭回归)_第8张图片

      • API
        超详细机器学习-线性回归案例(正规方程、梯度下降、岭回归)_第9张图片


  • 回归性能评估

    • 均方误差(Mean Squared Error 简称 MSE)
    • 公式
      在这里插入图片描述
      注:^为预测值,¯为真实值
    • API
      超详细机器学习-线性回归案例(正规方程、梯度下降、岭回归)_第10张图片

  • 过拟合和欠拟合

    • 定义

      欠拟合:一个假设在训练数据上不能获得更好的拟合,但是在训练数据外的数据集上也不能很好地拟合数据,此时认为这个假设出现了欠拟合的现象。(模型过于简单)

      过拟合:一个假设在训练数据上能够获得比其他假设更好的拟合, 但是在训练数据外的数据集上却不能很好地拟合数据,此时认为这个假设出现了过拟合的现象。(模型过于复杂)

    • 图例
      超详细机器学习-线性回归案例(正规方程、梯度下降、岭回归)_第11张图片
    • 举例
      • 欠拟合
        超详细机器学习-线性回归案例(正规方程、梯度下降、岭回归)_第12张图片
        经过训练后,知道了天鹅是有翅膀的,天鹅的嘴巴是长长的。简单的认为有这些特征的都是天鹅。因为机器学习到的天鹅特征太少了,导致区分标准太粗糙,不能准确识别出天鹅。

      • 过拟合
        超详细机器学习-线性回归案例(正规方程、梯度下降、岭回归)_第13张图片
        机器通过这些图片来学习天鹅的特征,经过训练后,知道了天鹅是有翅膀的,天鹅的嘴巴是长长的弯曲的,天鹅的脖子是长长的有点曲度,天鹅的整个体型像一个"2"且略大于鸭子。这时候机器已经基本能区别天鹅和其他动物了。然后,很不巧已有的天鹅图片全是白天鹅的,于是机器经过学习后,会认为天鹅的羽毛都是白的,以后看到羽毛是黑的天鹅就会认为那不是天鹅。

    • 解决方法
      • 欠拟合
        • 增加数据的特征数量
      • 过拟合
        • 进行特征选择,消除关联性大的特征(很难做)
        • 交叉验证(让所有数据都有过训练)
        • 正则化

  • L2正则化(解决过拟合问题)

    • 作用:可以使得W的每个元素都很小,都接近于0
    • 优点:越小的参数说明模型越简单,越简单的模型则越不容易产生过拟合现象
    • 带有正则化的线性回归-Ridge
      • API
        超详细机器学习-线性回归案例(正规方程、梯度下降、岭回归)_第14张图片
  • 线性回归案例(美国King County房价预测训练赛)

    • 数据集超详细机器学习-线性回归案例(正规方程、梯度下降、岭回归)_第15张图片

    • 代码

    import pandas as pd
    from sklearn.linear_model import LinearRegression,Ridge,SGDRegressor
    from sklearn.model_selection import train_test_split
    from sklearn.metrics import mean_squared_error
    from sklearn.preprocessing import  StandardScaler
    import numpy as np
    
    def predict_house_price():
        df = pd.read_csv('kc_train.csv',
                         names=['销售日期','销售价格','卧室数','浴室数','房屋面积','停车面积','楼层数'
                               ,'房屋评分','建筑面积','地下室面积','建筑年份','修复年份','纬度','经度'])
    
        # 提取特征值和目标值
        # 将日期转换成具体的月份并删除原销售如期
        df['销售日期'] = pd.to_datetime(df['销售日期'])
        date = pd.DatetimeIndex(df['销售日期'])
        df['销售月份'] = date.month
        df = df.drop(['销售日期'],axis=1)
        df.drop(['修复年份','建筑年份','纬度','经度'],axis=1,inplace=True)
        # 划分特征值和目标值数据
        x = df.iloc[:,1:]
        y = df.iloc[:,0]
        # 分割数据为训练集和测试集
        x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.25)
    
        # 对数据进行特征预处理(这里选择标准化)
        # 这里需要我们实例两个标准化API分别对训练值和测试值进行标准化
        x_std = StandardScaler()
        x_train = x_std.fit_transform(x_train)
        x_test = x_std.transform(x_test)
    
        y_std = StandardScaler()
        # 因为新版本的标准化 传入的数据需要是一个二维数组
        # 因此需要对目标值数据进行转换 先将数据转换成ndarray类型再使用reshape方法修改函数形状
        y_train = y_std.fit_transform(np.array(y_train).reshape(-1,1))
        y_test = y_std.transform(np.array(y_test).reshape(-1,1))
    
        # 以下分别采用正规方程、梯度下降和岭回归分别对数据进行训练和预测看看哪个算法效果更好
        # 通过比较均方误差来进行比较
    
        # 正规方程
        lr = LinearRegression()
        lr.fit(x_train,y_train)
        # 这里为了让数据更加直观,我们需要将标准化后的预测值再次转换正非标准化数据
        y_lr_predict = y_std.inverse_transform(lr.predict(x_test))
        # 查看回归系数即w值
        # 由于数据过长我们只取出前十个进行比较
        print('正规方程预测每个房子的价格为:',y_lr_predict[:10])
        # 计算出正规方程的均方误差
        print('正规方程的均方误差为:',mean_squared_error(y_std.inverse_transform(y_test),y_lr_predict))
    
        # 梯度下降 步骤与正规方程一样 一下不多做注释
        sgd = SGDRegressor()
        sgd.fit(x_train,y_train)
        y_sgd_predict = y_std.inverse_transform(sgd.predict(x_test))
        # print('梯度下降的回归系数为:',sgd.coef_)
        print('梯度下降预测每个房子的价格为:',y_sgd_predict[:10])
        print('梯度下降的均方误差为:',mean_squared_error(y_std.inverse_transform(y_test),y_sgd_predict))
    
        # 岭回归
        rg = Ridge(alpha=1.0)
        rg.fit(x_train,y_train)
    
        y_rg_predict = y_std.inverse_transform(rg.predict(x_test))
        # print('岭回归的回归系数为:', rg.coef_)
        print('岭回归预测每个房子的价格为:', y_rg_predict[:10])
        print('岭回归的均方误差为:', mean_squared_error(y_std.inverse_transform(y_test), y_rg_predict))
    
    
        print('真实房屋价格为:',y_std.inverse_transform(y_test[:10]))
    if __name__ == '__main__':
        predict_house_price()
    

以上是博主在学习Python-机器学习线性回归中的总结
需要数据集的下方评论

你可能感兴趣的:(python,机器学习)