1.分析问题,确定输入和输出
比如:中英翻译,输入: 苹果 输出: apple
确定了输入和输出后,要想办法将输入和输出抽象成一些数字,因为计算机只能为你处理数字。比如说,你输入一朵花,输出一个分类。我们知道花是不输入到电脑的,我们要将一朵花抽象成一些数字,这些数字代表了这朵花的特征,一朵花可能会有许许多多特征,我们选出一些具有代表的特征来,将这些特征有数字来表达,比花瓣的长、宽、花萼的长、宽等等。它的输出我们也用数字来表征。
2.基于输入和输出,构建数据集
这个数据集包括了输入集和输出集,输入集的每行特征对就输出集的一行,它们是一一相对,特征对应标签。(记住,这些对应关系一定是正确的,不是凭空捏造的),因为人工智能算法是基于数据的,就是人工智能算法做就是帮忙构建出或找到一个函数,这个函数能够完成输入集到输出集的映射。说白了,就是为这些数据集找能一个映射函数。
3、寻找一个合适的算法来构建模型,完成输入到输出的映射
算法有很多,我们可以根据需要去拿一个合适的来使用。为什么说是构建模型呢,前面我们说了是要找一个映射函数,这个函数只在训练完成后才会有,此时模型才存在。
4、部署模型,进行系统集成
模型生成完成后,下一步就是要考虑到模型部署到服务器,与其他系统进行集成。
- 第一步要把生成的模型保存到硬盘,就是做模型的序列化工作
- 第二步就是在部署环境中加载模型,完成部署。
以上两步可以pickle或joblib来完成。
代码演示
我们用scikit-learn这个机器学习库来完成一些演示,因为里面有现成的数据集,比较方便演示。
需求:鸢尾花分类问题,模型要做到在提供相应鸢尾花特征数据的输入后,输出这个鸢尾花的所属类。如果我们不懂鸢尾花的分类,那么我们就要请求相应的专家获得相关知识。对鸢尾花进行分类,已知它有三个分类。
第一步:确定输入与输出并用数字化刻画
输入:我们要数字化刻画鸢尾花这个实体。经过特征遴选,我们选择了它的四个主要特征::花瓣⻓,花瓣宽,花萼⻓,花萼宽
输出:从零开始编号0, 1, 2,我们用数字代表分类。对于创建数据的人,他/她当然是知道0,1,2具体代表什么分类名。
第二步:根据第一步准备数据集
# 引入鸢尾花数据集,scikit库它只提供了150条数据供我们使用,实际生产中,这肯定是远远不够的,
from sklearn.datasets import load_iris
# 下面的return_X为输入集,return_y输出集,其实这样叫不太好,最合适的叫法是return_X为特征集,return_y为标签集
return_X,return_y = load_iris(return_X_y=True)
# 我们数据集分出一部分用来测试,使用scikit库的train_test_split对数据集进行拆分
from sklearn.model_selection import train_test_split
# 留出%20的数据用于测试
X_train,X_test,y_train,y_test = train_test_split(return_X,return_y,test_size=0.2)
第三步:选择一种机器算法来进行训练,我这里选择K-nearest neighbors(K-紧近邻算法)
# 引入Knn算法
from sklearn.neighbors import KNeighborsClassifier
# Knn算法对象
knn=KNeighborsClassifier(5)
# 开始训练,中文也称其为拟合,其实就是为这一堆数据寻找一个从特征特征集到标签集的映射函数,所以现在知道为要数字化输入输出了吧。
knn.fit(X_train,y_train)
#fit执行完成就是训练完成了。
模型已生成,模型就是上面的knn对象,我们现在可以用到来预测一下,我就用X_test,看看它是否能够预测出对应的标签,答案在y_test中:
# 预测
re = knn.predict(X_test)
# 计算一下预测的准确率
(re == y_test).mean()
0.9
这个准确率是会波动的,也就是它不是固定的。预测肯定是有时准备一些有些差一些,这和提供的数据和算法有关。上面都用到numpy作为它的科学计算工具。
第四步:保存模型,并在部署环境部署模型,在软件领域,就是将对象按一定的字节顺序保存到硬盘的一个文件上,这叫序列化,反过来就是反序列化。
pickle和joblib两个python工具都能做这件事,我们分别演示一下:
pickle:
保存:
#将knn模型保存到knn.wong这个文件中
import pickle
pickle.dump(knn,open('knn.wong','wb'))
加载:
import pickle
loaded_knn = pickle.load(open('knn.wong','rb'))
# loaded_knn这个模型就可以拿来预测了,如:
from sklearn.datasets import load_iris
X,y = load_iris(return_X_y=True)
loaded_knn.score(X,y)
#因为手上确实没有其他数据了,所以只好再拿鸢尾花来作例
joblib:
保存:
import joblib
joblib.dump(knn,'knn.fling')
加载:
loaded_myknn=joblib.load('knn.fling')
# myknn这个模型就可以拿来预测了,如:
loaded_myknn.score(X,y)