机器学习——回归算法

目录

回归问题的判定

线性回归

线性模型

线性回归

损失函数(误差大小)

 最小二乘法之正规方程(不做要求)

最小二乘法之梯度下降(理解过程)

sklearn线性回归方程、梯度下降API

正规方程

梯度下降

案例

回归性能评估

 过拟合与欠拟合

欠拟合原因及解决办法

过拟合原因及解决方法

L2正则化

岭回归(Ridge)——带有正则化的线性回归


回归问题的判定

目标值连续——迭代算法

线性回归

寻找一种能预测的趋势

线性关系:二维——直线当中

                  三维——特征、目标值,平面当中

线性模型

试图学得一个通过属性的线性组合来进行预测的函数:

 f(x)=w_1+w_2x_2+...+w_dx_d+b

w为权重,b称为偏置项,可以理解为:w_0\times 1

属性和权重一种组合来预测模型

线性回归

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

一元线性回归:涉及到的变量只有一个

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

通用公式:h(w)=w_0+w_1x_1+w_2x_2+...=w^Tx

其中 w,x为矩阵:

w=\begin{pmatrix} w_0\\w_1 \\ w_2 \end{pmatrix}x=\begin{pmatrix} 1\\ x_1 \\ x_2 \end{pmatrix}

数组 矩阵
0维 5
1维 [1,2,3,4]
2维 [[1,2,3,4]] 必须是2维
3维

[

[[1,2]]

[[3,4]]

]

数组的运算:加法、乘法

矩阵的运算:矩阵乘法

import numpy as np
a = [[1,2,3,4],[5,6,7,8],[2,3,7,9]]
b = [2,3,4,2]
c = np.multiply(a,b) # 每一行对应数相乘,权重相乘
print(c)
d = [[2],[2],[2],[2]]
e = np.dot(a,d) #(3,4)*(4,1)=(3,1)矩阵乘法
print(e)

预测结果与真实值是有一定是有误差的

损失函数(误差大小)

y_i为第i个训练样本的真实值

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

总损失定义:

J(\vartheta )=(h_w(x_1)-y_1)^2)+(h_w(x_2)-y_2)^2)+...+(h_w(x_m)-y_m)^2)=\Sigma_{i=1 }^{m}(h_w(x_i)-y_i)^2

又称最小二乘法

如何去求模型当中的W,使得损失最小?(目的是找到最小损失对应的W

 最小二乘法之正规方程(不做要求)

求解:w=(X^TX)^{-1}X^Ty

X为特征值矩阵,y为目标值矩阵

缺点:当特征过于复杂,求解速度太慢

           对于复杂的算法,不能使用正规方程求解(逻辑回归等)

最小二乘法之梯度下降(理解过程)

我们以单变量中的w0,w1为例子:

w1:=-w1-\alpha \frac{\partial cost(w0+w1x1)}{\partial w1}

w0:=-w0-\alpha \frac{\partial cost(w0+w1x1)}{\partial w1}

α学习速率,需要手动指定,\frac{\partial cost(w0+w1x1)}{\partial w1}表示方向

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

使用:面对训练数据规模十分庞大的任务

 算法的自我学习过程:

算法 策略(损失函数) 优化
线性回归 最小二乘法(误差平方和) 正规方程(不常用)
梯度下降(常用)_学习率

sklearn线性回归方程、梯度下降API

scikit-learn

优点:封装好,建立模型简单,预测简单

缺点:算法的过程,有些参数都在算法API内部优化

tensorflow:封装高低,自己实现线性回归,学习率等参数可以自己手动修改

正规方程

sklearn.linear_model.LinearRegression

普通最小二乘线性回归

coef_:回归系数——w值

线性回归需要做标准化处理

梯度下降

sklearn.linear_model.SGDRegressor

通过使用SGD最小化线性模型

coef_:回归系数——w

案例

from sklearn.datasets import load_boston
from sklearn.linear_model import LinearRegression,SGDRegressor
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
def mylinear():
    """
    线性回归预测房子价格
    :return:
    """
    # 获取数据集
    lb = load_boston()
    # 分割数据集训练集和测试集
    x_train,x_test,y_train,y_test=train_test_split(lb.data,lb.target,test_size=0.25)
    y_train = y_train.reshape(-1,1) #在新版本的线性回归中,传入的数组必须为二维数组
    y_test = y_test.reshape(-1,1)
    # 进行标准化处理,特征值和目标值都需要,分开处理
    std_x = StandardScaler()
    x_train = std_x.fit_transform(x_train)
    x_test = std_x.transform(x_test)
    std_y = StandardScaler()
    y_train = std_y.fit_transform(y_train)
    y_test = std_y.fit_transform(y_test)
    # estimator预测
      #正规方程预测
    lr = LinearRegression()
    lr.fit(x_train,y_train)
    print(lr.coef_)
      # 预测测试集的房子价格
    y_predict = std_y.inverse_transform(lr.predict(x_test))
    print('测试集里每个房子的预测价格:',y_predict)
    # 梯度下降去进行房价预测
    sgd = SGDRegressor()
    sgd.fit(x_train, y_train)
    print(sgd.coef_)
    # 预测测试集的房子价格
    y_sgd_predict = std_y.inverse_transform(sgd.predict(x_test))
    print('测试集里每个房子的预测价格:', y_sgd_predict)
if __name__ == '__main__':
    mylinear()

回归性能评估

(均方误差(Mean Squared Error)MSE) 评价机制:

机器学习——回归算法_第1张图片

 

sklearn.metrics.mean_squared_error(y_true,y_pred)——均方误差回归损失

  • y_true:真实值
  • y_pred:预测值
  • return:浮点数结果

注:真实值,预测值为标准化之前的值

from sklearn.metrics import mean_squared_error
print('梯度下降的均方误差',mean_squared_error(std_y.inverse_transform(y_test),y_sgd_predict))

机器学习——回归算法_第2张图片

特点:线性回归器是最为简单、易用的回归模型。从某种程度上限制了使用,尽管如此,在不知道特征之间关系的前提下,我们仍然使用线性回归器作为大多数系统的首要选择。

小规模数据:LinearRegression(不能解决拟合问题)以及其它

大规模数据:SGDRegressor

 过拟合与欠拟合

问题:训练数据训练的很好啊,误差也不大,为什么在测试集上面有问题呢?

机器学习——回归算法_第3张图片

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

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

模型复杂的原因:特征值与目标值之间的关系不仅仅是线性关系

欠拟合原因及解决办法

原因:

  • 学习到数据的特征过少

解决办法:

  • 增加数据的特征数量(改训练集)

过拟合原因及解决方法

原因:

  • 原始特征过多,存在一些嘈杂特征, 模型过于复杂是因为模型尝试去兼顾各个测试数据点

解决办法:

  • 进行特征选择,消除关联性大的特征(很难做)——过滤式(低方差特征)、嵌入式(正则化、决策树、神经网络)
  • 交叉验证(让所有数据都有过训练)
  • 正则化(了解)

根据交叉验证判断欠拟合和过拟合:

  • 训练集结果表现差——欠拟合
  • 测试集表现不行——过拟合

L2正则化

作用:可以使得W的每个元素都很小,都接近于0

优点:越小的参数说明模型越简单,越简单的模型则越不容易产生过拟合现象

机器学习——回归算法_第4张图片

岭回归(Ridge)——带有正则化的线性回归

sklearn.linear_model.Ridge(alpha=1.0)——具有l2正则化的线性最小二乘法

  • alpha:正则化力度
  • coef_:回归系数

机器学习——回归算法_第5张图片

 

from sklearn.datasets import load_boston
from sklearn.linear_model import Ridge
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import mean_squared_error
def mylinear():
    """
    线性回归预测房子价格
    :return:
    """
    # 获取数据集
    lb = load_boston()
    # 分割数据集训练集和测试集
    x_train,x_test,y_train,y_test=train_test_split(lb.data,lb.target,test_size=0.25)
    y_train = y_train.reshape(-1,1) #在新版本的线性回归中,传入的数组必须为二维数组
    y_test = y_test.reshape(-1,1)
    # 进行标准化处理,特征值和目标值都需要,分开处理
    std_x = StandardScaler()
    x_train = std_x.fit_transform(x_train)
    x_test = std_x.transform(x_test)
    std_y = StandardScaler()
    y_train = std_y.fit_transform(y_train)
    y_test = std_y.fit_transform(y_test)
    # estimator预测
    rg = Ridge(alpha=1.0)
    rg.fit(x_train,y_train)
    # print(rg.coef_)
    y_predict = std_y.inverse_transform(rg.predict(x_test))
    mse = mean_squared_error(std_y.inverse_transform(y_test),y_predict)
    print(mse)
if __name__ == '__main__':
    mylinear()

线性回归 LinearRegressionRidge对比

岭回归:回归得到的回归系数更符合实际,更可靠。另外,能让估计参数的波动范围变小,变的更稳定。在存在病态数据偏多的研究中有较大的实用价值。

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