51. TensorFlow 加州房价预测#

51.1. 介绍#

前面已经了解 TensorFlow 的工作机制,以及一些常用组件。接下来,我们尝试用 TensorFlow 去实现一个线性回归。你可能会认为线性回归非常基础,不过这里的目的主要是熟悉 TensorFlow 搭建模型的整个流程和涉及到的重要概念。

51.2. 知识点#

  • 最小二乘法线性回归

  • TensorFlow 基本运算

我们尝试对加州房价进行预测,这里利用 TensorFlow 搭建了一个线性回归模型的数据流图,并且利用最小二乘法计算出相应的权值 weight(代码里用 theta 表示)。

首先,挑战需要加载示例数据集。这里使用 scikit-learn 里自带的数据集。其中,housing.data 表示特征数据,housing.target 是目标数据。

from sklearn.datasets import fetch_california_housing

housing = fetch_california_housing()  # 加州房价数据集

housing.data.shape, housing.target.shape
((20640, 8), (20640,))
housing.data[0], housing.target[0]  # 预览第一个样本特征及目标值
(array([   8.3252    ,   41.        ,    6.98412698,    1.02380952,
         322.        ,    2.55555556,   37.88      , -122.23      ]),
 4.526)

可以看到,数据一共有 20640 条,包含 8 个特征。目标值为房屋价格,所以是典型的回归问题。所以,下面我们将使用最小二乘法矩阵推导来计算该多元线性回归问题最终拟合系数。

首先,我们补充线性回归矩阵推导的公式:

\[ y = WX \]
\[ W=(X^TX)^{-1}X^Ty \]

根据先前的经验,我们需要对特征数据补充一列全为 1 的值,该列在参与计算时作为截距项系数。另外,需要将目标值转换为与之对应的 2 维数组,方便后续计算。

\[\begin{split} X = \begin{bmatrix} x_{11}&\cdots&x_{18}\\ x_{21}&\cdots&x_{28}\\ \cdots&\cdots&\cdots\\ x_{n1}&\cdots&x_{n8}\\ \end{bmatrix} \rightarrow \begin{bmatrix} x_{11}&\cdots&x_{18}&1\\ x_{21}&\cdots&x_{28}&1\\ \cdots&\cdots&\cdots&1\\ x_{n1}&\cdots&x_{n8}&1\\ \end{bmatrix} \end{split}\]
\[ y = \left [ y_1, y_2, \cdots, y_n \right ] \rightarrow \left [ \left [y_1 \right ], \left [y_2 \right ], \left [\cdots \right ], \left [y_n \right ] \right ] \]

Exercise 51.1

挑战:对特征矩阵执行补 1 操作,并将目标数组转换为 2 维 NumPy 数组。

import numpy as np

## 代码开始 ### (≈2 行代码)
X = None
y = None
## 代码结束 ###

运行测试

X.shape, y.shape

期望输出

((20640, 9), (20640, 1))

接下来,我们使用 TensorFlow 提供的数学计算方法,建立会话并得到最终拟合系数。

Exercise 51.2

挑战:使用 TensorFlow 提供的方法完成线性回归拟合系数计算。

规定:特征和目标值需转换为张量,且只能使用 TensorFlow 2 提供的运算方法完成计算。推荐利用搜索功能在官方文档中找到你需要的数学计算方法。

import tensorflow as tf

## 代码开始 ### (≈6 行代码)
W = None
## 代码结束 ###

运行测试

W

期望输出

tf.Tensor: id=1, shape=(9, 1), dtype=float64, numpy=
array([[ 4.36693293e-01],
       [ 9.43577803e-03],
       [-1.07322041e-01],
       [ 6.45065694e-01],
       [-3.97638942e-06],
       [-3.78654265e-03],
       [-4.21314378e-01],
       [-4.34513755e-01],
       [-3.69419202e+01]])

如果使用 scikit-learn 提供的线性回归方法建立模型,你会发现结果是完全一致的。

from sklearn.linear_model import LinearRegression

model = LinearRegression()
model.fit(housing.data, housing.target)
model.coef_, model.intercept_

相关链接