用飞桨构建波士顿房价预测模型的示范代码有Bug?
收藏
在 https://aistudio.baidu.com/aistudio/projectdetail/1579715 上,是使用飞桨构建波士顿房价预测模型的载入数据的示范代码(代码如下)。
详细阅读后,有几个疑问请大家释疑:
1、代码中有两行 “training_data = data[:offset]”,分别在归一化处理前和归一化处理后,作用都是从整体数据集中切片出悬链数据集。为什么要切片两次?在归一化处理后,切片出训练集和测试集,不是更好吗?归一化处理之前切片出来有什么用?
2、代码中,因为归一化处理之前求的最大值、最小值和平均值,是切片出来的训练集 training_data 的最大、最小和平均值。可是在归一化处理时,却用这几个值对整体数据集 data 进行归一化处理。按理说应该是使用整体数据集 data 的最大、最小和平均值来对整体数据集 data 进行归一化处理才对呀?因为局部数据(训练集数据)的最大、最小和平均值,不一定就是整体数据data的最大、最小和平均值。
3、代码中为什么要对 最大、最小和平均值 声明为 global ?按照代码的注释是为了后面与测试用于归一化处理。可是如上所述,这些最大、最小和平均值是训练集的最大、最小和平均值,与预测的数据集有什么关系?
def load_data():
# 从文件导入数据
datafile = './work/housing.data'
data = np.fromfile(datafile, sep=' ', dtype=np.float32)
# 每条数据包括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]
# 计算train数据集的最大值,最小值,平均值
maximums, minimums, avgs = training_data.max(axis=0), training_data.min(axis=0), \
training_data.sum(axis=0) / training_data.shape[0]
# 记录数据的归一化参数,在预测时对数据做归一化
global max_values
global min_values
global avg_values
max_values = maximums
min_values = minimums
avg_values = avgs
# 对数据进行归一化处理
for i in range(feature_num):
data[:, i] = (data[:, i] - avgs[i]) / (maximums[i] - minimums[i])
# 训练集和测试集的划分比例
training_data = data[:offset]
test_data = data[offset:]
return training_data, test_data
0
收藏
请登录后评论
hi,请问你看的是哪个教程呢?你上面的这个链接:https://aistudio.baidu.com/aistudio/projectdetail/1579715 我看是非公开项目。我们打不开呢。以及您说确实有道理,我也感觉这个代码写的有问题。
推荐您看飞桨官方的波士顿房价预测教程呢:https://www.paddlepaddle.org.cn/documentation/docs/zh/tutorial/quick_start/linear_regression/linear_regression.html
也刚好看到这个教程,代码确实有重复的地方,但是不影响最后结果。
另外,在做归一化的时候,参数计算使用的都是依赖训练集数据,测试集数据在预测之前是不能使用的。