社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

手把手教你用Python库Keras做预测(附代码)

数据派THU • 5 年前 • 446 次点击  

翻译:张逸

校对:冯羽

本文约2804字,建议阅读7分钟。

本文将教你如何使用Keras这个Python库完成深度学习模型的分类与回归预测。

当你在Keras中选择好最合适的深度学习模型,就可以用它在新的数据实例上做预测了。但是很多初学者不知道该怎样做好这一点,我经常能看到下面这样的问题:

 

“我应该如何用Keras对我的模型作出预测?”

 

在本文中,你会学到如何使用Keras这个Python库完成深度学习模型的分类与回归预测。


看完这篇教程,你能掌握以下几点:


  • 如何确定一个模型,为后续的预测做准备

  • 如何用Keras对分类问题进行类及其概率的预测

  • 如何用Keras进行回归预测


现在就让我们开始吧

本文结构

教程共分为三个部分,分别是:

  • 模型确定

  • 分类预测

  • 回归预测

模型确定


在做预测之前,首先得训练出一个最终的模型。你可能选择k折交叉验证或者简单划分训练/测试集的方法来训练模型,这样做的目的是为了合理估计模型在样本集之外数据上的表现(新数据)

 

当评估完成,这些模型存在的目的也达到了,就可以丢弃他们。接下来,你得用所有的可用数据训练出一个最终的模型。关于这方面的内容,你可以在下面这个文章中得到更多的信息:


https://machinelearningmastery.com/train-final-machine-learning-model/


分类预测


对于分类问题,模型学习的是一个输入特征到输出特征之间的映射,这里的输出即为一个标签。比如“垃圾邮件”和“非垃圾邮件”

 

下边是Keras中为简单的二分类问题开发的神经网络模型的一个例子。如果说你以前没有接触过用Keras开发神经网络模型的话,不妨先看看下边这篇文章:


https://machinelearningmastery.com/tutorial-first-neural-network-python-keras/



# 训练一个最终分类的模型

from keras.models import Sequential

from keras.layers import Dense

from sklearn.datasets.samples_generator import make_blobs

from sklearn.preprocessing import MinMaxScaler

# 生成一个二分类问题的数据集

X, y = make_blobs(n_samples=100, centers=2, n_features=2, random_state=1)

scalar = MinMaxScaler()

scalar.fit(X)

X = scalar.transform(X)

# 定义并拟合模型

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)。以后你就可以随时加载这个模型,并用它进行预测了。有关这方面的示例,可以参考下边的文章:

https://machinelearningmastery.com/save-load-keras-deep-learning-models/


为了本文的结构更简洁,我们的例子中省去了这个步骤。

 

继续说回到分类预测的问题。我们希望最终得到的模型能进行两种预测:一是判断出类别,二是给出属于相应类别概率。

 

  • 类预测

 

一个类别预测会给定最终的模型以及若干数据实例,我们利用模型来判断这些实例的类别。对于新数据,我们不知道输出的是什么结果,这就是为什么首先需要一个模型。

 

在Keras中,可以利用predict_class()函数来完成我们上述所说的内容----即利用最终的模型预测新数据样本的类别。

 

需要注意的是,这个函数仅适用于Sequential模型,不适于使用功能式API开发的模型。(not those models developed using the functional API.)

 

比如,我们在名为Xnew的数组中有若干个数据实例,它被传入predict_classes()函数中,用来对这些数据样本的类别进行预测。


Xnew = [[...], [...]]

ynew = model.predict_classes(Xnew)


让我们用一个更具体的例子来说明:


# 建立一个新的分类模型

from keras.models import Sequential

from keras.layers import Dense

from sklearn.datasets.samples_generator import make_blobs

from sklearn.preprocessing import MinMaxScaler

# 生成二分类数据集

X, y = make_blobs(n_samples=100, centers=2, n_features=2, random_state=1)

scalar = MinMaxScaler()

scalar.fit(X)

X = scalar.transform(X)

# 定义并拟合最终模型

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)

# 新的未知数据实例

Xnew, _ = make_blobs(n_samples=3, centers=2, n_features=2, random_state=1)

Xnew = scalar.transform(Xnew)

# 作出预测

ynew = model.predict_classes(Xnew)

# 显示输入和输出

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()函数,比如这样:


from keras.models import Sequential

from keras.layers import Dense

from sklearn.datasets.samples_generator import make_blobs

from sklearn.preprocessing import MinMaxScaler

from numpy import array

# 生成一个二分类数据集

X, y = make_blobs(n_samples=100, centers=2, n_features=2, random_state=1)

scalar = MinMaxScaler()

scalar.fit(X)

X = scalar.transform(X)

# 定义并拟合最终的新模型

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)

# 未知的新实例

Xnew = array([[0.89337759, 0.65864154]])

# 作出预测

ynew = model.predict_classes(Xnew)

# 显示输入输出

print("X=%s, Predicted=%s" % (Xnew[0], ynew[0]))


运行上边这个例子,会得到对这个单独实例的预测结果


X=[0.89337759 0.65864154], Predicted=[0]


  • 关于类别标签的注意事项

 

准备数据时,应该将其中的类别标签转换为整数表示(比如原始数据类别可能是一个字符串),这时候你就可能会用到sklearn中的LabelEncoder。


http://scikitlearn.org/stable/modules/generated/sklearn.preprocessing.LabelEncoder.html#sklearn.preprocessing.LabelEncoder

 

当然,在我们使用LabelEcoder中的函数inverse_transform()时,还可以将那些整数表示的类别标签转换回去。


因为这个原因,在拟合最终模型时,你可能想要保存用于编码y值的LabelEncoder结果。

概率预测


另外一种是对数据实例属于某一类的可能性进行预测。它被称为“概率预测”,当给定一个新的实例,模型返回该实例属于每一类的概率值。(0-1之间)

 

在Keras中,我们可以调用predict_proba()函数来实现。举个例子:


Xnew = [[...], [...]]

ynew = model.predict_proba(Xnew)

 

在二分类问题下,Sigmoid激活函数常被用在输出层,预测概率是数据对象属于类别1的可能性,或者属于类别0的可能性(1-概率)

 

在多分类问题下,则是softmax激活函数常被用在输出层。数据对象属于每一个类别的概率作为一个向量返回。

 

下边的例子对Xnew数据数组中的每个样本进行概率预测。

from keras.models import Sequential

from keras.layers import Dense

from sklearn.datasets.samples_generator import make_blobs

from sklearn.preprocessing import MinMaxScaler

# 生成二分类数据集

X, y = make_blobs(n_samples=100, centers=2, n_features=2, random_state=1)

scalar = MinMaxScaler()

scalar.fit(X)

X = scalar.transform(X)

# 定义并拟合出最终模型

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)

# 新的未知数据

Xnew, _ = make_blobs(n_samples=3, centers=2, n_features=2, random_state=1)

Xnew = scalar.transform(Xnew)

# 做预测

ynew = model.predict_proba(Xnew)

# 显示输入输出

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]

回归预测


回归预测是一个监督学习问题,该模型学习一个给定输入样本到输出数值的映射。比如会输出0.1或0.2这样的数字。

下边是一个Keras回归的模型。

# 训练一个回归模型的例子

from keras.models import Sequential

from keras.layers import Dense

from sklearn.datasets import make_regression

from sklearn.preprocessing import MinMaxScaler

# 生成回归数据集

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))

# 定义并拟合模型

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()函数进行数值的预测。该函数以若干个实例组成的数组作为输入参数。


下面的例子演示了如何对未知的多个数据实例进行回归预测。


from keras.models import Sequential

from keras.layers import Dense

from sklearn.datasets import make_regression

from sklearn.preprocessing import MinMaxScaler

# 生成回归数据集

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))

# 定义并拟合模型

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)

# 未知的新数据

Xnew, a = make_regression(n_samples=3, n_features=2, noise=0.1, random_state=1)

Xnew = scalarX.transform(Xnew)

# 作出预测

ynew = model.predict(Xnew)

# 显示输入输出

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]


同样的,这个函数可以用于单独实例的预测,前提是它们包装成适当的格式。


举例说明:


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

# 生成回归数据集

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))

# 定义并拟合模型

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)

# 新的数据

Xnew = array([[0.29466096, 0.30317302]])

# 作出预测

ynew = model.predict(Xnew)

# 显示输入输出

print("X=%s, Predicted=%s" % (Xnew[0], ynew[0]))

运行实例并打印出结果:

X=[0.29466096 0.30317302], Predicted=[0.17333156]


延伸阅读


这部分提供了一些相关的资料,如果你想更深入学习的话可以看一看。


How to Train a Final Machine Learning Model:

https://machinelearningmastery.com/train-final-machine-learning-model/ 


Save and Load Your Keras Deep Learning Models:

https://machinelearningmastery.com/save-load-keras-deep-learning-models/


Develop Your First Neural Network in Python With Keras Step-By-Step:

https://machinelearningmastery.com/tutorial-first-neural-network-python-keras/


The 5 Step Life-Cycle for Long Short-Term Memory Models in Keras:

https://machinelearningmastery.com/5-step-life-cycle-long-short-term-memory-models-keras/


How to Make Predictions with Long Short-Term Memory Models in Keras:

https://machinelearningmastery.com/make-predictions-long-short-term-memory-models-keras/


总结:

 

在本教程中,你知道了如何使用Keras库通过最终的深度学习模型进行分类和回归预测。


具体来说,你了解到:

  • 如何确定一个模型,为后续的预测做准备

  • 如何用Keras对分类问题进行类及其概率的预测

  • 如何用Keras进行回归预测

对本文的内容有什么问题吗?在下面的评论中提出来,我将尽我所能来回答。


原文链接:

https://machinelearningmastery.com/how-to-make-classification-and-regression-predictions-for-deep-learning-models-in-keras/


译者简介


张逸,中国传媒大学大三在读,主修数字媒体技术。对数据科学充满好奇,感慨于它创造出来的新世界。目前正在摸索和学习中,希望自己勇敢又热烈,学最有意思的知识,交最志同道合的朋友。

翻译组招募信息

工作内容:将选取好的外文前沿文章准确地翻译成流畅的中文。如果你是数据科学/统计学/计算机专业的留学生,或在海外从事相关工作,或对自己外语水平有信心的朋友,数据派翻译组欢迎你们加入!

你能得到:提高对于数据科学前沿的认知,提高对外文新闻来源渠道的认知,海外的朋友可以和国内技术应用发展保持联系,数据派团队产学研的背景为志愿者带来好的发展机遇。

其他福利:和来自于名企的数据科学工作者,北大清华以及海外等名校学生共同合作、交流。

点击文末“阅读原文”加入数据派团队~

转载须知

如需转载,请在开篇显著位置注明作者和出处(转自:数据派THU ID:DatapiTHU),并在文章结尾放置数据派醒目二维码。有原创标识文章,请发送【文章名称-待授权公众号名称及ID】至联系邮箱,申请白名单授权并按要求编辑。

发布后请将链接反馈至联系邮箱(见下方)。未经许可的转载以及改编者,我们将依法追究其法律责任。


为保证发文质量、树立口碑,数据派现设立“错别字基金”,鼓励读者积极纠错

若您在阅读文章过程中发现任何错误,请在文末留言经小编确认后,数据派将向检举读者发8.8元红包

同一位读者指出同一篇文章多处错误,奖金不变。不同读者指出同一处错误,奖励第一位读者。

感谢一直以来您的关注和支持,希望您能够监督数据派产出更加高质的内容。

点击“阅读原文”拥抱组织


今天看啥 - 高品质阅读平台
本文地址:http://www.jintiankansha.me/t/xmT1Cqqhk7
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/12802
 
446 次点击