python预测实例教程_手把手教你用Python库Keras做预测(附代码)-阿里云开发者社区...
当你在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进行回归预测
对本文的内容有什么问题吗?在下面的评论中提出来,我将尽我所能来回答。
原文发布时间为:2018-05-30
本文作者:数据派
本文来自云栖社区合作伙伴“数据派THU”,了解相关信息可以关注“数据派THU”。
python预测实例教程_手把手教你用Python库Keras做预测(附代码)-阿里云开发者社区...相关推荐
- python自助电影售票机_手把手教你用python抢票回家过年(代码简单)
首先看看如何快速查看剩余火车票? 当你想查询一下火车票信息的时候,你还在上12306官网吗?或是打开你手机里的APP?下面让我们来用Python写一个命令行版的火车票查看器, 只要在命令行敲一行命令就 ...
- python时间序列动图_手把手教你用Python进行时间序列分解和预测
来源:数据派THU(ID:DatapiTHU) ▔ 作者:Mohit Sharma 翻译:王闯(Chuck) 校对:王可汗 预测是一件复杂的事情,在这方面做得好的企业会在同行业中出类拔萃.时间序列预测 ...
- python numpy安装教程_手把手教你搭建机器学习开发环境—Python与NumPy的超简安装教程...
手把手教你搭建机器学习开发环境Python语言是机器学习的基础,所以,想要入门机器学习,配置好Python的开发环境是第一步.本文就手把手的教你配置好基于Python的机器学习开发环境.超简单!第一步 ...
- python bokeh教程_手把手教你用Bokeh进行可视化数据分析(附源码)
Bokeh与Python可视化领域中的流行库Matplotlib和Seaborn不同,它使用HTML和JavaScript渲染其图形,这使得它在构建基于Web的应用中成为一个非常理想的候选者.它对于探 ...
- python如何编游戏_手把手教你用python写游戏
引言 最近python语言大火,除了在科学计算领域python有用武之地之外,在游戏.后台等方面,python也大放异彩,本篇博文将按照正规的项目开发流程,手把手教大家写个python小游戏,项目来自 ...
- python如何训练模型生产_手把手教你用Python构建你的第一个多标签图像分类模型(附案例)...
你正在处理图像数据吗?我们可以使用计算机视觉算法来做很多事情: 对象检测 图像分割 图像翻译 对象跟踪(实时),还有更多-- 这让我思考--如果一个图像中有多个对象类别,我们该怎么办?制作一个图像分类 ...
- python时间序列预测不连续怎么办_手把手教你用Python处理非平稳时间序列(附代码)...
本文约3600字,建议阅读10分钟. 本文将重点介绍时间序列数据的平稳性检验方法. 简介 预测一个家庭未来三个月的用电量,估计特定时期道路上的交通流量,预测一只股票在纽约证券交易所交易的价格--这些问 ...
- python图片字符画教程_手把手教你用python将图片做成字符画!
字符视觉排序 我们可以看到list中左边的字符视觉上较深,右边的字符视觉上较浅. 打开图片,调整大小 打开我们需要转化的图片,并将图片调整为我们所指定的宽和高(字符画的宽和高) 我们使用PIL来进行图 ...
- python表格处理免费教程_手把手教你用Python处理Excel表格
openpyxl是一个第三方库,可以处理xlsx格式的Excel文件.pip install openpyxl安装. 读取Excel文件 需要导入相关函数from openpyxl import lo ...
最新文章
- CUDA and cudnn 历史版本归档地址
- vue 圆形百分比进度条_vue实用组件——圆环百分比进度条
- c++ 用指针将函数作为参数传参
- Gnome Subtitles 0.0.1
- 【JUC】第二章 线程间通信、集合的线程安全
- PowerBI功能发布时间线
- java的人patch方法_java – Spring MVC PATCH方法:部分更新
- pr预设的卷及内核锐化是什么_PR2018-认识模糊和锐化特效使用
- 【Masm】使用教程
- pve虚拟化几台服务器,PVE开启嵌套虚拟化
- KEAZ128 时钟配置
- 研究生生涯的一些经验和感悟
- What Plants Need to Grow
- 算法介绍 | 泛洪算法(Flood fill Algorithm)
- 训练好的深度学习模型是怎么部署的?
- Vue Video.js播放m3u8视频流格式(video+videojs-contrib-hl)
- 1700人参加的钢铁行业盛会,下面是你必须知道的!
- 服务办公软件金山偷换“核高基”重大软件专项课题名称,瞒天过海,欺骗大众...
- 首批实现QQ在RTOS端应用部署 展锐持续深耕穿戴生态
- 丁磊进退之道《前程密码》
热门文章
- 基于JAVA+Servlet+JSP+MYSQL的党员信息管理系统
- httpservletresponse 重定向浏览器不变的原因_正确区分火狐浏览器(Firefox)中国版和国际版amp;下载方法...
- day4.编程语言简介
- node.js 回调函数
- 软件工程个人作业4(课堂练习课堂作业)
- ccpc中国大学生首届程序设计竞赛
- jquery.eq()
- Salesforce 中获取数据表字段的 picklist 的值
- 【算法14】找出数组中两个只出现一次的数字
- vim 批量替换字符串_Vim 有什么奇技淫巧?