文章目录
- 案例一. 加州房价预测
- 案例二. MNIST手写数字识别
- 案例三. 波士顿房价预测
案例一. 加州房价预测
线性回归通过对训练集进行训练,拟合出一个线性方程,使得预测值与实际值之间的平均误差最小化。这个过程可以使用梯度下降法等优化算法来实现。即通过最小化预测值(线性函数)与实际值之间的误差(成本函数)来训练出的模型。
sklearn中提供了可直接调用的线性回归算法模型LinearRegression()
案例一将加州房价数据集的80%用作训练集,其余20%用作测试集,通过给出的数据样本进行推理,得到一个函数模型后,就可以用于推断加州其他地区的房价(中位数)。
Python代码:
import pandas as pd #导入Pandas,用于数据读取和处理
# 读入房价数据,示例代码中的文件地址为internet链接,读者也可以下载该文件到本机进行读取
# 如,当数据集和代码文件位于相同本地目录,路径名应为"./house.csv",或直接放"house.csv"亦可
df_housing = pd.read_csv("https://raw.githubusercontent.com/huangjia2019/house/master/house.csv")
df_housing.head #显示加州房价数据的部分信息
X = df_housing.drop("median_house_value",axis = 1) #构建特征集X,去掉"median_house_value",其余赋给X
y = df_housing.median_house_value #构建标签集y,将df_housing.median_house_value单独赋给y
from sklearn.model_selection import train_test_split #导入数据集拆分工具
X_train, X_test, y_train, y_test = train_test_split(X, y,
test_size=0.2, random_state=0) #以80%/20%的比例进行数据集的拆分
from sklearn.linear_model import LinearRegression #导入线性回归算法模型
model = LinearRegression() #使用线性回归算法
model.fit(X_train, y_train) #用训练集数据,训练模型,拟合函数,确定参数
y_pred = model.predict(X_test) #预测测试集的y值
print('房价中位数的真值(测试集)', y_test)
print('预测的房价中位数(测试集)', y_pred)
print("给预测评分:", model.score(X_test, y_test)) #评估预测结果
import matplotlib.pyplot as plt #导入matplotlib画图库
#用散点图显示家庭收入中位数和房价中位数的分布
plt.scatter(X_test.median_income, y_test, color='brown', s=10)
#画出回归函数(从特征到预测标签)
plt.plot(X_test.median_income, y_pred, color='green', linewidth=0.1)
plt.xlabel('Median Income') #X轴-家庭收入中位数
plt.ylabel('Median House Value') #Y轴-房价中位数
plt.show() #显示房价分布和习得的函数图形
训练结果:
房价中位数的真值(测试集) 3873 171400.0
3625 189600.0
3028 500001.0
13814 229400.0
15398 163400.0
...
1363 212500.0
7947 210500.0
14574 142900.0
10009 128300.0
9149 84700.0
Name: median_house_value, Length: 3400, dtype: float64
预测的房价中位数(测试集) [211157.06335416 218581.64298576 465317.31295563 ... 201751.23969632
160873.51846958 138847.26913351]
给预测评分: 0.6321014171579509
案例二. MNIST手写数字识别
import numpy as np # 导入NumPy数学工具箱
import pandas as pd # 导入Pandas数据处理工具箱
from keras.datasets import mnist #从Keras中导入mnist数据集
#读入训练集和测试集
(X_train_image, y_train_lable), (X_test_image, y_test_lable) = mnist.load_data()
print("特征集张量形状:", X_train_image.shape) #用shape方法显示张量的形状
print("第一个数据样本:\n", X_train_image[0]) #注意Python的索引是从0开始的
print("第一个数据样本的标签:", y_train_lable[0])
from tensorflow.keras.utils import to_categorical # 导入keras.utils工具箱的类别转换工具
X_train = X_train_image.reshape(60000,28,28,1) # 给标签增加一个维度
X_test = X_test_image.reshape(10000,28,28,1) # 给标签增加一个维度
y_train = to_categorical(y_train_lable, 10) # 特征转换为one-hot编码
y_test = to_categorical(y_test_lable, 10) # 特征转换为one-hot编码
print("数据集张量形状:", X_train.shape) # 特征集张量的形状
print("第一个数据标签:",y_train[0]) # 显示标签集的第一个数据
from keras import models # 导入Keras模型, 和各种神经网络的层
from keras.layers import Dense, Dropout, Flatten, Conv2D, MaxPooling2D
model = models.Sequential() # 用序贯方式建立模型
model.add(Conv2D(32, (3, 3), activation='relu', # 添加Conv2D层
input_shape=(28,28,1))) # 指定输入数据样本张量的类型
model.add(MaxPooling2D(pool_size=(2, 2))) # 添加MaxPooling2D层
model.add(Conv2D(64, (3, 3), activation='relu')) # 添加Conv2D层
model.add(MaxPooling2D(pool_size=(2, 2))) # 添加MaxPooling2D层
model.add(Dropout(0.25)) # 添加Dropout层
model.add(Flatten()) # 展平
model.add(Dense(128, activation='relu')) # 添加全连接层
model.add(Dropout(0.5)) # 添加Dropout层
model.add(Dense(10, activation='softmax')) # Softmax分类激活,输出10维分类码
# 编译模型
model.compile(optimizer='rmsprop', # 指定优化器
loss='categorical_crossentropy', # 指定损失函数
metrics=['accuracy']) # 指定验证过程中的评估指标
model.fit(X_train, y_train, # 指定训练特征集和训练标签集
validation_split = 0.3, # 部分训练集数据拆分成验证集
epochs=5, # 训练轮次为5轮
batch_size=128) # 以128为批量进行训练
score = model.evaluate(X_test, y_test) # 在测试集上进行模型评估
print('测试集预测准确率:', score[1]) # 打印测试集上的预测准确率
pred = model.predict(X_test[0].reshape(1, 28, 28, 1)) # 预测测试集第一个数据
print(pred[0],"转换一下格式得到:",pred.argmax()) # 把one-hot码转换为数字
import matplotlib.pyplot as plt # 导入绘图工具包
plt.imshow(X_test[0].reshape(28, 28),cmap='Greys') # 输出这个图片
plt.show() #显示图片
训练结果:
特征集张量形状: (60000, 28, 28)
第一个数据样本:
[[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0 0 0 3 18 18 18 126 136
175 26 166 255 247 127 0 0 0 0]
[ 0 0 0 0 0 0 0 0 30 36 94 154 170 253 253 253 253 253
225 172 253 242 195 64 0 0 0 0]
[ 0 0 0 0 0 0 0 49 238 253 253 253 253 253 253 253 253 251
93 82 82 56 39 0 0 0 0 0]
[ 0 0 0 0 0 0 0 18 219 253 253 253 253 253 198 182 247 241
0 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 80 156 107 253 253 205 11 0 43 154
0 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 14 1 154 253 90 0 0 0 0
0 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0 0 139 253 190 2 0 0 0
0 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0 0 11 190 253 70 0 0 0
0 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0 0 0 35 241 225 160 108 1
0 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0 0 0 0 81 240 253 253 119
25 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 45 186 253 253
150 27 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 16 93 252
253 187 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 249
253 249 64 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 46 130 183 253
253 207 2 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0 0 0 39 148 229 253 253 253
250 182 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0 24 114 221 253 253 253 253 201
78 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 23 66 213 253 253 253 253 198 81 2
0 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 18 171 219 253 253 253 253 195 80 9 0 0
0 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 55 172 226 253 253 253 253 244 133 11 0 0 0 0
0 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 136 253 253 253 212 135 132 16 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0]]
第一个数据样本的标签: 5
数据集张量形状: (60000, 28, 28, 1)
第一个数据标签: [0. 0. 0. 0. 0. 1. 0. 0. 0. 0.]
Epoch 1/5
329/329 [==============================] - 9s 27ms/step - loss: 1.0503 - accuracy: 0.8201 - val_loss: 0.1492 - val_accuracy: 0.9578
Epoch 2/5
329/329 [==============================] - 12s 35ms/step - loss: 0.1949 - accuracy: 0.9464 - val_loss: 0.0734 - val_accuracy: 0.9794
Epoch 3/5
329/329 [==============================] - 11s 35ms/step - loss: 0.1417 - accuracy: 0.9618 - val_loss: 0.0663 - val_accuracy: 0.9834
Epoch 4/5
329/329 [==============================] - 12s 35ms/step - loss: 0.1132 - accuracy: 0.9697 - val_loss: 0.0683 - val_accuracy: 0.9818
Epoch 5/5
329/329 [==============================] - 11s 34ms/step - loss: 0.0917 - accuracy: 0.9745 - val_loss: 0.0669 - val_accuracy: 0.9817
313/313 [==============================] - 1s 3ms/step - loss: 0.0638 - accuracy: 0.9826
测试集预测准确率: 0.9825999736785889
1/1 [==============================] - 0s 41ms/step
[1.5436295e-13 3.0449864e-12 3.0315375e-11 3.1523032e-13 8.0739130e-15
9.7735735e-15 1.6785966e-18 1.0000000e+00 6.6133326e-15 1.2456733e-09] 转换一下格式得到: 7
其中onehot编码[[0. 0. 0. 0. 0. 0. 0. 1. 0. 0.]]
显示为[1.5436295e-13 3.0449864e-12 3.0315375e-11 3.1523032e-13 8.0739130e-15 9.7735735e-15 1.6785966e-18 1.0000000e+00 6.6133326e-15 1.2456733e-09]
是因为默认采用了科学计数法形式显示,当数值非常小时会用浮点数精确表示。要想取消这样表示可通过:np.set_printoptions(suppress=True) # 取消科学计数法的形式显示
来设置。
案例三. 波士顿房价预测
更换案例一的数据集为波士顿房价,数据集存在于keras及很多其它框架内部,可以通过下述语句导入
from keras.datasets import boston_housing #从Keras中导入Boston Housing数据集
,使用案例一的线性回归模型对波士顿房价数据训练集进行房价中位数的预测。
由于keras中调用了tensorflow(相当于精简版的tf),所以要先pip install tensorflow
Boston Housing
该数据集包含美国人口普查局收集的美国马萨诸塞州波士顿住房价格的有关信息, 数据集很小,只有506个案例。
数据集都有以下14个属性:
0-CRIM–城镇人均犯罪率 ------【城镇人均犯罪率】
1-ZN - 占地面积超过25,000平方英尺的住宅用地比例。 ------【住宅用地所占比例】
2-INDUS - 每个城镇非零售业务的比例。 ------【城镇中非商业用地占比例】
3-CHAS - Charles River虚拟变量(如果是河道,则为1;否则为0 ------【查尔斯河虚拟变量,用于回归分析】
4-NOX - 一氧化氮浓度(每千万份) ------【环保指标】
5-RM - 每间住宅的平均房间数 ------【每栋住宅房间数】
6-AGE - 1940年以前建造的自住单位比例 ------【1940年以前建造的自住单位比例 】
7-DIS -波士顿的五个就业中心加权距离 ------【与波士顿的五个就业中心加权距离】
8-RAD - 径向高速路的可达性指数 ------【距离高速公路的便利指数】
9-TAX - 每10,000美元的全额物业税率 ------【每一万美元的不动产税率】
10-PTRATIO - 城镇的学生与教师比例 ------【城镇中教师学生比例】
11-B - 1000(Bk - 0.63)^ 2其中Bk是城镇黑人的比例 ------【城镇中黑人比例】
12-LSTAT - 人口状况下降% ------【房东属于低等收入阶层比例】
13-MEDV - 自有住房的中位数报价, 单位1000美元 ------【自住房屋房价中位数】
同样是将0-12赋值给X_train作为训练集中的特征集,13给y_train作为标签集
import numpy as np # 导入NumPy数学工具箱
import pandas as pd # 导入Pandas数据处理工具箱
from keras.datasets import boston_housing #从Keras中导入Boston Housing数据集
#读入训练集和测试集
(X_train, y_train), (X_test, y_test) = boston_housing.load_data()
print ("数据集张量形状:", X_train.shape) #shape方法显示张量的形状
print ("第一个数据样本:\n", X_train[0]) #注意Python的索引是从0开始的
print ("第一个数据样本的标签:", y_train[0])
from sklearn.linear_model import LinearRegression #导入线性回归算法模型
model = LinearRegression() #使用线性回归算法
model.fit(X_train, y_train) #用训练集数据,训练机器,拟合函数,确定参数
y_pred = model.predict(X_test) #预测测试集的Y值
print ('房价的真值(测试集)',y_test)
print ('预测的房价(测试集)',y_pred)
print("给预测评分:", model.score(X_test, y_test)) #评估预测结果
训练结果:
数据集张量形状: (404, 13)
第一个数据样本:
[ 1.23247 0. 8.14 0. 0.538 6.142 91.7
3.9769 4. 307. 21. 396.9 18.72 ]
第一个数据样本的标签: 15.2
房价的真值(测试集) [ 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. ]
预测的房价(测试集) [ 9.69267239 21.05859431 20.94145461 34.25223414 25.95902598 20.56741038
28.15310405 25.07113862 20.30519458 22.82489511 20.29027213 18.07938917
16.46141024 35.31166595 19.41369959 19.34727116 24.58140904 21.01346252
19.99079236 23.79286427 12.20780045 17.14218992 22.51468752 12.92570511
21.18070615 23.94073547 33.46176314 24.2631555 13.35213096 20.71939252
23.45082103 19.1486881 36.09743765 23.47113531 19.03141995 5.92425733
14.02090469 22.96425377 16.01731242 27.09134249 22.06997029 28.61755389
17.75679772 34.75579014 31.29455712 24.73234165 31.12655323 18.09268992
22.62638989 24.21208909 30.5854317 18.71860574 10.50163617 13.73779292
34.4022841 27.53140317 18.08151522 40.05101982 37.63271513 24.64021422
25.73823434 20.64369987 20.33514699 21.38393124 24.63485497 23.53071805
17.42141466 26.76911736 3.83782148 11.97063636 24.2602519 23.67191799
23.66639182 8.4403269 28.52690962 20.94071229 20.44489658 24.77678169
33.77299778 7.02038331 24.55379254 36.73923493 16.09878612 18.14663987
20.48899554 18.7928142 22.45683561 26.19154506 23.36585592 28.89583791
17.48243942 16.05642916 26.69532678 28.1393996 35.04164989 20.05308052
36.25269116 38.51475052 25.13506119 41.49062194 34.65500235 25.33950895]
给预测评分: 0.7213535934621558
参考文献:
[1] 黄佳——《零基础学机器学习》