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()
方法加载数据集。
import tensorflow as tf
boston_housing = tf.keras.datases.boston_housing
(train_x, train_y), (text_x, text_y) = boston_housing.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+00
9.17000e+01 3.97690e+00 4.00000e+00 3.07000e+02 2.10000e+01 3.96900e+02
1.87200e+01]
[2.17700e-02 8.25000e+01 2.03000e+00 0.00000e+00 4.15000e-01 7.61000e+00
1.57000e+01 6.27000e+00 2.00000e+00 3.48000e+02 1.47000e+01 3.95380e+02
3.11000e+00]
[4.89822e+00 0.00000e+00 1.81000e+01 0.00000e+00 6.31000e-01 4.97000e+00
1.00000e+02 1.33250e+00 2.40000e+01 6.66000e+02 2.02000e+01 3.75520e+02
3.26000e+00]
[3.96100e-02 0.00000e+00 5.19000e+00 0.00000e+00 5.15000e-01 6.03700e+00
3.45000e+01 5.98530e+00 5.00000e+00 2.24000e+02 2.02000e+01 3.96900e+02
8.01000e+00]
[3.69311e+00 0.00000e+00 1.81000e+01 0.00000e+00 7.13000e-01 6.37600e+00
8.84000e+01 2.56710e+00 2.40000e+01 6.66000e+02 2.02000e+01 3.91430e+02
1.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.628
5.572 6.251 5.613 5.957 7.016 6.345 6.162 6.727 6.202 6.595 7.135 6.575
5.895 6.794 6.012 7.185 5.813 5.569 6.315 6.297 6.301 5.935 7.024 6.415
5.599 5.701 6.041 6.279 5.454 6.211 6.316 6.411 5.887 5.924 5.822 6.674
6.842 5.713 5.968 6.461 7.358 6.565 5.88 5.87 6.348 6.193 6.854 6.546
6.004 6.538 6.185 5.836 6.525 6.436 5.757 5.818 5.852 5.404 5.682 6.629
7.178 5.914 6.096 5.631 5.896 5.637 5.966 5.403 6.678 7.47 5.456 6.453
6.372 6.31 6.405 7.853 4.926 6.103 6.75 8.034 6.009 7.765 8.069 6.358
6.975 6.015 6.8 6.43 7.645 8.337 6.113 6.77 5.757 6.487 6.162 6.069
5.565 5.96 6.229 7.929 6.715 5.39 6.383 7.147 6.006 6.004 5.928 5.936
6.315 5.727 6.152 7.454 6.968 5.95 6.232 6.951 7.014 6.49 5.786 5.731
7.412 6.782 5.67 5.879 6.545 8.704 5.927 5.683 5.399 6.474 6.193 6.326
6.976 6.433 6.762 6.167 6.657 6.431 5.936 6.939 6.163 6.03 5.891 5.404
5.531 6.481 3.863 5.807 6.226 7.007 6.495 7.691 6.516 5.608 6.059 6.393
6.727 5.983 6.549 6.416 5.905 5.663 5.889 6.454 6.824 6.169 6.13 6.456
6.219 5.92 7.163 6.739 5.874 4.368 6.021 6.023 6.382 6.373 6.047 8.398
5.859 7.42 5.856 5.57 7.088 6.38 5.998 5.933 6.619 4.903 6.606 5.56
5.965 6.484 6.749 6.083 5.872 5.707 5.604 6.728 6.579 6.319 5.52 6.482
5.85 5.851 6.51 6.567 7.393 5.39 5.961 5.834 6.398 6.998 6.861 6.209
6.066 3.561 6.982 5.693 5.888 8.247 6.442 6.635 5.272 5.976 6.112 7.313
5.012 4.652 6.086 6.254 6.164 5.869 7.267 6.051 5.453 5.926 5.713 6.402
6.223 6.649 5.155 6.129 6.095 6.86 5.617 7.148 7.82 5.186 6.02 7.041
6.405 6.431 5.875 7.274 6.23 6.211 6.152 6.302 6.849 6.312 6.286 6.426
7.327 6.718 5.594 7.155 5.99 5.344 5.349 6.696 5.935 4.906 5.277 6.208
6.406 6.266 6.216 6.425 6.127 6.12 5.986 6.249 7.206 5.747 6.871 5.854
4.963 5.856 5.888 6.144 6.341 6.096 7.287 5.762 5.963 6.816 6.438 5.787
6.065 6.782 8.266 6.027 6.092 8.725 7.875 6.317 6.167 5.875 5.898 5.362
6.137 6.943 5.949 6.115 5.427 6.54 6.389 5.871 6.552 6.145 5.803 6.174
7.203 7.236 5.627 5.794 5.741 6.003 6.726 6.618 8.375 7.489 6.59 4.138
8.04 7.923 5.854 6.14 6.29 6.63 6.683 5.868 6.127 6.333 6.655 6.195
6.458 7.82 5.972 7.416 5.759 5.783 7.241 6.794 5.706 5.952 6.377 4.973
6.631 5.412 6.642 6.98 6.417 6.701 6.511 6.556 6.122 5.942 6.335 7.107
6.014 5.966 6.251 6.781 7.079 5.857 5.304 6.064 6.312 6.081 6.212 4.519
6.459 6.326 4.138 5.602 6.24 6.031 5.709 6.604 6.434 5.913 5.985 6.25
6.121 5.926 6.874 6.167 5.961 6.437 6.405 6.072 6.151 7.831 5.648 6.108
6.417 6.144 6.114 6.127 5.304 5.837 5.841 5.605 5.876 6.242 6.879 6.728
6.38 5.878 6.176 6.833 6.826 6.245 5.713 5. 5.597 5.877 5.983 6.635
7.104 6.625 6.185 7.686 6.563 6.153 6.616 5.782 6.513 6.182 7.249 5.79
5.036 5.813 7.185 6.63 6.343 8.297 6.758 6.421 6.98 6.471 6.852 6.019
6.376 6.108 6.417 6.209 5.093 5.987 6.395 6.957 6.229 5.414 6.495 6.009
5.885 6.375 6.968 4.88 5.981 7.52 5.593 6.485 5.705 6.172 6.229 5.951
6.593 7.061 6.03 5.884 6.897 8.259 6.812 6.122 7.333 8.78 6.273 7.802
6.951 6.101]
这表示第1维取出全部数据,第2维取出索引值为5的属性。
可以看到返回了一个一维数组,其中有506个数值,分别是每条数据中的平均房间数。
这里再输出train_y中的数据
print(train_y)
[15.2 42.3 50. 21.1 17.7 18.5 11.3 15.6 15.6 14.4 12.1 17.9 23.1 19.9
15.7 8.8 50. 22.5 24.1 27.5 10.9 30.8 32.9 24. 18.5 13.3 22.9 34.7
16.6 17.5 22.3 16.1 14.9 23.1 34.9 25. 13.9 13.1 20.4 20. 15.2 24.7
22.2 16.7 12.7 15.6 18.4 21. 30.1 15.1 18.7 9.6 31.5 24.8 19.1 22.
14.5 11. 32. 29.4 20.3 24.4 14.6 19.5 14.1 14.3 15.6 10.5 6.3 19.3
19.3 13.4 36.4 17.8 13.5 16.5 8.3 14.3 16. 13.4 28.6 43.5 20.2 22.
23. 20.7 12.5 48.5 14.6 13.4 23.7 50. 21.7 39.8 38.7 22.2 34.9 22.5
31.1 28.7 46. 41.7 21. 26.6 15. 24.4 13.3 21.2 11.7 21.7 19.4 50.
22.8 19.7 24.7 36.2 14.2 18.9 18.3 20.6 24.6 18.2 8.7 44. 10.4 13.2
21.2 37. 30.7 22.9 20. 19.3 31.7 32. 23.1 18.8 10.9 50. 19.6 5.
14.4 19.8 13.8 19.6 23.9 24.5 25. 19.9 17.2 24.6 13.5 26.6 21.4 11.9
22.6 19.6 8.5 23.7 23.1 22.4 20.5 23.6 18.4 35.2 23.1 27.9 20.6 23.7
28. 13.6 27.1 23.6 20.6 18.2 21.7 17.1 8.4 25.3 13.8 22.2 18.4 20.7
31.6 30.5 20.3 8.8 19.2 19.4 23.1 23. 14.8 48.8 22.6 33.4 21.1 13.6
32.2 13.1 23.4 18.9 23.9 11.8 23.3 22.8 19.6 16.7 13.4 22.2 20.4 21.8
26.4 14.9 24.1 23.8 12.3 29.1 21. 19.5 23.3 23.8 17.8 11.5 21.7 19.9
25. 33.4 28.5 21.4 24.3 27.5 33.1 16.2 23.3 48.3 22.9 22.8 13.1 12.7
22.6 15. 15.3 10.5 24. 18.5 21.7 19.5 33.2 23.2 5. 19.1 12.7 22.3
10.2 13.9 16.3 17. 20.1 29.9 17.2 37.3 45.4 17.8 23.2 29. 22. 18.
17.4 34.6 20.1 25. 15.6 24.8 28.2 21.2 21.4 23.8 31. 26.2 17.4 37.9
17.5 20. 8.3 23.9 8.4 13.8 7.2 11.7 17.1 21.6 50. 16.1 20.4 20.6
21.4 20.6 36.5 8.5 24.8 10.8 21.9 17.3 18.9 36.2 14.9 18.2 33.3 21.8
19.7 31.6 24.8 19.4 22.8 7.5 44.8 16.8 18.7 50. 50. 19.5 20.1 50.
17.2 20.8 19.3 41.3 20.4 20.5 13.8 16.5 23.9 20.6 31.5 23.3 16.8 14.
33.8 36.1 12.8 18.3 18.7 19.1 29. 30.1 50. 50. 22. 11.9 37.6 50.
22.7 20.8 23.5 27.9 50. 19.3 23.9 22.6 15.2 21.7 19.2 43.8 20.3 33.2
19.9 22.5 32.7 22. 17.1 19. 15. 16.1 25.1 23.7 28.7 37.2 22.6 16.4
25. 29.8 22.1 17.4 18.1 30.3 17.5 24.7 12.6 26.5 28.7 13.3 10.4 24.4
23. 20. 17.8 7. 11.8 24.4 13.8 19.4 25.2 19.4 19.4 29.1 7.2 18.8
19. 27. 22.2 24.5 31.2 22.9 20.5 23.2 18.6 14.5 17.8 50. 20.8 24.3
24.2 19.8 19.1 22.7 12. 10.2 20. 18.5 20.9 23. 27.5 30.1 9.5 22.
21.2 14.1 33.1 23.4 20.1 7.4 15.4 23.8 20.1 24.5 33. 28.4 14.1 46.7
32.5 29.6 28.4 19.8 20.2 25. 35.4 20.3 9.7 14.5 34.9 26.6 7.2 50.
32.4 21.6 29.8 13.1 27.5 21.2 23.1 21.9 13. 23.2 8.1 5.6 21.7 29.6
19.6 7. 26.4 18.9 20.9 28.1 35.4 10.2 24.3 43.1 17.6 15.4 16.2 27.1
21.4 21.5 22.4 25. 16.6 18.6 22. 42.8 35.1 21.5 36. 21.9 24.1 50.
26.7 25. ]
可以看到结果,也是一个一维数组,其中包含506个数据,分别对于每条房屋信息数据中的房价。
波士顿房价数据集可视化
在波士顿房价数据集中每条房屋信息中有13条属性,有些明显的对房价有直接的影响,例如住宅的平均房间数。显然,房间数越多房价越高。而有一些属性与房价的关系,好像不是那么直接。
为了找出影响房价的主要因素,我们可以借助于数据可视化的方法。最直观的可视化方法就是利用散点图,把每一个属性与房价的关系表示出来。
平均房间数与房价之间的关系
例如要展现平均房间数与房价之间的关系,只要将横坐标作为房间数纵坐标作为房价,绘制散点图就可以了。
import tensorflow as tf
import matplotlib.pyplot as plt
boston_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()方法显示绘图
import tensorflow as tf
import matplotlib.pyplot as plt
boston_housing = tf.keras.datasets.boston_housing
(train_x, train_y), (_, _) = boston_housing.load_data(test_split=0)
plt.figure(figsize=(12, 12))
for i in range(13):
plt.subplot(4, 4, i+1)
plt.scatter(train_x[:, i], train_y)
plt.show()
这是运行结果,可以看到13个属性分别在13个子图中绘制出来了。
添加坐标轴标签和标题
下面我们给它们分别加上坐标轴和标题。
首先将所有属性的名称放在一个一维列表中,然后在循环体中每次取出索引值为i的元素,作为当前子图中x坐标轴的标签,所有子图中的y坐标轴标签都是房价。
import tensorflow as tf
import matplotlib.pyplot as plt
boston_housing = tf.keras.datasets.boston_housing
(train_x, train_y), (_, _) = boston_housing.load_data(test_split=0)
plt.rcParams["font.family"] = "SimHei"
plt.rcParams["axes.unicode_minus"] = False
titles = ["CRIM", "ZN", "INDUS", "CHAS", "NOX", "RM", "AGE",
"DIS", " RAD", "TAX", "PTRATIO", "B-1000", "LSTAT", "MEDV"]
plt.figure(figsize=(12, 12))
for i in range(13):
plt.subplot(4, 4, i+1)
plt.scatter(train_x[:, i], train_y)
plt.xlabel(titles[i])
plt.ylabel("Price($1000's)")
plt.title(str(i+1) + "." + titles[i] + " - Price")
plt.tight_layout()
plt.suptitle("各个属性与房价的关系", fontsize=20)
plt.show()
子图标题是由x轴标签和y轴标签共同组成的字符串,前面这个序号是子图序号取循环变量i的值加一,在这个for循环中最重要的就是注意循环变量索引值和子图序号的关系。
这是行结果。可以看出来,有些属性和房价之间存在着比较明显的关系,例如一氧化碳浓度,平均房间数,低收入人口的比例,而其他一些属性对房价好像没有明显的影响,例如是否有河流穿过商业用地的比例等。
通过这样的数据可视化可以帮助我们更加直观快速的读懂数据之间的关系,为后续的数据处理和分析提供基础
更多推荐
所有评论(0)