杨桃的Python机器学习4——数据集文件的制作和加载

本人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!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章