机器学习:线性回归梯度下降预测波士顿房价

版权声明:本文为博主原创文章,欢迎转载,请注明出处 https://blog.csdn.net/mouday/article/details/86619285

线性回归

分类: 目标值离散
回归: 目标值连续

线性回归:寻找一种能预测的趋势

线性关系:
    -二维:直线关系
    -三维:平面

线性关系定义

y=kx+by = kx + b

参数b,偏置项,为了对于单个特征的情况更加通用
参数k,权重

f(x)=w1x1+w2x2+...+wdxd+bf(x) = w_1x_1 + w_2x_2 +...+ w_dx_d + b

线性回归定义:
线性回归通过一个或多个自变量与因变量之间进行建模的回归分析

一元线性回归:变量只有一个
多元线性回归:变量两个或以上

通用公式:
h(w)=w0+w1x1+w2x2+...=wTxh(w) = w_0 + w_1x_1 + w_2x_2 + ... = w^Tx
其中w,x为矩阵
w=(w0w1w2)w = \begin{pmatrix} w_0 \\ w_1 \\ w_2 \end{pmatrix}, x=(1x1x2)x = \begin{pmatrix} 1 \\ x_1 \\ x_2 \end{pmatrix}

属性和权重的组合来预测结果

矩阵

        数组              矩阵
0维      1

1维      [1, 2, 3]

2维      [               必须是二维的
          [1, 2, 3],     满足了特定的运算要求
          [4, 5, 6]      
         ]

3维      [[
           [1, 2, 3],
           [4, 5, 6]
          ],[
           [1, 2, 3],
           [4, 5, 6]
         ]]

数组的运算:加法,乘法
numpy.ndarray

矩阵乘法:
(m行,l列) * (l行,n列) = (m行,n列)

特征值                 权重              目标值
[[1, 2, 3, 4]]   [[1], [2], [3], [4]]   一个样本一个值
(1, 4)              (4, 1)              (1,1)
(100, 4)              (4, 1)              (100,1)

数组相乘

import numpy as np

a = [
	[1, 2, 3, 4], 
	[5, 6, 7, 8], 
	[1, 4, 3, 5]
]
b = [2, 2, 2, 2]

np.multiply(a, b)

Out[5]: 
array([[ 2,  4,  6,  8],
       [10, 12, 14, 16],
       [ 2,  8,  6, 10]])

矩阵相乘

import numpy as np

a = [
	[1, 2, 3, 4], 
	[5, 6, 7, 8], 
	[1, 4, 3, 5]
]
c = [
	[2], 
	[2], 
	[2], 
	[2]
]

np.dot(a, c)
Out[9]: 
array([[20],
       [52],
       [26]])

线性回归

求函数中的参数w,使得损失函数最小

迭代的算法

损失函数(误差大小)

f(a)=(hw(x1)y1)2+(hw(x2)y2)2+...+(hw(xm)ym)2f(a)=(h_w(x_1)-y_1)^2 + (h_w(x_2)-y_2)^2 + ... +(h_w(x_m)-y_m)^2
f(a)=i=1m(hw(xi)yi)2 f(a) = \sum_{i=1}^{m}(h_w(x_i)-y_i)^2
yiy_i 为第i个训练样本的真实值
hw(xi)h_w(x_i) 为第i个训练赝本特征值组合预测函数
又称为最小二乘法

尽量去减少损失,算法的自我学习过程

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

最小二乘法之正规方程

w=(XTX)1XTyw = (X^TX)^{-1}X^Ty

XX 为特征矩阵
yy 为目标值矩阵
缺点:当特征过于复杂,求解速度太慢

XTX^T 转置

X1X^-1 求逆 -> X?=X * ? = 单位矩阵
单位矩阵

[
 [1, 0, 0], 
 [0, 1, 0], 
 [0, 0, 1]
]

最小二乘法之梯度下降

方向
d=bcost(w0+w1x1)bw1d = \frac{bcost(w0+w1x1)}{bw1}

w1:=w1adw1 := -w1 -ad
w0:=w0adw0 := -w0 -ad

a是学习速率

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

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

线性回归API

普通最小二乘线性回归
sklearn.linear_model.LinearRegression
coef_ 回归系数

使用SGD最小线性模型
sklearn.linear_model.SGDRegressor
coef_ 回归系数

scikit-learn
优点:封装好,建立模型简单,预测简单
缺点:算法过程,参数都在算法内部优化

v0.18
v0.19 转换器 estimator 要求数据必须是二维数据
reshape(-1, 1)

TensorFlow
封装高低都有,自己实现线性回归

回归性能评估

均方误差(Mean Squared Error)MSE评价机制
MSE=1mi=1m(yiy)2MSE=\frac{1}{m}\sum_{i=1}^{m}(y^i-y^-)^2

yiy^i预测值
yy^-真实值

梯度下降和正规方程区别

梯度下降 正规方程
需要选择学习率a 不需要
需要多次迭代 一次运算得出
当特征数据量n大时能较好适用 如果特征数量n较大则运算代价较大
适用于各种类型的模型 只适用于线性模型,不适合逻辑回归模型
大规模数据 小规模数据,过拟合

代码示例

# -*- coding: utf-8 -*-

from sklearn.datasets import load_boston
from sklearn.linear_model import LinearRegression, SGDRegressor
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error

# 加载数据
boston = load_boston()

# 训练集,测试集拆分
X_train, X_test, y_train, y_test = train_test_split(
    boston.data, boston.target, test_size=0.25)

# 数据标准化处理
# 特征值 标准化
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.reshape(-1, 1))
y_test = std_y.transform(y_test.reshape(-1, 1))

# 正规方程 线性回归预测
lr = LinearRegression()
lr.fit(X_train, y_train)

print(lr.coef_)

y_lr_predict = std_y.inverse_transform(lr.predict(X_test))
print(y_lr_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)

# 性能评估 均方误差
lr_mse = mean_squared_error(std_y.inverse_transform(y_test), y_lr_predict)
sgd_mse = mean_squared_error(std_y.inverse_transform(y_test), y_sgd_predict)

print(lr_mse)  # 28.97
print(sgd_mse)  # 31.36

没有更多推荐了,返回首页