文章目录
前言
本学习笔记 仅为以防自己忘记了,顺便分享给一起学习的网友们参考。如有不同意见/建议,可以友好讨论。
本学习笔记 所有的代码和数据都可以从 陈强老师的个人主页 上下载
参考书目:陈强.机器学习及Python应用. 北京:高等教育出版社, 2021.
数学原理等 详见陈强老师的 PPT
参考了:网友伪_装的CNN对 MNIST 数据集中的图像进行分类
一、Keras
sklearn只能估计前馈神经网络,而无法估计卷积神经网络、循环神经网络等其他神经网络模型。
Keras 可调用一些低层的深度学习框架, 并以这些深度学习框架作为其“后端引擎” 。
Python Keras 的主要特点
- 用户友好:Keras 提供了简单而直观的 API,适用于深度学习新手和专家。
- 模块化:您可以轻松地构建、训练和评估各种神经网络模型。
- 可扩展性:Keras 支持卷积神经网络(CNN)、循环神经网络(RNN)、自动编码器、生成对抗网络(GAN)等各种类型的神经网络。
- 多后端支持:Keras 可以在不同的深度学习后端上运行,如 TensorFlow、Theano 和 CNTK。
- 社区支持:Keras 拥有庞大的用户社区和丰富的文档,可以轻松获得支持和学习资源。
安装
pip install keras
二、使用Kears 估计回归问题的神经网络
使用Keras自带数据 波士顿房价boston_housing
1. 载入、处理数据
'''回归问题的神经网络模型'''
import numpy as np
import random as rn
import pandas as pd
import tensorflow as tf
import keras
#载入Keras自带数据 波士顿房价
from keras.datasets import boston_housing
# 将数据分割为训练集(80%)和测试集(20%)
from sklearn.model_selection import train_test_split
(X_train, Y_train), (X_test, Y_test) = boston_housing.load_data(
test_split=0.2, seed=113)
#查看 X_train的形状
X_train.shape,
结果输出: ((404, 13), (102, 13))
Y_train[:5], Y_test[:5]
结果输出: (array([15.2, 42.3, 50. , 21.1, 17.7]), array([ 7.2, 18.8, 19. , 27. , 22.2]))
2. 数据预处理:归一化
#将 特征变量归一化
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
scaler.fit(X_train)
X_train_s = scaler.transform(X_train)
X_test_s = scaler.transform(X_test)
结果输出: 0.935
3. 设定一系列随机数种子
#设定一系列随机数种子
import os
import random as rn
def set_my_seed():
os.environ['PYTHONHASHSEED']='0'
np.random.seed(1) # 设置 NumPy 随机种子
rn.seed(12345)
tf.random.set_seed(123) # 设置 TensorFlow 随机种子
set_my_seed()
4. 定义了一个简单的深度神经网络
#定义一个用于构建网络的函数,便于后续调用
from keras.models import Sequential #Sequential是一种线性堆叠模型,适用于大多数简单的神经网络架构。
from keras.layers import Dense #Dense层是全连接层(即每个神经元都与前一层的所有神经元连接),常用于构建深度学习模型。
def build_model():
model = Sequential()
model.add(
Dense(units=256, #包含256个神经元
activation='relu', #激活函数为ReLU(修正线性单元)
input_shape=(X_train_s.shape[1],))) #指定输入数据的形状。X_train_s.shape[1]表示输入特征的数量。
model.add(Dense(units=256, activation='relu'))
model.add(Dense(units=1)) #添加最终的全连接层,这一层只有1个神经元,通常用于回归问题的输出层,表示预测一个连续值。
model.compile( #编译模型,准备进行训练。
optimizer='rmsprop', #RMSProp(Root Mean Square Propagation)是一种自适应学习率优化算法
loss='mse', #设置损失函数为均方误差(MSE)
metrics=['mse']) # 设置评估指标为均方误差(MSE)
return model #返回构建好的模型实例,以便后续调用和使用。
# 创建模型
model = build_model()
#模型概要信息
model.summary()
5. 训练模型
# 训练模型
hist = model.fit(
X_train_s, Y_train,
validation_split=0.25, #25%的训练集作为验证集
epochs=300, #训练300轮
batch_size=16, #小批量梯度下降的每批次容量为16个观测值
shuffle = False) #新一轮迭代时不随机打乱
#查看hist的类型
type(hist)
结果输出: keras.src.callbacks.history.History
hist 变量的类型是 History 对象,属于 Keras 库中的 callbacks 模块。 History 对象中包含了在训练过程中记录的所有指标,包括训练和验证损失(loss)和其他监控指标(如准确率)等。
6. 查看训练结果
Dict = hist.history
Dict.keys()
结果输出: dict_keys([‘loss’, ‘mse’, ‘val_loss’, ‘val_mse’])
val_mse = Dict['val_mse'] #取出验证集的均分误差
min(val_mse)
结果输出: 10.776559829711914
#最小val_mse的位置
index = np.argmin(val_mse)
index
结果输出: 293
#画图展示训练集与测试集的均分误差
import matplotlib.pyplot as plt
import seaborn as sns
plt.plot(Dict['mse'], 'k', label='Train')
plt.plot(Dict['val_mse'], 'b', label='Validation')
plt.axvline(index + 1, linestyle='--', color='k')
plt.xlabel('Epochs')
plt.ylabel('MSE')
plt.title('MSE on Test & Validation')
plt.legend()
#训练集MSE的最小值
train_mse = Dict['mse']
min(train_mse)
结果输出: 2.683964490890503
#最小训练集MSE的位置
index_train = np.argmin(train_mse)
index_train
结果输出: 293
7. 使用最优轮数(index+1)重新估计 此神经网络模型
set_my_seed()
model = build_model()
model.fit(
X_train_s, Y_train,
epochs= index + 1, #index + 1 表示训练的次数取决于变量 index 的值。这个设计允许动态调整训练的次数,可能用于模型调优或逐步训练。
batch_size=16, #每批次包含16个观测值
verbose = 0) #不显示估计过程
#得出测试集的损失函数与均方误差
model.evaluate(X_test_s, Y_test)
结果输出: [11.855478286743164, 11.855478286743164]
evaluate 方法会返回一个列表,其中包含模型在测试集上的损失值以及其他指标的值(如果在模型编译时指定了其他评估指标)。 [loss, metrics]。
8. 预测 & 混淆函数
pred = model.predict(X_test_s)
pred.shape
结果输出: (102, 1)
#将102×1的二维矩阵压缩为向量
pred = np.squeeze(pred)
pred.shape
结果输出: (102,)
#相关系数矩阵---Numpy的corrcoef()
np.corrcoef(Y_test,pred) ** 2
结果输出:
array([[1. , 0.86602909],
[0.86602909, 1. ]])
拟合优度=0.86602909
三、使用Kears 估计 二分类问题的神经网络
对于二分类问题,使用Keras 估计神经网络模型的流程与上述回归问题 类似。
主要差别在于损失函数应设为“binary_crossentropy ” (二值交叉熵)。
使用过滤垃圾邮件的spam数据( 参见【学习笔记】 陈强-机器学习-Python-Ch8 朴素贝叶斯 )
1. 载入、处理数据
'''二分类问题--损失函数为 binary_crossentropy'''
import numpy as np
import pandas as pd
import tensorflow as tf
import keras
#读取CSV文件的路径
csv_path = r'D:\桌面文件\Python\【陈强-机器学习】MLPython-PPT-PDF\MLPython_Data\spam.csv'
spam = pd.read_csv(csv_path)
#定义X与y
X = spam.iloc[:, :-1]
y = spam.iloc[:, -1]
y = pd.get_dummies(y).iloc[:,1]
#全样本随机分20%测试集和80%训练集
from sklearn.model_selection import train_test_split
X_trainval, X_test, y_trainval, y_test = train_test_split