tensorflow入门(一)波士顿房价数据集
Keras
Keras 是基于 Theano 或 TensorFlow 的一個深度學習框架,它的設計參考了 Torch,用 Python 語言編寫,是一個高度模塊化的神經網絡庫,支持 GPU 和 CPU。
它可以快速搭建神經網絡模型,非常易于調試和擴展。TensorFlow的官方API內置了一些常用的公共數據集,可以通過keras.datasets模塊加載和訪問。
Keras中集成的數據集
| 1 | boston_housing | 波士頓房價數據集 |
| 2 | CIFAR10 | 10種類別的圖片集 |
| 3 | CIFAR100 | 100種類別的圖片集 |
| 4 | MNIST | 手寫數字圖片集 |
| 5 | Fashion-MNIST | 10種時尚類別的圖片集 |
| 6 | IMDB | 電影點評數據集 |
| 7 | reuters | 路透社新聞數據集 |
波士頓房價數據集
卡內基梅隆大學,StatLib庫,1978年,涵蓋了麻省波士頓的506個不同郊區的房屋數據。
404條訓練數據集,102條測試數據集。
每條數據14個字段,包含13個屬性,和一個房價的平均值。
加載數據集
在使用數據集之前,首先要加載數據集。這個數據集完整的前tensorflow.keras.datasets。tensorflow.keras是kerasApi在tensorflow的實現。
為了簡化編程,我們首先給他起一個更為簡短的名字,然后使用這個數據集對象的load_data()方法加載數據集。
數據集下載提示
在第一次運行這條語句時,本地磁盤中沒有這個數據集會自動通過網絡下載,這時會出現下載提示信息,顯示下載地址和進度。
本地默認路徑
在windows操作系統下,這個數據集下載后,被保存在c盤中的C:\users\user_name\.keras\datasets文件夾中。其中這個user_name是當前操作系統用戶名。如果是使用管理員administrator的身份登錄windows系統,這個數據集文件的名稱是boston_housing.npz
輸出數據集
由于這個數據集中的數據被劃分成了訓練集和測試集,其中每條數據又包括房屋的屬性值和房價,因此需要使用4個numpy數組分別接收這些返回值。
這里返回值train_x和train_y,分別用來接收訓練數據集的屬性和房價,test_x和test_y分別接收測試數據集的屬性和房價。
import tensorflow as tf boston_housing = tf.keras.datasets.boston_housing (train_x, train_y), (text_x, text_y) = boston_housing.load_data(test_split=0.2) print("Training set:", len(train_x)) print("Testing set:", len(text_x))
下面我們使用len()函數來看一下訓練集合測試集中數據的條數。
這是運行的結果:
可以看到訓練集中有404條數據,測試集中有102條數據,這是波士頓數據集中默認的劃分。如果想改變這個劃分比例,可以在加載數據及時,通過設置數據集對象的.load_data()方法中的test_split參數來實現。
這個參數是設置測試數據,在整個數據集中的比例默認為0.2,也就是說測試數據占整個數據集的1/5,在這個數據集中一共有506條數據,1/5也就是102條。
改變數據集劃分比例
在這節課的例子中,我們不需要測試及提取出全部數據作為訓練集,因此設置這個參數的值為0,再分別輸出訓練集和測試集中數據的條數。
import tensorflow as tf boston_housing = tf.keras.datasets.boston_housing (train_x, train_y), (text_x, text_y) = boston_housing.load_data(test_split=0) print("Training set:", len(train_x)) print("Testing set:", len(text_x))運行結果:
從運行結果可以看到所有的506條數據都作為了訓練數據,測試數據的數量為0。
訪問數據集中的數據
我們輸出train_x和train_y的數據類型,可以看到它們都是numpy數組。
type(train_x) <class 'numpy.ndarray'> type(train_y) <class 'numpy.ndarray'>再輸出它們的為數和形狀
print("維度", train_x.ndim) 維度 2 print("形狀", train_x.shape) 形狀 (506, 13)print("維度", train_y.ndim) 維度 1 print("形狀", train_y.shape) 形狀 (506,)可以看到train_x是二維數組,形狀是506,13,train_y是一維數組,形狀是506。
我們可以通過numpy數組的索引和切片來查看指定的數據,例如中的前5行數據
print(train_x[0:5]) [[1.23247e+00 0.00000e+00 8.14000e+00 0.00000e+00 5.38000e-01 6.14200e+009.17000e+01 3.97690e+00 4.00000e+00 3.07000e+02 2.10000e+01 3.96900e+021.87200e+01][2.17700e-02 8.25000e+01 2.03000e+00 0.00000e+00 4.15000e-01 7.61000e+001.57000e+01 6.27000e+00 2.00000e+00 3.48000e+02 1.47000e+01 3.95380e+023.11000e+00][4.89822e+00 0.00000e+00 1.81000e+01 0.00000e+00 6.31000e-01 4.97000e+001.00000e+02 1.33250e+00 2.40000e+01 6.66000e+02 2.02000e+01 3.75520e+023.26000e+00][3.96100e-02 0.00000e+00 5.19000e+00 0.00000e+00 5.15000e-01 6.03700e+003.45000e+01 5.98530e+00 5.00000e+00 2.24000e+02 2.02000e+01 3.96900e+028.01000e+00][3.69311e+00 0.00000e+00 1.81000e+01 0.00000e+00 7.13000e-01 6.37600e+008.84000e+01 2.56710e+00 2.40000e+01 6.66000e+02 2.02000e+01 3.91430e+021.46500e+01]]可以看到結果,是一個二維數組。第一維中的每個元素對應于一條房屋信息數據,每條數據,包括13個屬性。
輸出train_x中的某一列數據
如果我們希望提取出其中的某一個屬性,也就是讀出某一列數據,可以在第二維上指定索引值,例如要顯示所有數據中的平均房間數這個屬性,可以這樣寫
print(train_x[:,5]) [6.142 7.61 4.97 6.037 6.376 5.708 5.536 5.468 5.628 5.019 6.404 4.6285.572 6.251 5.613 5.957 7.016 6.345 6.162 6.727 6.202 6.595 7.135 6.5755.895 6.794 6.012 7.185 5.813 5.569 6.315 6.297 6.301 5.935 7.024 6.4155.599 5.701 6.041 6.279 5.454 6.211 6.316 6.411 5.887 5.924 5.822 6.6746.842 5.713 5.968 6.461 7.358 6.565 5.88 5.87 6.348 6.193 6.854 6.5466.004 6.538 6.185 5.836 6.525 6.436 5.757 5.818 5.852 5.404 5.682 6.6297.178 5.914 6.096 5.631 5.896 5.637 5.966 5.403 6.678 7.47 5.456 6.4536.372 6.31 6.405 7.853 4.926 6.103 6.75 8.034 6.009 7.765 8.069 6.3586.975 6.015 6.8 6.43 7.645 8.337 6.113 6.77 5.757 6.487 6.162 6.0695.565 5.96 6.229 7.929 6.715 5.39 6.383 7.147 6.006 6.004 5.928 5.9366.315 5.727 6.152 7.454 6.968 5.95 6.232 6.951 7.014 6.49 5.786 5.7317.412 6.782 5.67 5.879 6.545 8.704 5.927 5.683 5.399 6.474 6.193 6.3266.976 6.433 6.762 6.167 6.657 6.431 5.936 6.939 6.163 6.03 5.891 5.4045.531 6.481 3.863 5.807 6.226 7.007 6.495 7.691 6.516 5.608 6.059 6.3936.727 5.983 6.549 6.416 5.905 5.663 5.889 6.454 6.824 6.169 6.13 6.4566.219 5.92 7.163 6.739 5.874 4.368 6.021 6.023 6.382 6.373 6.047 8.3985.859 7.42 5.856 5.57 7.088 6.38 5.998 5.933 6.619 4.903 6.606 5.565.965 6.484 6.749 6.083 5.872 5.707 5.604 6.728 6.579 6.319 5.52 6.4825.85 5.851 6.51 6.567 7.393 5.39 5.961 5.834 6.398 6.998 6.861 6.2096.066 3.561 6.982 5.693 5.888 8.247 6.442 6.635 5.272 5.976 6.112 7.3135.012 4.652 6.086 6.254 6.164 5.869 7.267 6.051 5.453 5.926 5.713 6.4026.223 6.649 5.155 6.129 6.095 6.86 5.617 7.148 7.82 5.186 6.02 7.0416.405 6.431 5.875 7.274 6.23 6.211 6.152 6.302 6.849 6.312 6.286 6.4267.327 6.718 5.594 7.155 5.99 5.344 5.349 6.696 5.935 4.906 5.277 6.2086.406 6.266 6.216 6.425 6.127 6.12 5.986 6.249 7.206 5.747 6.871 5.8544.963 5.856 5.888 6.144 6.341 6.096 7.287 5.762 5.963 6.816 6.438 5.7876.065 6.782 8.266 6.027 6.092 8.725 7.875 6.317 6.167 5.875 5.898 5.3626.137 6.943 5.949 6.115 5.427 6.54 6.389 5.871 6.552 6.145 5.803 6.1747.203 7.236 5.627 5.794 5.741 6.003 6.726 6.618 8.375 7.489 6.59 4.1388.04 7.923 5.854 6.14 6.29 6.63 6.683 5.868 6.127 6.333 6.655 6.1956.458 7.82 5.972 7.416 5.759 5.783 7.241 6.794 5.706 5.952 6.377 4.9736.631 5.412 6.642 6.98 6.417 6.701 6.511 6.556 6.122 5.942 6.335 7.1076.014 5.966 6.251 6.781 7.079 5.857 5.304 6.064 6.312 6.081 6.212 4.5196.459 6.326 4.138 5.602 6.24 6.031 5.709 6.604 6.434 5.913 5.985 6.256.121 5.926 6.874 6.167 5.961 6.437 6.405 6.072 6.151 7.831 5.648 6.1086.417 6.144 6.114 6.127 5.304 5.837 5.841 5.605 5.876 6.242 6.879 6.7286.38 5.878 6.176 6.833 6.826 6.245 5.713 5. 5.597 5.877 5.983 6.6357.104 6.625 6.185 7.686 6.563 6.153 6.616 5.782 6.513 6.182 7.249 5.795.036 5.813 7.185 6.63 6.343 8.297 6.758 6.421 6.98 6.471 6.852 6.0196.376 6.108 6.417 6.209 5.093 5.987 6.395 6.957 6.229 5.414 6.495 6.0095.885 6.375 6.968 4.88 5.981 7.52 5.593 6.485 5.705 6.172 6.229 5.9516.593 7.061 6.03 5.884 6.897 8.259 6.812 6.122 7.333 8.78 6.273 7.8026.951 6.101]這表示第1維取出全部數據,第2維取出索引值為5的屬性。
可以看到返回了一個一維數組,其中有506個數值,分別是每條數據中的平均房間數。
這里再輸出train_y中的數據
可以看到結果,也是一個一維數組,其中包含506個數據,分別對于每條房屋信息數據中的房價。
波士頓房價數據集可視化
在波士頓房價數據集中每條房屋信息中有13條屬性,有些明顯的對房價有直接的影響,例如住宅的平均房間數。顯然,房間數越多房價越高。而有一些屬性與房價的關系,好像不是那么直接。
為了找出影響房價的主要因素,我們可以借助于數據可視化的方法。最直觀的可視化方法就是利用散點圖,把每一個屬性與房價的關系表示出來。
平均房間數與房價之間的關系
例如要展現平均房間數與房價之間的關系,只要將橫坐標作為房間數縱坐標作為房價,繪制散點圖就可以了。
import tensorflow as tf import matplotlib.pyplot as pltboston_housing = tf.keras.datasets.boston_housing (train_x, train_y), (_, _) = boston_housing.load_data(test_split=0)# 設置繪圖尺寸 plt.figure(figsize=(5, 5)) # 繪制散點圖 plt.scatter(train_x[:, 5], train_y) # 設置x軸標簽文本 plt.xlabel("RM") # 設置y軸標簽文本 plt.ylabel("Price($1000's)") # 設置標題 plt.title("5. RM-Price") # 顯示繪圖 plt.show()
這是運行的結果,可以看出來平均房間數和房價之間的關系,整體是趨于這樣的規律,房間數量越多房價越高,這和我們平時的認知是一致的。
所有屬性與房價之間的關系
下面我們可以采用相同的方法,繪制出其他12個屬性和房價之間的關系,但是如果把這段代碼拷貝12遍,然后再逐一修改其中的橫坐標取值,這樣做顯然有點太笨了。對于這個問題我們很容易想到可以使用循環語句來實現循環執行13次,每次取出一個屬性作為橫坐標的值就可以了。
首先看一下我們希望得到的運行結果,這是一張全家福,把所有的屬性和房價之間的關系繪制在同一張圖中,這樣做比較直觀,更方便觀察、比較和管理。
為了放置這13個屬性,我們需要把整個繪圖區域劃分為4×4的子圖,在前面的13個子圖中分別繪制每個屬性的散點圖,因為循環次數已知,因此我們使用for循環來實現這13個子圖的繪制。
for i in range(13):plt.subplot(4, 4, i+1)plt.scatter(train_x[:,i], train_y)循環次數為13循環變量I從0開始依次增大,直到i=12時循環結束。
在循環體中每次繪制一個子圖,前兩個參數表示,整個畫布被劃分為4×4的區域,最后這個參數是當前這次循環所創建的子圖序號,因為子圖序號是從1開始的,因此要給循環變量I+1,然后在這個子圖上繪制散點圖。橫坐標取第i個屬性值,縱坐標是房價。
執行這個for循環語句就可以完成對所有屬性的散點圖的繪制。這里加上一條設置畫布尺寸,然后使用show()方法顯示繪圖
這是運行結果,可以看到13個屬性分別在13個子圖中繪制出來了。
添加坐標軸標簽和標題
下面我們給它們分別加上坐標軸和標題。
首先將所有屬性的名稱放在一個一維列表中,然后在循環體中每次取出索引值為i的元素,作為當前子圖中x坐標軸的標簽,所有子圖中的y坐標軸標簽都是房價。
子圖標題是由x軸標簽和y軸標簽共同組成的字符串,前面這個序號是子圖序號取循環變量i的值加一,在這個for循環中最重要的就是注意循環變量索引值和子圖序號的關系。
這是行結果。可以看出來,有些屬性和房價之間存在著比較明顯的關系,例如一氧化碳濃度,平均房間數,低收入人口的比例,而其他一些屬性對房價好像沒有明顯的影響,例如是否有河流穿過商業用地的比例等。
通過這樣的數據可視化可以幫助我們更加直觀快速的讀懂數據之間的關系,為后續的數據處理和分析提供基礎
總結
以上是生活随笔為你收集整理的tensorflow入门(一)波士顿房价数据集的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 跟几位大佬共进晚餐
- 下一篇: 对比一段ADC键值读取的代码