如何用Keras进行预测
一旦你在Keras中选择并适合最终的深度学习模型,你就可以使用它对新数据实例进行预测。
在初学者中,有一些关于如何确切地做到这一点的困惑。我经常看到这样的问题:
我如何在Keras用我的模型进行预测?
在本教程中,你将确切了解如何使用Keras Python库的最终深度学习模型进行分类和回归预测。
完成本教程后,你将了解:
- 如何最终确定模型,以便为进行预测做好准备。
- 如何对Keras中的分类问题进行分类和概率预测。
- 如何在“Keras”中进行回归预测。
我们开始吧。
教程概述
本教程分为3个部分,它们是:
- 最终确定模型。
- 分类预测。
- 回归预测。
1.最终确定模型
在你做出预测之前,你必须训练一个最终的模型。
你可能已经使用数据的k倍交叉验证或训练/测试分离对模型进行了训练。这样做是为了让你评估模型在样本外数据(例如新数据)上的技
能。
这些模型已经达到了它们的目的,现在可以丢弃了。
现在,你必须根据所有可用的数据训练最终模型。你可以在此处了解有关如何训练最终模型的更多信息:
2.分类预测
分类问题是模型学习输入特征和作为标签的输出特征(如“垃圾邮件”和“非垃圾邮件”)之间的映射的问题。
下面是在Keras中为简单的两类(二进制)分类问题开发的最终神经网络模型的示例。
如果你对在Keras中开发神经网络模型很陌生,请参阅此Keras教程。
# example of training a final classification model from keras.models import Sequential from keras.layers import Dense from sklearn.datasets import make_blobs from sklearn.preprocessing import MinMaxScaler # generate 2d classification dataset X, y = make_blobs(n_samples=100, centers=2, n_features=2, random_state=1) scalar = MinMaxScaler() scalar.fit(X) X = scalar.transform(X) # define and fit the final model model = Sequential() model.add(Dense(4, input_dim=2, activation='relu')) model.add(Dense(4, activation='relu')) model.add(Dense(1, activation='sigmoid')) model.compile(loss='binary_crossentropy', optimizer='adam') model.fit(X, y, epochs=200, verbose=0)
完成后,你可能希望将模型保存到文件,例如通过Keras API。保存后,你可以随时加载模型并使用它进行预测。有关这方面的示例,请
参阅帖子:
为简单起见,对于本教程中的示例,我们将跳过此步骤。
对于我们最终的模型,我们可能希望做出两种类型的分类预测;它们是类别预测和概率预测。
分类预测
给出最终模型和一个或多个数据实例的类预测,预测数据实例的类。
我们不知道新数据的结果类别。这就是我们首先需要模型的原因。
我们可以使用我们在Keras中最终确定的分类模型,使用predict_classes()函数来预测新数据实例的类。请注意,此功能仅在
Sequential模型上可用,而不是使用Functional API开发的那些模型。
例如,我们在名为Xnew的数组中有一个或多个数据实例。为了预测数组中每个实例的类值,可以将其传递给我们模型上的
forecast_class()函数。
Xnew = [[...], [...]] ynew = model.predict_classes(Xnew)
让我们用一个例子将其具体化:
# example making new class predictions for a classification problem from keras.models import Sequential from keras.layers import Dense from sklearn.datasets import make_blobs from sklearn.preprocessing import MinMaxScaler # generate 2d classification dataset X, y = make_blobs(n_samples=100, centers=2, n_features=2, random_state=1) scalar = MinMaxScaler() scalar.fit(X) X = scalar.transform(X) # define and fit the final model model = Sequential() model.add(Dense(4, input_dim=2, activation='relu')) model.add(Dense(4, activation='relu')) model.add(Dense(1, activation='sigmoid')) model.compile(loss='binary_crossentropy', optimizer='adam') model.fit(X, y, epochs=500, verbose=0) # new instances where we do not know the answer Xnew, _ = make_blobs(n_samples=3, centers=2, n_features=2, random_state=1) Xnew = scalar.transform(Xnew) # make a prediction ynew = model.predict_classes(Xnew) # show the inputs and predicted outputs for i in range(len(Xnew)): print("X=%s, Predicted=%s" % (Xnew[i], ynew[i]))
运行该示例将预测三个新数据实例的类,然后将数据和预测一起打印出来。
X=[0.89337759 0.65864154], Predicted=[0] X=[0.29097707 0.12978982], Predicted=[1] X=[0.78082614 0.75391697], Predicted=[0]
如果只有一个新数据实例,则可以将其作为数组包装的实例提供给predict_classes()函数;例如:
# example making new class prediction for a classification problem from keras.models import Sequential from keras.layers import Dense from sklearn.datasets import make_blobs from sklearn.preprocessing import MinMaxScaler from numpy import array # generate 2d classification dataset X, y = make_blobs(n_samples=100, centers=2, n_features=2, random_state=1) scalar = MinMaxScaler() scalar.fit(X) X = scalar.transform(X) # define and fit the final model model = Sequential() model.add(Dense(4, input_dim=2, activation='relu')) model.add(Dense(4, activation='relu')) model.add(Dense(1, activation='sigmoid')) model.compile(loss='binary_crossentropy', optimizer='adam') model.fit(X, y, epochs=500, verbose=0) # new instance where we do not know the answer Xnew = array([[0.89337759, 0.65864154]]) # make a prediction ynew = model.predict_classes(Xnew) # show the inputs and predicted outputs print("X=%s, Predicted=%s" % (Xnew[0], ynew[0]))
运行该示例将打印单个实例和预测的类。
X=[0.89337759 0.65864154], Predicted=[0]
关于类标号的一个注记
请注意,当你准备数据时,你会将域(如字符串)中的类值映射到整数值。你可能使用过LabelEncoding。
此LabelEncoding可用于通过inverse_transform()函数将整数转换回字符串值。
因此,你可能希望在拟合最终模型时保存(pickle)用于编码y值的LabelEncoding。
概率预测
你可能希望进行的另一种预测是数据实例属于每个类的概率。
这称为概率预测,在给定新实例的情况下,模型将每个结果类的概率作为介于0和1之间的值返回。
你可以通过调用predict_proba()函数在Keras中进行以下类型的预测;例如:
Xnew = [[...], [...]] ynew = model.predict_proba(Xnew)
在两类(二进制)分类问题的情况下,通常在输出层使用sigmoid激活函数。预测的概率被认为是属于类别1的观测的可能性,或者反转
(1-概率)以给出类别0的概率。
在多类分类问题的情况下,通常在输出层使用softmax激活函数,并且将每个类的观测可能性作为向量返回。
下面的示例对Xnew数据实例数组中的每个示例进行概率预测。
# example making new probability predictions for a classification problem from keras.models import Sequential from keras.layers import Dense from sklearn.datasets import make_blobs from sklearn.preprocessing import MinMaxScaler # generate 2d classification dataset X, y = make_blobs(n_samples=100, centers=2, n_features=2, random_state=1) scalar = MinMaxScaler() scalar.fit(X) X = scalar.transform(X) # define and fit the final model model = Sequential() model.add(Dense(4, input_dim=2, activation='relu')) model.add(Dense(4, activation='relu')) model.add(Dense(1, activation='sigmoid')) model.compile(loss='binary_crossentropy', optimizer='adam') model.fit(X, y, epochs=500, verbose=0) # new instances where we do not know the answer Xnew, _ = make_blobs(n_samples=3, centers=2, n_features=2, random_state=1) Xnew = scalar.transform(Xnew) # make a prediction ynew = model.predict_proba(Xnew) # show the inputs and predicted outputs for i in range(len(Xnew)): print("X=%s, Predicted=%s" % (Xnew[i], ynew[i]))
运行实例进行概率预测,然后打印输入数据实例和属于类1的每个实例的概率。
X=[0.89337759 0.65864154], Predicted=[0.0087348] X=[0.29097707 0.12978982], Predicted=[0.82020265] X=[0.78082614 0.75391697], Predicted=[0.00693122]
如果你想要向用户显示概率以供专家解释,这在你的应用程序中可能会很有帮助。
3.回归预测
回归是一个有监督的学习问题,在给定输入示例的情况下,模型学习到适当输出量的映射,例如“0.1”和“0.2”等。
下面是用于回归的最终Keras模型的示例。
# example of training a final regression model from keras.models import Sequential from keras.layers import Dense from sklearn.datasets import make_regression from sklearn.preprocessing import MinMaxScaler # generate regression dataset X, y = make_regression(n_samples=100, n_features=2, noise=0.1, random_state=1) scalarX, scalarY = MinMaxScaler(), MinMaxScaler() scalarX.fit(X) scalarY.fit(y.reshape(100,1)) X = scalarX.transform(X) y = scalarY.transform(y.reshape(100,1)) # define and fit the final model model = Sequential() model.add(Dense(4, input_dim=2, activation='relu')) model.add(Dense(4, activation='relu')) model.add(Dense(1, activation='linear')) model.compile(loss='mse', optimizer='adam') model.fit(X, y, epochs=1000, verbose=0)
我们可以通过对最终模型调用predict()函数来预测最终回归模型的数量。
函数的作用是:获取一个或多个数据实例的数组。
下面的示例演示了如何对具有未知预期结果的多个数据实例进行回归预测。
# example of making predictions for a regression problem from keras.models import Sequential from keras.layers import Dense from sklearn.datasets import make_regression from sklearn.preprocessing import MinMaxScaler # generate regression dataset X, y = make_regression(n_samples=100, n_features=2, noise=0.1, random_state=1) scalarX, scalarY = MinMaxScaler(), MinMaxScaler() scalarX.fit(X) scalarY.fit(y.reshape(100,1)) X = scalarX.transform(X) y = scalarY.transform(y.reshape(100,1)) # define and fit the final model model = Sequential() model.add(Dense(4, input_dim=2, activation='relu')) model.add(Dense(4, activation='relu')) model.add(Dense(1, activation='linear')) model.compile(loss='mse', optimizer='adam') model.fit(X, y, epochs=1000, verbose=0) # new instances where we do not know the answer Xnew, a = make_regression(n_samples=3, n_features=2, noise=0.1, random_state=1) Xnew = scalarX.transform(Xnew) # make a prediction ynew = model.predict(Xnew) # show the inputs and predicted outputs for i in range(len(Xnew)): print("X=%s, Predicted=%s" % (Xnew[i], ynew[i]))
运行该示例进行多个预测,然后并排打印输入和预测以供查看。
X=[0.29466096 0.30317302], Predicted=[0.17097184] X=[0.39445118 0.79390858], Predicted=[0.7475489] X=[0.02884127 0.6208843 ], Predicted=[0.43370453]
只要数据实例被适当地包装在周围的列表或数组中,就可以使用相同的函数对单个数据实例进行预测。
例如:
# example of making predictions for a regression problem from keras.models import Sequential from keras.layers import Dense from sklearn.datasets import make_regression from sklearn.preprocessing import MinMaxScaler from numpy import array # generate regression dataset X, y = make_regression(n_samples=100, n_features=2, noise=0.1, random_state=1) scalarX, scalarY = MinMaxScaler(), MinMaxScaler() scalarX.fit(X) scalarY.fit(y.reshape(100,1)) X = scalarX.transform(X) y = scalarY.transform(y.reshape(100,1)) # define and fit the final model model = Sequential() model.add(Dense(4, input_dim=2, activation='relu')) model.add(Dense(4, activation='relu')) model.add(Dense(1, activation='linear')) model.compile(loss='mse', optimizer='adam') model.fit(X, y, epochs=1000, verbose=0) # new instance where we do not know the answer Xnew = array([[0.29466096, 0.30317302]]) # make a prediction ynew = model.predict(Xnew) # show the inputs and predicted outputs print("X=%s, Predicted=%s" % (Xnew[0], ynew[0]))
运行该示例进行单个预测,并打印数据实例和预测以供查看。
X=[0.29466096 0.30317302], Predicted=[0.17333156]
进一步阅读
如果你想深入了解,本节提供了更多关于该主题的资源。
- 如何训练最终的机器学习模型。
- 保存并加载你的Keras深度学习模型。
- 使用Keras逐步用Python开发你的第一个神经网络。
- Keras长短期记忆模型的5步生命周期。
- 如何利用Keras中的长、短期记忆模型进行预测。
摘要
在本教程中,你了解了如何使用Keras Python库使用最终的深度学习模型进行分类和回归预测。
具体地说,你了解到:
- 如何最终确定模型,以便为进行预测做好准备。
- 如何对Keras中的分类问题进行分类和概率预测。
- 如何在“Keras”中进行回归预测。