在 scikit-learn 中拟合数据与转换数据
Fitting data vs. transforming data in scikit-learn
在scikit-learn中,所有的估计器都有一个fit()
方法,并且根据它们是有监督还是无监督,它们也有一个predict()
或transform()
方法。
我正在为无监督学习任务编写 transformer,想知道在何处放置哪种学习逻辑是否有经验法则。官方文档在这方面帮助不大:
fit_transform(X, y=None, **fit_params)
Fit to data, then transform it.
在此上下文中,拟合数据和转换数据是什么意思?
在这种情况下,调用 fit
方法不会执行任何操作。正如您在 this example 中所见,并非所有转换器都需要使用 fit
或 transform
方法实际执行某些操作。我的猜测是 scikit-learn 中的每个 class 都应该实现拟合、变换 and/or 预测,以便它与包的其余部分保持一致。不过我想这确实有点大材小用了。
拟合查找将用于转换数据的模型的内部参数。转换将参数应用于数据。您可以将模型拟合到一组数据,然后将其转换到完全不同的一组。
例如,您将线性模型拟合到数据以获得斜率和截距。然后使用这些参数将 x
的新值或现有值转换(即映射)为 y
.
fit_transform
只是对同一数据执行这两个步骤。
一个 scikit 示例:您拟合数据以找到主成分。然后转换数据以查看它如何映射到这些组件:
from sklearn.decomposition import PCA
pca = PCA(n_components=2)
X = [[1,2],[2,4],[1,3]]
pca.fit(X)
# This is the model to map data
pca.components_
array([[ 0.47185791, 0.88167459],
[-0.88167459, 0.47185791]], dtype=float32)
# Now we actually map the data
pca.transform(X)
array([[-1.03896057, -0.17796634],
[ 1.19624651, -0.11592512],
[-0.15728599, 0.29389156]])
# Or we can do both "at once"
pca.fit_transform(X)
array([[-1.03896058, -0.1779664 ],
[ 1.19624662, -0.11592512],
[-0.15728603, 0.29389152]], dtype=float32)
正如其他答案所解释的那样,fit
不需要做任何事情(returning 转换器对象除外)。有了它,所有转换器都具有相同的接口,并且可以很好地处理管道之类的东西。
当然,一些转换器需要一个 fit
方法(想想 tf-idf,PCA...)来实际做事。
transform
方法需要 return 转换后的数据。
fit_transform
是一种链接拟合和变换操作的便捷方法。您可以通过从 TransformerMixin
派生自定义转换器 class 并实施 fit
和 transform
.
来免费获得它(!)
在scikit-learn中,所有的估计器都有一个fit()
方法,并且根据它们是有监督还是无监督,它们也有一个predict()
或transform()
方法。
我正在为无监督学习任务编写 transformer,想知道在何处放置哪种学习逻辑是否有经验法则。官方文档在这方面帮助不大:
fit_transform(X, y=None, **fit_params)
Fit to data, then transform it.
在此上下文中,拟合数据和转换数据是什么意思?
在这种情况下,调用 fit
方法不会执行任何操作。正如您在 this example 中所见,并非所有转换器都需要使用 fit
或 transform
方法实际执行某些操作。我的猜测是 scikit-learn 中的每个 class 都应该实现拟合、变换 and/or 预测,以便它与包的其余部分保持一致。不过我想这确实有点大材小用了。
拟合查找将用于转换数据的模型的内部参数。转换将参数应用于数据。您可以将模型拟合到一组数据,然后将其转换到完全不同的一组。
例如,您将线性模型拟合到数据以获得斜率和截距。然后使用这些参数将 x
的新值或现有值转换(即映射)为 y
.
fit_transform
只是对同一数据执行这两个步骤。
一个 scikit 示例:您拟合数据以找到主成分。然后转换数据以查看它如何映射到这些组件:
from sklearn.decomposition import PCA
pca = PCA(n_components=2)
X = [[1,2],[2,4],[1,3]]
pca.fit(X)
# This is the model to map data
pca.components_
array([[ 0.47185791, 0.88167459],
[-0.88167459, 0.47185791]], dtype=float32)
# Now we actually map the data
pca.transform(X)
array([[-1.03896057, -0.17796634],
[ 1.19624651, -0.11592512],
[-0.15728599, 0.29389156]])
# Or we can do both "at once"
pca.fit_transform(X)
array([[-1.03896058, -0.1779664 ],
[ 1.19624662, -0.11592512],
[-0.15728603, 0.29389152]], dtype=float32)
正如其他答案所解释的那样,fit
不需要做任何事情(returning 转换器对象除外)。有了它,所有转换器都具有相同的接口,并且可以很好地处理管道之类的东西。
当然,一些转换器需要一个 fit
方法(想想 tf-idf,PCA...)来实际做事。
transform
方法需要 return 转换后的数据。
fit_transform
是一种链接拟合和变换操作的便捷方法。您可以通过从 TransformerMixin
派生自定义转换器 class 并实施 fit
和 transform
.