楊桃的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!

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