zoukankan      html  css  js  c++  java
  • 机器学习之线性回归

    回归是统计学中最有力的工具之一。机器学习监督学习算法分为分类算法和回归算法两种,其实就是根据类别标签分布类型为离散型、连续性而定义的。回归算法用于连续型分布预测,针对的是数值型的样本,使用回归,可以在给定输入的时候预测出一个数值,这是对分类方法的提升,因为这样可以预测连续型数据而不仅仅是离散的类别标签。

    回归分析中,只包括一个自变量和一个因变量,且二者的关系可用一条直线近似表示,这种回归分析称为一元线性回归分析。

    如果回归分析中包括两个或两个以上的自变量,且因变量和自变量之间是线性关系,则称为多元线性回归分析。

    因此线性回归可以被定义为:通过一个或者多个自变量与因变量之间进行建模的回归分析。

     比如预测房子价格,可以通过房子的面积一个变量来预测,也可以根据面积和位置来预测。

    从上面两张图种可以看出,无论怎么构建这个回归模型,总会存在误差,也就是说总会有一些点没有落在建立的线或者面上面。真实值与预测值之间的差距就叫做误差大小,也叫做损失函数

    而我们建立回归模型的目的之一,就是尽可能的将这个损失函数的值降到最低,也就是要找到最佳的权重w。

     寻找最佳的权重w,有两种方法:

    第一:正规方程

     第二:梯度下降

     

     -------------------------------------------------------------------------------------------------------------------

    正规方程API:sklearn.linear_model.LinearRegression

    • coef_:是最优的回归系数

    梯度下降API:sklearn.linear_model.SGDRegressor

    •  coef_:是最优的回归系数

    以波士顿房价数据预测为例:

     因为变量都涉及到一个权重,所以需要对每一个变量都要进行数据标准化处理,否则会出现 “大数吃小数” 现象。

    了解一下数据集:

    上代码(正规方程):

     1 from sklearn.datasets import load_boston
     2 from sklearn.linear_model import LinearRegression,SGDRegressor
     3 from sklearn.model_selection import train_test_split
     4 from sklearn.preprocessing import StandardScaler
     5 
     6 def myliner():
     7     '''
     8     线性回归直接预测房子价格
     9     :return: None
    10     '''
    11     #获取数据
    12     lb = load_boston()
    13     print(lb.get('feature_names'))
    14 
    15     #分割数据集到训练集和测试集
    16     x_train, x_test, y_train, y_test = train_test_split(lb.data,lb.target,test_size=0.25)
    17 
    18     #进行标准化处理
    19     #特征值和目标值都必须进行标准化处理,实例化两个标准化API
    20 
    21     # 特征值
    22     std_x = StandardScaler()
    23     x_train = std_x.fit_transform(x_train)
    24     x_test = std_x.transform(x_test)
    25 
    26     #目标值
    27     std_y = StandardScaler()
    28     y_train = std_y.fit_transform(y_train.reshape(-1,1)) #sklearn0.19版本要求目标值必须为二维向量,因此这里需要转换为二维的
    29     y_test = std_y.transform(y_test.reshape(-1,1))
    30 
    31     #estimator预测
    32     lr = LinearRegression()
    33     lr.fit(x_train,y_train)
    34 
    35     print('权重矩阵为:',lr.coef_)
    36 
    37     #预测测试集的房子价格
    38     y_predict = lr.predict(x_test)
    39     print('测试机里面每个房子的预测价格:',y_predict)
    40 
    41     return None
    42 
    43 
    44 if __name__ == '__main__':
    45     myliner()

    结果(正规方程):

    上代码(梯度下降):

     1 from sklearn.datasets import load_boston
     2 from sklearn.linear_model import LinearRegression,SGDRegressor
     3 from sklearn.model_selection import train_test_split
     4 from sklearn.preprocessing import StandardScaler
     5 
     6 def myliner():
     7     '''
     8     线性回归直接预测房子价格
     9     :return: None
    10     '''
    11     #获取数据
    12     lb = load_boston()
    13     print(lb.get('feature_names'))
    14 
    15     #分割数据集到训练集和测试集
    16     x_train, x_test, y_train, y_test = train_test_split(lb.data,lb.target,test_size=0.25)
    17 
    18     #进行标准化处理
    19     #特征值和目标值都必须进行标准化处理,实例化两个标准化API
    20 
    21     # 特征值
    22     std_x = StandardScaler()
    23     x_train = std_x.fit_transform(x_train)
    24     x_test = std_x.transform(x_test)
    25 
    26     #目标值
    27     std_y = StandardScaler()
    28     y_train = std_y.fit_transform(y_train.reshape(-1,1)) #sklearn0.19版本要求目标值必须为二维向量,因此这里需要转换为二维的
    29     y_test = std_y.transform(y_test.reshape(-1,1))
    30 
    31     #梯度下降进行房价预测
    32     sgd = SGDRegressor()
    33 
    34     sgd.fit(x_train,y_train)
    35     print("梯度下降的权重矩阵为:", sgd.coef_)
    36     #预测测试集的房子价格
    37     y_sgd_predict = std_y.inverse_transform(sgd.predict(x_test))
    38     print('测试集里面每个房子的预测价格:',y_sgd_predict)
    39 
    40     return None
    41 
    42 
    43 if __name__ == '__main__':
    44     myliner()

    结果:

    回归性能的评估:

    对于不同的类别预测,我们不能苛刻的要求回归预测的数值结果要严格的与真实值相同。一般情况下,我们希望衡量预测值与真实值之间的差距。因此,可以测评函数进行评价。其中最为直观的评价指标均方误差(Mean Squared Error)MSE,因为这也是线性回归模型所要优化的目标。MSE的计算方法如下:

     API:sklearn.metrics.mean_squared_error

     上代码:

    1 from sklearn.metrics import mean_squared_error
    2 
    3 print('正规方程的均方误差:',mean_squared_error(std_y.inverse_transform(y_test),y_lr_predict))
    4 
    5 print('梯度下降的均方误差:', mean_squared_error(std_y.inverse_transform(y_test), y_sgd_predict))

    结果:

    从结果可以看出,虽然正规方程法的适用性比较小,但是在一些数据集的预测种其准确也有可能优于梯度下降。

    一般来说,梯度下降法更适用于大数据集的预测。二者的组要区别如下:

     

    --------------------成功,肯定是需要一点一滴积累的--------------------
  • 相关阅读:
    例6-5
    例7-1+7-2
    例6-2+6-3
    习题二(3)
    习题二(1)
    课堂作业4
    课堂作业3
    实验三 利用循环计算n个圆柱体体积。
    实验三 编写求圆面积的程序,要求当输入的半径r<=0时,提示输入错误,要求r为浮点型,r的数值是动态的由键盘输入;
    心得3
  • 原文地址:https://www.cnblogs.com/GouQ/p/12103937.html
Copyright © 2011-2022 走看看