我在问自己关于sklearn中的fit方法的各种问题。
问题1:当我这样做时:
from sklearn.decomposition import TruncatedSVD
model = TruncatedSVD()
svd_1 = model.fit(X1)
svd_2 = model.fit(X2)
变量模型的内容在这个过程中是否发生了任何变化?
问题2:当我这样做时:
from sklearn.decomposition import TruncatedSVD
model = TruncatedSVD()
svd_1 = model.fit(X1)
svd_2 = svd_1.fit(X2)
svd_1发生了什么?换句话说,svd_1已经被拟合了,我再次拟合它,那么它的组件发生了什么?
问题1:变量模型的内容在过程中是否发生了任何变化?
是的。fit
方法修改对象。它返回对对象的引用。因此,小心!在第一个示例中,所有三个变量model
、svd_1
和svd_2
实际上都指向同一对象。
from sklearn.decomposition import TruncatedSVD
model = TruncatedSVD()
svd_1 = model.fit(X1)
svd_2 = model.fit(X2)
print(model is svd_1 is svd_2) # prints True
问题2:svd_1发生了什么?
model
和svd_1
指的是同一对象,因此第一个示例和第二个示例之间绝对没有区别。
最后备注:在这两个例子中发生的情况是,fit(X1)
的结果被fit(X2)
覆盖,正如David Maust在回答中指出的那样。如果你想让两个不同的模型适应两组不同的数据,你需要做这样的事情:
svd_1 = TruncatedSVD().fit(X1)
svd_2 = TruncatedSVD().fit(X2)
在TruncatedSVD
上调用fit
时。它将用根据新矩阵构建的组件替换这些组件。scikit中的一些估计器和转换器(如IncrementalPCA)有一个partial_fit
,它将通过添加额外数据来逐步构建模型。