深度学习是机器学习的一个子领域,它通过在层中组织一组神经元来实现。深度学习模型由三层组成:输入层、输出层和隐藏层。与流行的机器学习算法(如k最近邻、支持向量机、线性回归等)相比,深度学习提供了几个优势。与机器学习算法不同,深度学习模型可以从有限的信息中创建新特征并执行高级分析。深度学习模型可以学习比机器学习算法更复杂的特征。然而,尽管它有优势,但也带来了几个挑战。这些挑战包括需要大量的数据和专用硬件,如GPU和TPU。
在本文中,将创建一个深度学习回归模型,使用著名的波士顿房价预测数据集来预测房价。不仅如此,还将比较其结果与一些知名的机器学习算法在不同方面的表现。
波士顿房价预测数据集包含506行,13个特征和一个目标列,即价格列。该数据集在互联网上很容易获得,可以使用此链接下载它。或者也可以使用Keras加载,如下步骤所示。
import pandas as pd
import numpy as np
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Dropout, Flatten, Dense
(train_features, train_labels), (test_features, test_labels) = keras.datasets.boston_housing.load_data()
pd.DataFrame(train_features).head()
如果从Keras加载数据,将得到一个NumPy数组。因此,为了更好地查看它,将把它转换成一个pandas数据框并查看数据框的头部。
现在已经看到了数据集的样子;可以开始构建深度学习回归模型。将使用TensorFlow库来创建模型。由于数据集不是很大,可以限制深度学习模型中的层数并节省时间。将使用两个全连接层,激活函数为relu。relu激活函数如果输入大于0,则直接输出输入;否则返回零。
model = keras.Sequential()
model.add(Dense(20, activation='relu', input_shape=[len(train_features[0])]))
model.add(Dense(1))
model.compile(optimizer='adam', loss='mse', metrics=['mse'])
history = model.fit(train_features, train_labels, epochs=20, verbose=0)
在上述代码中,创建了一个前馈神经网络。训练了模型20个周期,并使用均方误差作为损失函数,使用adam优化器。现在可以在测试数据上预测结果并与实际值进行比较。
from sklearn.metrics import mean_squared_error as mse
pred = model.predict(test_features)
mse(pred, test_labels)
可以使用其他值集,如平均绝对误差代替均方误差,或者使用RMS优化器代替adam优化器。还可以调整学习率和周期数以获得更好的结果。
深度学习回归模型已经完成,并且如承诺的那样,将比较其结果与一些流行的机器学习算法。
首先,将训练著名的k最近邻回归器数据。该算法在分类问题中很受欢迎,但在回归任务中也能给出公平的结果。它计算训练和测试集中示例之间的距离。然后根据最接近问题的K个示例进行预测。
from sklearn.neighbors import KNeighborsRegressor as KNN
model_k = KNN(n_neighbors=3)
model_k.fit(train_features, train_labels)
pred_k = model_k.predict(test_features)
mse(pred_k, test_labels)
线性回归是一种监督学习算法,它期望输入和输出变量之间存在线性关系。它基于公式Y = a + bX工作。这里,X是解释变量,Y是因变量,b是最佳拟合线的斜率。
from sklearn.linear_model import LinearRegression
model_l = LinearRegression()
model_l.fit(train_features, train_labels)
pred_l = model_l.predict(test_features)
mse(pred_l, test_labels)
支持向量机是一种监督学习算法,它在N维空间中找到一个超平面,并将数据点明显分类。超平面是分隔类别的最佳线,并将它们分隔到N维空间中。SVM也可用于数据不是线性可分的情况。
from sklearn.svm import SVR
model_s = SVR(C=1.0)
model_s.fit(train_features, train_labels)
pred_s = model_s.predict(test_features)
mse(pred_s, test_labels)
Sklearn还提供了一个正则化参数C,与SVM一起使用。正则化可以防止模型学习许多可能导致数据过拟合的复杂特征。
现在来到了激动人心的部分,将比较迄今为止创建的所有模型。将根据均方根误差比较模型。
模型 | 算法 | MSE(均方误差) | 训练时间(s) |
---|---|---|---|
model | 前馈神经网络 | 119.768 | 2.929 |
model_k | KNN | 41.428 | 0.008 |
model_l | 线性回归 | 23.195 | 0.063 |
model_s | SVM | 66.345 | 0.305 |
从表中,可以得出几个结论。深度学习模型的错误更大,训练时间比机器学习算法更长。这可能是由于架构的简单性或缺乏训练数据。线性回归模型给出了最小的错误,这意味着输入和目标变量之间存在完美的线性关系。还训练了没有正则化参数的SVM,显示出几乎相同的结果。这意味着数据集中的所有特征都与目标变量相关。
结论:深度学习提供了许多优势,但不能取代简单的问题。本文创建了使用深度学习和简单机器学习算法的回归模型。从结果中看到,训练深度学习模型可能并不总是最佳选择。对于选择的数据集,即使是更简单的机器学习算法也优于深度学习。因此,可以得出结论,只有在简单的机器学习算法未能提供令人满意的结果时,才应使用深度学习。