浅入浅出:PageRank算法 使用 TextRank 算法为文本生成关键字和摘要 基于物品的协同过滤 如何使用MapReduce实现基于物品的协同过滤(1) 如何使用MapReduce实现基于物品的协同过滤(2) 浅入浅出:K近邻算法 使用mahout下的朴素贝叶斯分类器对新闻分类 使用Affinity Propagation进行聚类 K-medoids聚类 矩阵分解在推荐系统中的应用:NMF和经典SVD实战 使用特征递归消除筛选特征 如何分配权重 比较NMF、PCA和VQ 方差和协方差 基于SVD的协同过滤 逻辑斯谛回归代码实现 隐语义模型和NMF(非负矩阵分解) 使用PCA处理MNIST数据集 使用GBDT选取特征 基于贝叶斯的文本分类系统的数据库设计 在hadoop1.2.1上安装mahout 0.9 Hadoop 2.4 实现Kmeans聚类算法 在Iris数据集上对比PCA、LDA、NMF 基于贝叶斯的文本分类实战 单层决策树 Logistic regression(逻辑斯蒂回归) 基于用户的协同过滤 词袋模型与文档-词矩阵 如何实现拼音与汉字的互相转换 梯度下降法 如何判定相似度 MovieLens数据集介绍 基于KNN的文本分类实战 Jasper文本分类系列博客阅读摘录 使用 Mean Shift进行聚类 朴素贝叶斯的三个常用模型:高斯、多项式、伯努利 使用决策树处理iris数据集 浅入浅出:从Kmeans到Kmeans++ 如何持久化scikit-learn中训练好的模型 浅入浅出:DBSCAN聚类算法(1) 浅入浅出:DBSCAN聚类算法(2) 2015阿里移动推荐算法比赛第一赛季总结 爬山算法 使用朴素贝叶斯分类器划分邮件 层次聚类 基于MapReduce的频繁项集挖掘 搜狗实体关系提取比赛

如何持久化scikit-learn中训练好的模型


#机器学习


2014-11-25

scikit-learn是一个很棒的基于python的机器学习库,易学易用。本文说一说如何持久化其训练好的模型,用高斯贝叶斯分类iris数据集作为示例。关于高斯贝叶斯,可以参考Gaussian Naive Bayes

关于iris数据集

>>> from sklearn import datasets
>>> iris = datasets.load_iris()
>>> iris.data.shape
(150, 4)
>>> iris.data[:5,:]
array([[ 5.1,  3.5,  1.4,  0.2],
       [ 4.9,  3. ,  1.4,  0.2],
       [ 4.7,  3.2,  1.3,  0.2],
       [ 4.6,  3.1,  1.5,  0.2],
       [ 5. ,  3.6,  1.4,  0.2]])
>>> iris.target
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
       2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
       2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2])

iris数据集中共有150个样本,每个样本有四个特征。这150个样本被分0、1、2这三类。iris.target存储了每个样本对应的类别。

训练高斯贝叶斯

用iris的第1到第148个样本(样本标号从0开始),共148个样本来训练高斯贝叶斯GaussianNB。

>>> from sklearn.naive_bayes import GaussianNB
>>> clf = GaussianNB()
>>> clf.fit(iris.data[1:149, :], iris.target[1:149])
>>> iris.data[1:149, :].shape
(148, 4) 
>>> clf.fit(iris.data[1:149, :], iris.target[1:149])
GaussianNB()

对第0个样本和第149个样本分类:

>>> clf.predict(iris.data[0, :])
array([0])
>>> clf.predict_proba(iris.data[0, :])
array([[  1.00000000e+00,   1.47235201e-18,   7.67420665e-26]])
>>> clf.predict(iris.data[149, :])
array([2])
>>> clf.predict_proba(iris.data[149, :])
array([[  3.70074861e-142,   6.07049597e-002,   9.39295040e-001]])

clf.predict_probaclf.predict的参数可以是一个样本或者多个样本。clf.predict_proba输出样本属于各个类别的可能性,这些可能性之和为1。clf.predict输出样本最有可能的类别。

第0个样本被分到类0,第149个样本被分到类2,正确。

使用pickle持久化训练好的模型

>>> pickle.dump(clf, open('bayes.pk', 'wb'))
>>> clf2 = pickle.load(open('bayes.pk', 'rb'))
>>> clf2.predict(iris.data[0, :])
array([0])
>>> clf2.predict_proba(iris.data[0, :])
array([[  1.00000000e+00,   1.47235201e-18,   7.67420665e-26]])
>>> clf2.predict(iris.data[149, :])
array([2])
>>> clf2.predict_proba(iris.data[149, :])
array([[  3.70074861e-142,   6.07049597e-002,   9.39295040e-001]])

使用joblib持久化训练好的模型

joblib是scikit-learn自带的工具,为numpy array做了优化。

>>> from sklearn.externals import joblib
>>> joblib.dump(clf, 'bayes.pkl')
['bayes.pkl', 'bayes.pkl_01.npy', 'bayes.pkl_02.npy', 'bayes.pkl_03.npy', 'bayes.pkl_04.npy', 'bayes.pkl_05.npy']
>>> clf3 = joblib.load('bayes.pkl')
>>> clf3.predict(iris.data[0, :])
array([0])
>>> clf3.predict(iris.data[149, :])
array([2])

joblib.dump方法在当前目录产生了多个文件,*.npy文件用于保存numpy array 类型的变量。

参考

Model persistence



( 本文完 )