关于python:Pickle懒惰学习者

Pickle Lazy Learners

Pickle是否为像KNeighboursClassifier形式的sci-kit这样的懒惰学习者保存培训数据?如果是这样,我们可以从泡菜对象访问此数据吗? (寻求数据隐私问题)*

例如:

1
2
3
4
5
6
7
8
knn.fit(Xtrain, Ytrain)

saved_model = pickle.dumps(knn)

knn_from_pickle = pickle.loads(saved_model)

#This function works after directly loading pickled object (saved_model) and gives correct and logical output
knn_from_pickle.predict(Xtest)

knn_from_pickle或save_model变量是否包含Xtrain数据?由于Knn是一个懒惰的学习者,需要进行距离计算,因此有关训练数据Xtrain的新数据到达时。当我打印knn_from_pickle时,仅显示传递给KNeighboursClassifier算法的超参数。

正如我观察到的那样,对于具有所有数据转换的65KB数据文件(Xtrain),并将全部数据用于训练,当knn模型适合并序列化时,如下所示:

1
2
saved_model = pickle.dumps(knn)
sys.getsizeof(saved_model)

已占用空间为238744字节

而其他算法(例如高斯朴素贝叶斯)的腌制对象所占用的空间为:

1
2
saved_model = pickle.dumps(gnb)
sys.getsizeof(saved_model)

占用的空间为6074字节,对于像重随机森林这样的繁重算法:

1
2
saved_model = pickle.dumps(rf)
sys.getsizeof(saved_model)

已占用空间为48863字节

看到KNN与其他算法的腌制对象之间存在如此大的空间差异,腌制必须以某种方式存储KNN的训练数据。如果是,该如何访问?或者knn如何存储在泡菜中,如果没有,那么使用无配合的预测并给出正确的答案如何去除未腌制的对象(knn_from_pickle)?


是的,数据保存在私有属性中,但是由于python实际上并不尊重私有方法/属性,因此在公布拟合模型之前,您需要牢记隐私问题。

对于KNeighborsClassifier,该属性为_fit_X(在编写本文时;作为私有属性,开发人员不会考虑太多更改)。