数据处理
1.读入数据
绝对地址、相对地址
读取数据
数据形状变换
数据集和训练集的划分
数据归一化
封装函数loaddata
数据处理
数据处理包含五个部分:数据导入、数据形状变换、数据集划分、数据归一化处理和封装load data函数。数据预处理后,才能被模型调用。
1.读入数据
绝对地址、相对地址
如果引用绝对地址需加 r'绝对地址'
path.append(r'E:\Downloads\绝对地址\demo') # 添加路径
相对地址
../ 表示当前文件所在的目录的上一级目录
./ 表示当前文件所在的目录(可以省略)
/ 表示当前站点的根目录(域名映射的硬盘目录)
读取数据
numpy.fromfile
numpy.fromfile(file, dtype=float, count=-1, sep='', offset=0)
从文本或二进制文件中的数据构造一个数组。
读取已知数据类型的二进制数据以及解析简单格式化的文本文件的一种高效方法。使用tofile方法写入的数据可以使用此函数读取。
参数: | file :file 或 str 或 Path 打开文件对象或文件名。 在1.17.0版中进行了更改:pathlib.Path现在接受对象。 dtype :data-type, 可选 返回数组的数据类型。对于二进制文件, 它用于确定文件中各项的大小和字节顺序。 支持大多数内置数字类型,并且可能支持扩展名类型。 1.18.0版中的新功能:复杂dtypes。 count :int 要读取的项目数。-1表示所有项目(即完整文件)。 sep :str 如果文件是文本文件,则项目之间的分隔符。 空(“”)分隔符表示文件应被视为二进制文件。 分隔符中的空格(“”)匹配零个或多个空格字符。 仅由空格组成的分隔符必须至少匹配一个空格。 offset :int 与文件当前位置的偏移量(以字节为单位)。 默认值为0。仅允许用于二进制文件。 1.17.0版中的新功能。 |
参考:Python numpy.fromfile函数方法的使用-CJavaPy
数据形状变换
- numpy.arange(n).reshape(a, b) 依次生成n个自然数,并且以a行b列的数组形式显示
- mat (or array).reshape(c, -1) 必须是矩阵格式或者数组格式,才能使用 .reshape(c, -1) 函数, 表示将此矩阵或者数组重组,以 c行d列的形式表示
- numpy.arange(a,b,c).reshape(m,n) :将array的维度变为m 行 n列。
数据集和训练集的划分
注意划分比例,一般为7/3或 8/2为训练集/测试集
数据归一化
1.训练集和测试集都需要做统一的归一化操作
2.对测试集进行归一化操作时,所用最大、最小、平均值均为训练集上的数据
封装函数loaddata
注意封装后返回值
附完整数据处理代码:
# 数据处理部分,共有五个步骤
# 1.读入数据
# 导入需要用到的package
import numpy as np
import json
# 读入训练数据
datafile = 'D:\PycharmProjects\pytorch学习\波士顿房价预测\housing.data'
data = np.fromfile(datafile, sep=' ')
# print(data) # [6.320e-03 1.800e+01 2.310e+00 ... 3.969e+02 7.880e+00 1.190e+01],共506*14条数据为一行
# 2.数据形状变换
# 读入之后的数据被转化成1维array,其中array的第0-13项是第一条数据,第14-27项是第二条数据,以此类推....
# 这里对原始数据做reshape,变成N x 14的形式
feature_names = [ 'CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE' , 'DIS' , 'RAD', 'TAX', 'PTRATIO', 'B', 'LSTAT', 'MEDV' ]
feature_num = len(feature_names)
# print(feature_num) # feature_num=14
data = data.reshape([data.shape[0] // feature_num, feature_num])
# print(data.shape) # (506, 14)
# print(data[0]) # 对应数据集第一行14个数据
# 3.数据集划分
ratio = 0.8 # 所有数据中作为训练集的比例
offset = int(data.shape[0] * ratio)
training_data = data[:offset] # 切片操作,从第0个到offset-1个
# print(training_data.shape) # (404, 14)
# 4.数据归一化处理
# 计算train数据集的最大值,最小值,平均值
maximums, minimums, avgs = training_data.max(axis=0), training_data.min(axis=0), training_data.sum(axis=0) / training_data.shape[0]
# print(maximums,minimums,avgs) 得到每一列的最大值、最小值、平均值
# 对数据进行归一化处理
for i in range(feature_num):
#print(maximums[i], minimums[i], avgs[i])
data[:, i] = (data[:, i] - minimums[i]) / (maximums[i] - minimums[i]) # 所有的值都在0-1之间了
# 5.封装成load data函数
# 封装成函数的目的是方便以后的模型调用
def load_data():
# 从文件导入数据
datafile = 'D:\PycharmProjects\pytorch学习\波士顿房价预测\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, test_data = load_data()
x = training_data[:, :-1] # 去掉最后一列数据,每组数据变成13个
y = training_data[:, -1:] # 最后一列数据