本人CSDN博客专栏:https://blog.csdn.net/yty_7
Github地址:https://github.com/yot777/
数据集文件
在前几课学习中,我们都是直接用S = np.array()的方式手工录入数据集。
在数据量小的情况下勉强可行,但是数据量一旦增大就很难这样手工录入。
我们可以使用在进阶讲座中讲过的Python读取数据集文件的方法来实现数据集的加载。
上一节我们使用的数据集如下:
样本数据 | 特征x1 | 特征x2 | 标签 |
1 | 1 | 2 | 1 |
2 | 4 | 5 | 0 |
3 | 2 | 1 | 1 |
4 | 4 | 2 | 1 |
5 | 6 | 1 | 0 |
6 | 3 | 3 | 1 |
7 | 5 | 2 | 0 |
8 | 4 | 5 | 0 |
9 | 2 | 7 | 0 |
10 | 2 | 6 | 1 |
一般来说,数据集文件不需要标题,每一行的序号也是不需要的,只需包含所有的特征列和标签列就可以。
多个特征之间,特征和列之间一般用Tab键或空格或逗号来分隔。
因此我们可以把数据集改写成以下的test.txt数据集文件:
1 2 1
4 5 0
2 1 1
4 2 1
6 1 0
3 3 1
5 2 0
4 5 0
2 7 0
2 6 1
数据集文件的加载
我们可以创建一个loadDataSet()函数来加载数据集文件。
这个函数需要做以下几个事情:
(1)打开数据集文件(请注意Python代码和数据集文件需要在同一目录下,如果不在,需要指定数据集文件的完整路径)
(2)遍历文件的所有行,i从第1行开始到最后1行
(3)去掉数据集文件每一行末尾的回车换行符
(4)根据数据集文件每一行元素之间的分隔符,把每一行分割成若干个元素
(5)将第i行除了最后一个元素之外的元素,添加到特征矩阵的第i行
(6)将第i行的最后一个元素,添加到标签向量的第i个元素(也是第i行)
(7)关闭文件
代码如下:
def loadDataSet(fileName):
#创建空特征矩阵
featureMat = []
#创建空标签向量
labelMat = []
#打开文件
fr = open(fileName)
#按行遍历读取文件
for line in fr.readlines():
#每一行先去掉回车换行符,再以Tab键为元素之间的分隔符号,把每一行分割成若干个元素
lineArr = line.strip().split('\t')
print("当前行是:", lineArr)
#向特征矩阵featureMat添加元素,即lineArr当前行的第0个元素和第1个元素
#特征矩阵featureMat实际上是二维列表,注意添加元素的方法和一维列表稍有不同
featureMat.append([lineArr[0], lineArr[1]])
print("当前的特征矩阵featureMat是:", featureMat)
#向标签向量labelMat添加元素,即lineArr当前行的最后1个元素
labelMat.append(lineArr[-1])
print("当前的标签向量labelMat是:", labelMat)
#当前行的元素已添加到特征矩阵featureMat和标签向量labelMat,进入下一行继续
#所有行都读取完毕后关闭文件
fr.close()
#整个loadDataSet()函数返回特征矩阵featureMat和标签向量labelMat
return featureMat, labelMat
if __name__ == '__main__':
#调用loadDataSet()函数
X, y = loadDataSet('test.txt')
print("最终得到的特征矩阵X是:", X)
print("最终得到的标签向量y是:", y)
请仔细研究以上代码,这是读取文件函数的一个标准模块。
另外,为了便于大家理解,我在代码中添加了很多print()函数来输出结果,在实际编程中这些print()都是完全不需要的。
运行结果如下:
当前行是: ['1', '2', '1']
当前的特征矩阵featureMat是: [['1', '2']]
当前的标签向量labelMat是: ['1']
当前行是: ['4', '5', '0']
当前的特征矩阵featureMat是: [['1', '2'], ['4', '5']]
当前的标签向量labelMat是: ['1', '0']
当前行是: ['2', '1', '1']
当前的特征矩阵featureMat是: [['1', '2'], ['4', '5'], ['2', '1']]
当前的标签向量labelMat是: ['1', '0', '1']
当前行是: ['4', '2', '1']
当前的特征矩阵featureMat是: [['1', '2'], ['4', '5'], ['2', '1'], ['4', '2']]
当前的标签向量labelMat是: ['1', '0', '1', '1']
当前行是: ['6', '1', '0']
当前的特征矩阵featureMat是: [['1', '2'], ['4', '5'], ['2', '1'], ['4', '2'], ['6', '1']]
当前的标签向量labelMat是: ['1', '0', '1', '1', '0']
当前行是: ['3', '3', '1']
当前的特征矩阵featureMat是: [['1', '2'], ['4', '5'], ['2', '1'], ['4', '2'], ['6', '1'], ['3', '3']]
当前的标签向量labelMat是: ['1', '0', '1', '1', '0', '1']
当前行是: ['5', '2', '0']
当前的特征矩阵featureMat是: [['1', '2'], ['4', '5'], ['2', '1'], ['4', '2'], ['6', '1'], ['3', '3'], ['5', '2']]
当前的标签向量labelMat是: ['1', '0', '1', '1', '0', '1', '0']
当前行是: ['4', '5', '0']
当前的特征矩阵featureMat是: [['1', '2'], ['4', '5'], ['2', '1'], ['4', '2'], ['6', '1'], ['3', '3'], ['5', '2'], ['4', '5']]
当前的标签向量labelMat是: ['1', '0', '1', '1', '0', '1', '0', '0']
当前行是: ['2', '7', '0']
当前的特征矩阵featureMat是: [['1', '2'], ['4', '5'], ['2', '1'], ['4', '2'], ['6', '1'], ['3', '3'], ['5', '2'], ['4', '5'], ['2', '7']]
当前的标签向量labelMat是: ['1', '0', '1', '1', '0', '1', '0', '0', '0']
当前行是: ['2', '6', '1']
当前的特征矩阵featureMat是: [['1', '2'], ['4', '5'], ['2', '1'], ['4', '2'], ['6', '1'], ['3', '3'], ['5', '2'], ['4', '5'], ['2', '7'], ['2', '6']]
当前的标签向量labelMat是: ['1', '0', '1', '1', '0', '1', '0', '0', '0', '1']
最终得到的特征矩阵X是: [['1', '2'], ['4', '5'], ['2', '1'], ['4', '2'], ['6', '1'], ['3', '3'], ['5', '2'], ['4', '5'], ['2', '7'], ['2', '6']]
最终得到的标签向量y是: ['1', '0', '1', '1', '0', '1', '0', '0', '0', '1']
以上,我们就完成了数据集文件的制作和加载。
然后我们可以用上一节的方法,很容易就能取得:
训练集特征X_train,训练集标签y_train
测试集特征X_test,测试集标签y_test
代码如下:
def loadDataSet(fileName):
#创建空特征矩阵
featureMat = []
#创建空标签向量
labelMat = []
#打开文件
fr = open(fileName)
#按行遍历读取文件
for line in fr.readlines():
#每一行先去掉回车换行符,再以Tab键为元素之间的分隔符号,把每一行分割成若干个元素
lineArr = line.strip().split('\t')
#向特征矩阵featureMat添加元素,即lineArr当前行的第0个元素和第1个元素
#特征矩阵featureMat实际上是二维列表,注意添加元素的方法和一维列表稍有不同
featureMat.append([lineArr[0], lineArr[1]])
#向标签向量labelMat添加元素,即lineArr当前行的最后1个元素
labelMat.append(lineArr[-1])
#当前行的元素已添加到特征矩阵featureMat和标签向量labelMat,进入下一行继续
#所有行都读取完毕后关闭文件
fr.close()
#整个loadDataSet()函数返回特征矩阵featureMat和标签向量labelMat
return featureMat, labelMat
if __name__ == '__main__':
#调用loadDataSet()函数
X, y = loadDataSet('test.txt')
#数据集80%为训练集,20%为测试集
X_train = X[:8]
print('训练集特征矩阵X_train是:',X_train)
y_train = y[:8]
print('训练集标签y_train是:',y_train)
X_test = X[8:]
print('测试集特征X_test是:',X_test)
y_test = y[8:]
print('测试集标签y_test是:',y_test)
运行结果如下:
训练集特征矩阵X_train是: [['1', '2'], ['4', '5'], ['2', '1'], ['4', '2'], ['6', '1'], ['3', '3'], ['5', '2'], ['4', '5']]
训练集标签y_train是: ['1', '0', '1', '1', '0', '1', '0', '0']
测试集特征X_test是: [['2', '7'], ['2', '6']]
测试集标签y_test是: ['0', '1']
总结
数据集文件不需要标题,每一行的序号也是不需要的,只需包含所有的特征列和标签列就可以。
多个特征之间,特征和列之间一般用Tab键或空格或逗号来分隔。
可以创建一个loadDataSet()函数来加载数据集文件,这个函数需要做以下几个事情:
(1)打开数据集文件(请注意Python代码和数据集文件需要在同一目录下,如果不在,需要指定数据集文件的完整路径)
(2)遍历文件的所有行,i从第1行开始到最后1行
(3)去掉数据集文件每一行末尾的回车换行符
(4)根据数据集文件每一行元素之间的分隔符,把每一行分割成若干个元素
(5)将第i行除了最后一个元素之外的元素,添加到特征矩阵的第i行
(6)将第i行的最后一个元素,添加到标签向量的第i个元素(也是第i行)
(7)关闭文件
本人CSDN博客专栏:https://blog.csdn.net/yty_7
Github地址:https://github.com/yot777/
如果您觉得本篇本章对您有所帮助,欢迎关注、评论、点赞!Github欢迎您的Follow、Star!