2.4 联合分布图绘制
??在开始深度学习前,我们可以分别对输入数据的不同特征与因变量的关系加以查看。绘制联合分布图就是一种比较好的查看多个变量之间关系的方法。我们用seaborn
来实现这一过程。seaborn
是一个基于matplotlib
的Python
数据可视化库,使得我们可以通过较为简单的操作,绘制出动人的图片。代码如下:
# Draw the joint distribution image.
def JointDistribution(Factors):
plt.figure(1)
sns.pairplot(TrainData[Factors],kind='reg',diag_kind='kde')
sns.set(font_scale=2.0)
DataDistribution=TrainData.describe().transpose()
# Draw the joint distribution image.
JointFactor=['Lrad07','Prec06','SIF161','Shum06','Srad07','Srad08','Srad10','Temp06','Yield']
JointDistribution(JointFactor)
??其中,JointFactor
为需要绘制联合分布图的特征名称,JointDistribution
函数中的kind
表示联合分布图中非对角线图的类型,可选'reg'
与'scatter'
、'kde'
、'hist'
,'reg'
代表在图片中加入一条拟合直线,'scatter'
就是不加入这条直线,'kde'
是等高线的形式,'hist'
就是类似于栅格地图的形式;diag_kind
表示联合分布图中对角线图的类型,可选'hist'
与'kde'
,'hist'
代表直方图,'kde'
代表直方图曲线化。font_scale
是图中的字体大小。JointDistribution
函数中最后一句是用来展示TrainData
中每一项特征数据的统计信息,包括最大值、最小值、平均值、分位数等。
??图片绘制的示例如下:
??要注意,绘制联合分布图比较慢,建议大家不要选取太多的变量,否则程序会卡在这里比较长的时间。
2.5 因变量分离与数据标准化
??因变量分离我们就不再多解释啦;接下来,我们要知道,对于机器学习、深度学习而言,数据标准化是十分重要的——用官网所举的一个例子:不同的特征在神经网络中会乘以相同的权重weight,因此输入数据的尺度(即数据不同特征之间的大小关系)将会影响到输出数据与梯度的尺度;因此,数据标准化可以使得模型更加稳定。
??在这里,首先说明数据标准化与归一化的区别。
??标准化即将训练集中某列的值缩放成均值为0
,方差为1
的状态;而归一化是将训练集中某列的值缩放到0
和1
之间。而在机器学习中,标准化较之归一化通常具有更高的使用频率,且标准化后的数据在神经网络训练时,其收敛将会更快。
??最后,一定要记得——标准化时只需要对训练集数据加以处理,不要把测试集Test
的数据引入了!因为标准化只需要对训练数据加以处理,引入测试集反而会影响标准化的作用。
# Separate independent and dependent variables.
TrainX=TrainData.copy(deep=True)
TestX=TestData.copy(deep=True)
TrainY=TrainX.pop('Yield')
TestY=TestX.pop('Yield')
# Standardization data.
Normalizer=preprocessing.Normalization()
Normalizer.adapt(np.array(TrainX))
??在这里,我们直接运用preprocessing.Normalization()
建立一个预处理层,其具有数据标准化的功能;随后,通过.adapt()
函数将需要标准化的数据(即训练集的自变量)放入这一层,便可以实现数据的标准化操作。
2.6 原有模型删除
??我们的程序每执行一次,便会在指定路径中保存当前运行的模型。为保证下一次模型保存时不受上一次模型运行结果干扰,我们可以将模型文件夹内的全部文件删除。
# Delete the model result from the last run.
def DeleteOldModel(ModelPath):
AllFileName=os.listdir(ModelPath)
for i in AllFileName:
NewPath=os.path.join(ModelPath,i)
if os.path.isdir(NewPath):
DeleteOldModel(NewPath)
else:
os.remove(NewPath)
# Delete the model result from the last run.
DeleteOldModel(ModelPath)
??这一部分的代码在文章Python TensorFlow深度学习回归代码:DNNRegressor有详细的讲解,这里就不再重复。
2.7 最优Epoch保存与读取
??在我们训练模型的过程中,会让模型运行几百个Epoch
(一个Epoch
即全部训练集数据样本均进入模型训练一次);而由于每一次的Epoch
所得到的精度都不一样,那么我们自然需要挑出几百个Epoch
中最优秀的那一个Epoch
。
# Find and save optimal epoch.
def CheckPoint(Name):
Checkpoint=ModelCheckpoint(Name,
monitor=CheckPointMethod,
verbose=1,
save_best_only=True,
mode='auto')
CallBackList=[Checkpoint]
return CallBackList
# Find and save optimal epochs.
CallBack=CheckPoint(CheckPointName)
??其中,Name
就是保存Epoch
的路径与文件名命名方法;monitor
是我们挑选最优Epoch
的依据,在这里我们用验证集数据对应的误差来判断这个Epoch
是不是我们想要的;verbose
用来设置输出日志的内容,我们用1
就好;save_best_only
用来确定我们是否只保存被认定为最优的Epoch
;mode
用以判断我们的monitor
是越大越好还是越小越好,前面提到了我们的monitor
是验证集数据对应的误差,那么肯定是误差越小越好,所以这里可以用'auto'
或'min'
,其中'auto'
是模型自己根据用户选择的monitor
方法来判断越大越好还是越小越好。
??找到最优Epoch
后,将其传递给CallBack
。需要注意的是,这里的最优Epoch
是多个Epoch
——因为每一次Epoch
只要获得了当前模型所遇到的最优解,它就会保存;下一次再遇见一个更好的解时,同样保存,且不覆盖上一次的Epoch
。可以这么理解,假如一共有三次Epoch
,所得到的误差分别为5
,7
,4
;那么我们保存的Epoch
就是第一次和第三次。
2.8 模型构建
??Kera