帮看看这块归一化是否有问题
李敏darling 发布于2021-09-14 浏览:116 回复:6
0
收藏

小白一枚,按飞桨官方“零基础实践深度学习”教程,学习波士顿房价预测。有段做数据归一化处理求每列最大值,最小值,平均值的代码:

--------------------------------------------------------------------------

def load_data():
# 从文件导入数据
datafile = './work/housing.data'
data = np.fromfile(datafile, sep=' ')

# 每条数据包括14项,其中前面13项是影响因素,第14项是相应的房屋价格中位数
feature_names = [ 'CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', \
'DIS', 'RAD', 'TAX', 'PTRATIO', 'B', 'LSTAT', 'MEDV' ]
feature_num = len(feature_names)

# 将原始数据进行Reshape,变成[N, 14]这样的形状
data = data.reshape([data.shape[0] // feature_num, feature_num])

# 将原数据集拆分成训练集和测试集
# 这里使用80%的数据做训练,20%的数据做测试
# 测试集和训练集必须是没有交集的
ratio = 0.8
offset = int(data.shape[0] * ratio)
training_data = data[:offset]

# 计算训练集的最大值,最小值,平均值
maximums, minimums, avgs = training_data.max(axis=0), training_data.min(axis=0), \
training_data.sum(axis=0) / training_data.shape[0]

# 对数据进行归一化处理
for i in range(feature_num):
#print(maximums[i], minimums[i], avgs[i])
data[:, i] = (data[:, i] - minimums[i]) / (maximums[i] - minimums[i])

# 训练集和测试集的划分比例
training_data = data[:offset]
test_data = data[offset:]
return training_data, test_data

---------------------------------------------------------------

这里很是疑惑的地方,求每列最大值,最小值,平均值,用的数据集是训练数据集training_data = data[:offset],为何不是全部的数据集呢?

特意查了下min-max标准化,这种方法有个缺陷就是当有新数据加入时,可能导致max和min的变化,需要重新定义。按官方给的代码取80%训练集求得min-max,那test_data应该会有问题!

求解!

 

收藏
点赞
0
个赞
共6条回复 最后由FutureSI回复于2021-09-16
#7FutureSI回复于2021-09-16

训练时,就是当验证集数据不存在的。否则就看不出过拟合了

0
#6FutureSI回复于2021-09-16

如果用到了训练集以外的数据,甚至验证集、测试集的数据,那就叫数据泄露了。验证集、测试集的意义也就没有了。

0
#5FutureSI回复于2021-09-16

对,训练时就只用训练集(training_data)里那80%的数据,以及这些数据计算出来的参数。

0
#4李敏darling回复于2021-09-15
#2 FutureSI回复
训练时求各种指标当然得用训练集啊,怎么能泄露验证集数据的信息呢?

我最后确认下,代码上写的,是用training_data求得的最大值、最小值去对全部数据集data做归一化,training_data只是取的80%的data,这肯定会有问题吧,data剩余的20%数据可能存在比之前最大值还大或最小值还小的情况,也就是存在归一化处理后,得到的数据不在0~1的范围内。

我理解的有没有问题

0
#3FutureSI回复于2021-09-14

泄露验证集信息给模型,验证集的意义就打折扣了,会被过拟合的

0
#2FutureSI回复于2021-09-14

训练时求各种指标当然得用训练集啊,怎么能泄露验证集数据的信息呢?

0
快速回复
TOP
切换版块