机器学习算法基础6-回归算法-线性回归

目录

 

回归问题的判定?

线性回归

矩阵乘法

损失函数(误差大小)

最小二乘法之正规方程

最小二乘法之梯度下降

线性回归实例

回归性能评估

正规方程和梯度下降的区别

过拟合与欠拟合

欠拟合原因以及解决办法

 

过拟合原因以及解决办法

L2正则化

带有正则化的线性回归-Ridge

岭回归预测房价


回归问题的判定?

回归:目标值是连续的,分类是离散的。

回归应用:房价预测,销售额预测,金融领域贷款额度预测等等。

比如说期末成绩等于下图,找到各个特征按比列结合去预测结果。

 

 

房价

用图表示,房子的面积和价格关系图。

import matplotlib.pyplot as plt
plt.figure(figsize=(10,10))#画板大小10乘10
plt.scatter([60,72,75,80,83],[126,151.2,157.5,168,174.3])#散点图
plt.show()

由此可看想x,y坐标关系成直线关系,如果想预测面积67对应的房子价格,直接可在图上找。

因此,线性回归就是寻找一种能预测的趋势。

线性关系:二维:直线关系,三维:特征,目标值,平面当中,立体图。

线性关系定义:y=kx+b,b:偏置,为了使对于单个特征的情况更通用。k:走向趋势。

多个特征:k1房子面积+k2房子位置+b

线性模型

属性的线性组合来进行预测的函数:

𝑓𝑥=𝑤1𝑥1+𝑤2𝑥2+…+𝑤𝑑𝑥𝑑+𝑏f(x)=w_1 x_1+w_2 x_2+…+w_d x_d+b

  w为权重,b称为偏置项,可以理解为:𝑤0×1w_0×1

线性回归

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

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

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

属性和权重的一种组合来预测结果。矩阵:大多数算法计算基础。

矩阵乘法

np.dot(a,b)#矩阵乘法

 

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

 

回归是迭代的算法,预测时候有差距,知道误差,也不断地去减小误差。

损失函数(误差大小)

如何去求模型当中的W,使得损失最小?

目的是找到最小损失对应的W

最小二乘法之正规方程

 

有几个特征,w的值就是几个。

最小二乘法之梯度下降

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

sklearn.linear_model. LinearRegression
正规方程
sklearn.linear_model. SGDRegressor
梯度下降
 
 
sklearn.linear_model.LinearRegression ()
普通最小二乘线性回归
coef _ :回归系数

 

 

sklearn.linear_model.SGDRegressor ( )
通过使用 SGD 最小化线性模型
coef _ :回归系数
 

 

scikit-learn:优点:封装好,建立模型简单,预测简单、缺点:算法过程看不到,有些参数在API内部优化。

tensortflow:封装高低,自己实现线性回归,学习率等等。

线性回归实例

波士顿房价数据集分析流程

1、波士顿地区房价数据获取

2波士顿地区房价数据分割

3训练与测试数据标准化处理

4使用最简单的线性回归模型LinearRegression

梯度下降估计SGDRegressor对房价进行预测

导入默认数据集

from sklearn.datasets import load_boston

最简单的线性回归模型LinearRegression和梯度下降估计SGDRegressor

from sklearn.linear_model import LinearRegression,SGDRegressor
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: None
        """
    # 获取数据
    lb = load_boston()

    # 分割数据集到训练集和测试集 lb.data特征值 lb.target目标值 test_size:测试集大小
    x_train, x_test, y_train, y_test = train_test_split(lb.data, lb.target, test_size=0.25)

    print(y_train, y_test)

    # 进行标准化处理(?) 目标值处理?
    # 特征值和目标值是都必须进行标准化处理, 实例化两个标准化API
    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.transform(y_test)

   
    # estimator预测
    # 正规方程求解方式预测结果
    lr = LinearRegression()

    lr.fit(x_train, y_train)

    print(lr.coef_)#打印出回归系数(W值)

    # 保存训练好的模型
    # joblib.dump(lr, "./tmp/test.pkl")

    # 预测测试集的房子价格
    y_lr_predict = std_y.inverse_transform(lr.predict(x_test))

    print("正规方程测试集里面每个房子的预测价格:", y_lr_predict)
    return None


if __name__=="__main__":
    mylinear()

回归系数

价格预测(有偏差)

梯度下降进行房价预测

 # 梯度下降去进行房价预测
    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)

    print("梯度下降的均方误差:", mean_squared_error(std_y.inverse_transform(y_test), y_sgd_predict))

    # 岭回归去进行房价预测
    rd = Ridge(alpha=1.0)

    rd.fit(x_train, y_train)

    print(rd.coef_)

    # 预测测试集的房子价格
    y_rd_predict = std_y.inverse_transform(rd.predict(x_test))

    print("梯度下降测试集里面每个房子的预测价格:", y_rd_predict)

    print("梯度下降的均方误差:", mean_squared_error(std_y.inverse_transform(y_test), y_rd_predict))

回归性能评估

sklearn回归评估API

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_lr_predict))
print("梯度下降的均方误差:", mean_squared_error(std_y.inverse_transform(y_test), y_rd_predict))

 

正规方程和梯度下降的区别

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

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

过拟合与欠拟合

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

经过训练后,知道了天鹅是有翅膀的,天鹅的嘴巴是长长的。简单的认为有这些特征的都是天鹅。因为机器学习到的天鹅特征太少了,导致区分标准太粗糙,不能准确识别出天鹅。机器通过这些图片来学习天鹅的特征,经过训练后,知道了天鹅是有翅膀的,天鹅的嘴巴是长长的弯曲的,天鹅的脖子是长长的有点曲度,天鹅的整个体型像一个"2"且略大于鸭子。这时候机器已经基本能区别天鹅和其他动物了。然后,很不巧已有的天鹅图片全是白天鹅的,于是机器经过学习后,会认为天鹅的羽毛都是白的,以后看到羽毛是黑的天鹅就会认为那不是天鹅。

 

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

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

对线性模型进行训练学习会变成复杂模型

 

欠拟合原因以及解决办法

原因:
学习到数据的特征过少
解决办法:
增加数据的特征数量

 

过拟合原因以及解决办法

原因:
原始特征过多,存在一些嘈杂特征, 

模型过于复杂是因为模型尝试去兼顾

各个测试数据点

解决办法:
进行特征选择,消除关联性大的特征 ( 很难做 )
交叉验证 ( 让所有数据都有过训练 )
正则化 ( 了解 )

 

L2正则化

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

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

 

带有正则化的线性回归-Ridge

sklearn.linear_model.Ridge( alpha=1.0 )
具有 l2 正则化的线性最小二乘法
alpha: 正则化力度
coef _: 回归系数

 

观察正则化程度的变化,对结果的影响?

正则化力度从右往左越来越大,模型越简单。

岭回归预测房价

# 岭回归去进行房价预测
    rd = Ridge(alpha=1.0)

    rd.fit(x_train, y_train)

    print(rd.coef_)

    # 预测测试集的房子价格
    y_rd_predict = std_y.inverse_transform(rd.predict(x_test))

    print("梯度下降测试集里面每个房子的预测价格:", y_rd_predict)

    print("梯度下降的均方误差:", mean_squared_error(std_y.inverse_transform(y_test), y_rd_predict))

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值