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