锋哥原创的TensorFlow2 Python深度学习视频教程:

https://www.bilibili.com/video/BV1X5xVz6E4w/

课程介绍



本课程主要讲解基于TensorFlow2的Python深度学习知识,包括深度学习概述,TensorFlow2框架入门知识,以及卷积神经网络(CNN),循环神经网络(RNN),生成对抗网络(GAN),模型保存与加载等。

TensorFlow2 Python深度学习 - TensorFlow2框架入门 - 使用Keras实现线性回归问题 - 房价预测案例

TensorFlow2 Keras主要是解决分类问题的。不过线性问题也同样能做。因为默认没有带线性问题的案例数据集。所以我们把前面scikit-learn自带的房价数据集拿过来。用TensorFlow2 Keras来实现下线性回归问题。

加州房价数据集介绍

  1. 数据集概况

  • 来源:该数据集源自 1990 年的加州人口普查

  • 用途:用于回归模型的练习和测试,目标是预测加州各区域的房屋中位价

  • 样本数量20,640 条记录。这比波士顿数据集(506条)大得多,能更好地体现机器学习算法的效果。

  • 特征数量8 个数值型特征。这些特征涵盖了人口、地理位置和经济指标。

  • 目标变量MedHouseVal - 街区群体的房屋中位价,单位是十万美元

注意:目标变量是分组中位价。这意味着一个街区的所有房屋都被分配了该街区的 median house value。对于任何位于该街区的房屋,目标值都是相同的。

  1. 特征详细说明

这8个特征提供了预测房价的不同维度信息:

  1. MedInc:街区居民的收入中位数。

  2. HouseAge:街区内房屋年龄中位数。

  3. AveRooms:平均房间数(每户)。

  4. AveBedrms:平均卧室数(每户)。

  5. Population:街区人口数。

  6. AveOccup:平均家庭成员数(每户)。

  7. Latitude:街区的纬度。

  8. Longitude:街区的经度。

    3.目标变量:

  • MedHouseVal:房屋中位价(单位:十万美元)。

我们先安装下scikit-learn:

pip install scikit-learn -i http://mirrors.aliyun.com/pypi/simple/  --trusted-host mirrors.aliyun.com

我们回顾下scikit-learn机器学习的实现,线性回归-正规方程使用 LinearRegression。

from sklearn.datasets import fetch_california_housing
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,加载数据
california = fetch_california_housing()
print(california.data, california.data.shape)
print(california.target)
print(california.feature_names)
​
# 2,数据预处理
X_train, X_test, y_train, y_test = train_test_split(california.data, california.target, test_size=0.2, random_state=20)
scaler = StandardScaler()  # 数据标准化:消除不同特征量纲的影响
X_train_scaled = scaler.fit_transform(X_train)  # fit计算生成模型,transform通过模型转换数据
X_test_scaled = scaler.transform(X_test)  # # 使用训练集的参数转换测试集
​
# 3,创建和训练线性回归模型(正规方程)
lr_model = LinearRegression()  # 创建分类器实例
lr_model.fit(X_train_scaled, y_train)  # 训练模型
print('权重系数:', lr_model.coef_)
print('偏置值:', lr_model.intercept_)  # 在线性回归模型中,•偏置(截距)•(bias)是模型参数之一,表示当所有特征值为0时,目标变量的期望值。
​
# 4,模型评估
y_predict = lr_model.predict(X_test_scaled)
print('预测值:', y_predict)
mse = mean_squared_error(y_test, y_predict)
print('正规方程-均方误差:', mse)

我们来用下Tensorflow2 keras多层神经网络实现下:

from sklearn.datasets import fetch_california_housing
​
import tensorflow as tf
from keras import Input, layers
​
# 1,加载数据
california = fetch_california_housing()
print(california.data, california.data.shape)
print(california.target)
print(california.feature_names)
X_train = california.data
y_train = california.target
​
# 2,构建多层神经网络回归模型
model = tf.keras.models.Sequential([
    Input(shape=(X_train.shape[1],)),
    layers.Dense(64, activation='relu'),
    layers.Dense(32, activation='relu'),
    layers.Dense(16, activation='relu'),
    layers.Dense(1)  # 输出层,线性激活
])
​
# 3,模型训练
model.compile(optimizer='adam', loss='mse', metrics=['mse'])
​
# 4,模型训练
history = model.fit(X_train,  # 输入数据(特征)
                    y_train,  # 目标数据(标签)
                    epochs=100,  # 训练轮数
                    batch_size=32,  # 每个训练批次的样本数量
                    validation_split=0.2,  # 从训练数据中划分验证集的比例
                    verbose=1  # 日志显示模式(0=不显示,1=进度条,2=简洁显示)
                    )
​
print(f"最终MSE: {history.history['mse'][-1]:.4f}")

我们比较发现,用Keras多层神经网络,可以不用数据预处理,model.fit()方法自带可以进行训练和验证比例数据划分训练,同时还自带日志显示,最终比较,用神经网络最终训练的模型,性能还高于scikit-learn线性回归模型。神经网络唯一缺点就是费算力,费机器。

Sequential.fit() 是 TensorFlow/Keras 中最常用的训练方法之一。以下是其主要参数的简单介绍:

model.fit(
    x=None,
    y=None,
    batch_size=None,
    epochs=1,
    verbose='auto',
    callbacks=None,
    validation_split=0.0,
    validation_data=None,
    shuffle=True,
    class_weight=None,
    sample_weight=None,
    initial_epoch=0,
    steps_per_epoch=None,
    validation_steps=None,
    validation_batch_size=None,
    validation_freq=1
)

核心参数:

数据相关参数

  • x: 输入数据(特征)

  • y: 目标数据(标签)

  • batch_size: 每个训练批次的样本数量

  • validation_data: 验证数据集(元组 (x_val, y_val))

  • validation_split: 从训练数据中划分验证集的比例

训练过程参数

  • epochs: 训练轮数

  • verbose: 日志显示模式(0=不显示,1=进度条,2=简洁显示)

  • shuffle: 是否在每个epoch前打乱训练数据

  • initial_epoch: 开始训练的epoch序号

验证相关参数

  • validation_freq: 验证频率(每N个epoch验证一次)

  • validation_steps: 每个验证epoch的批次数量

回调与控制

  • callbacks: 回调函数列表(用于早停、模型保存等)

  • steps_per_epoch: 每个训练epoch的批次数量

  • class_weight: 类别权重字典(用于不平衡数据集)

这些参数控制了模型训练的基本行为,包括数据加载、训练周期、验证策略和训练过程监控等关键方面。

参数计算公式:

参数数量 = 输入维度 × 输出维度 + 输出维度

输入Input维度8

第一层Dense(64)

  • 参数 = 64× 8+ 64 = 576

第二层Dense(32)

  • 参数 = 64× 32+ 32= 2080

第三层Dense(16)

  • 参数 = 32× 16+ 16= 528

输出层Dense(1)

  • 参数 = 16× 1 + 1 = 17

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐