线性回归(Linear regression)是利用回归方程(函数)对一个或多个自变量(特征值)和因变量(目标值)之间关系进行建模的一种分析方式。

通用公式:

基于线性回归对kaggle数据集的房价预测实验报告 线性回归预测房价模型_线性回归 波士顿房价预测


应用场景:

1.房价预测

2.销售额度预测

3.贷款额度预测

一.案例背景介绍

基于线性回归对kaggle数据集的房价预测实验报告 线性回归预测房价模型_波士顿房价_02

# -*- coding: utf-8 -*-
# @Time    : 2019/11/12 11:46
# @Author  :

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


# 线性回归:正规方程
# 1.获取数据
data = load_boston()

# 2.数据集划分
x_train, x_test, y_train, y_test = train_test_split(data.data, data.target, random_state=22)

# 3.特征工程-标准化
transfer = StandardScaler()
x_train = transfer.fit_transform(x_train)
x_test = transfer.fit_transform(x_test)

# 4.机器学习-线性回归(正规方程)
estimator = LinearRegression()
estimator.fit(x_train, y_train)

# 5.模型评估
# 5.1 获取系数等值
y_predict = estimator.predict(x_test)
print("预测值为: ", y_predict)
print("模型中的系数为: ", estimator.coef_)
print("模型中的偏置为: ", estimator.intercept_)

# 5.2 评价
# 回归性能评估:均方误差(Mean Squared Error)MSE 评价机制
error = mean_squared_error(y_test, y_predict)
print("误差为: ", error)

二.知识点汇总

1.1矩阵

矩阵:矩形的数组,即二维数组.其中向量标量都是矩阵的特例

基于线性回归对kaggle数据集的房价预测实验报告 线性回归预测房价模型_波士顿房价预测_03


Aij 指第 i 行,第 j 列的元素。

1.2 矩阵乘法

设A为 m x p的矩阵,B为 p x n 的矩阵,那么称 的矩阵C为矩阵A与B的乘积,记作 C=AB ,其中矩阵C中的第 i 行第 j 列元素可以表示为

基于线性回归对kaggle数据集的房价预测实验报告 线性回归预测房价模型_波士顿房价_04


基于线性回归对kaggle数据集的房价预测实验报告 线性回归预测房价模型_机器学习_05


矩阵乘法遵循准则:

(M行, N列)*(N行, L列) = (M行, L列)

1.2.1矩阵向量乘法

m×n 的矩阵乘以 n×1 的向量,得到的是 m×1 的向量

基于线性回归对kaggle数据集的房价预测实验报告 线性回归预测房价模型_机器学习_06

1.3逆矩阵

矩阵A*矩阵B = E单位矩阵
那么A和B就互为逆矩阵

2.损失函数

真实结果与我们预测的结果之间可能存在一定的误差

基于线性回归对kaggle数据集的房价预测实验报告 线性回归预测房价模型_机器学习_07

3.1优化算法

线性回归经常使用的两种优化算法
正规方程
梯度下降法

3.2正规方程

基于线性回归对kaggle数据集的房价预测实验报告 线性回归预测房价模型_机器学习_08


理解:X为特征值矩阵,XT为逆矩阵,y为目标值矩阵。直接求到最好的结果

缺点:当特征过多过复杂时,求解速度太慢并且得不到结果

3.3梯度下降

基于线性回归对kaggle数据集的房价预测实验报告 线性回归预测房价模型_波士顿房价_09


在单变量的函数中,梯度其实就是函数的微分,代表着函数在某个给定点的切线的斜率;

在多变量函数中,梯度是一个向量,向量有方向,梯度的方向就指出了函数在给定点的上升最快的方向;

# -*- coding: utf-8 -*-
# @Time    : 2019/11/13 05:46
# @Author  :

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

# 线性回归:梯度下降法
# 1.获取数据
data = load_boston()

# 2.数据集划分
x_train, x_test, y_train, y_test = train_test_split(data.data, data.target, random_state=22)

# 3.特征工程-标准化
transfer = StandardScaler()
x_train = transfer.fit_transform(x_train)
x_test = transfer.fit_transform(x_test)

# 4.机器学习-线性回归(特征方程)
estimator = SGDRegressor(max_iter=1000)
estimator.fit(x_train, y_train)

# 5.模型评估
# 5.1 获取系数等值
y_predict = estimator.predict(x_test)
print("预测值为:\n", y_predict)
print("模型中的系数为:\n", estimator.coef_)
print("模型中的偏置为:\n", estimator.intercept_)

# 5.2 评价
# 均方误差
error = mean_squared_error(y_test, y_predict)
print("误差为:\n", error)
4. 欠拟合和过拟合

过拟合:一个假设在训练数据上能够获得比其他假设更好的拟合, 但是在测试数据集上却不能很好地拟合数据.
欠拟合:一个假设在训练数据上不能获得更好的拟合,并且在测试数据集上也不能很好地拟合数据.

5.1正则化

在学习的时候,数据提供的特征有些影响模型复杂度或者这个特征的数据点异常较多,所以算法在学习的时候尽量减少这个特征的影响(甚至删除某个特征的影响)

5.2正则化线性模型
# -*- coding: utf-8 -*-
# @Time    : 2019/11/13 06:26
# @Author  :

from sklearn.datasets import load_boston
from sklearn.linear_model import Ridge
from sklearn.metrics import mean_squared_error
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler

# 线性回归:岭回归

# 1.获取数据
data = load_boston()

# 2.数据集划分
x_train, x_test, y_train, y_test = train_test_split(data.data, data.target, random_state=22)

# 3.特征工程-标准化
transfer = StandardScaler()
x_train = transfer.fit_transform(x_train)
x_test = transfer.fit_transform(x_test)

# 4.机器学习-线性回归(岭回归)
estimator = Ridge(alpha=1)
# estimator = RidgeCV(alphas=(0.1, 1, 10))
estimator.fit(x_train, y_train)

# 5.模型评估
# 5.1 获取系数等值
y_predict = estimator.predict(x_test)
print("预测值为:\n", y_predict)
print("模型中的系数为:\n", estimator.coef_)
print("模型中的偏置为:\n", estimator.intercept_)

# 5.2 评价
# 均方误差
error = mean_squared_error(y_test, y_predict)
print("误差为:\n", error)
6.模型的保存和加载
# -*- coding: utf-8 -*-
# @Time    : 2019/11/13 06:29
# @Author  :

from sklearn.datasets import load_boston
from sklearn.externals import joblib
from sklearn.metrics import mean_squared_error
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler


# 模型保存和加载

# 1.获取数据
data = load_boston()

# 2.数据集划分
x_train, x_test, y_train, y_test = train_test_split(data.data, data.target, random_state=22)

# 3.特征工程-标准化
transfer = StandardScaler()
x_train = transfer.fit_transform(x_train)
x_test = transfer.fit_transform(x_test)

# 4.机器学习-线性回归(岭回归)
# # 4.1 模型训练
# estimator = Ridge(alpha=1)
# estimator.fit(x_train, y_train)
#
# # 4.2 模型保存
# joblib.dump(estimator, "./data/test.pkl")

# 4.3 模型加载
estimator = joblib.load("./data/test.pkl")

# 5.模型评估
# 5.1 获取系数等值
y_predict = estimator.predict(x_test)
print("预测值为:\n", y_predict)
print("模型中的系数为:\n", estimator.coef_)
print("模型中的偏置为:\n", estimator.intercept_)

# 5.2 评价
# 均方误差
error = mean_squared_error(y_test, y_predict)
print("误差为:\n", error)