Sklearn - 拟合、缩放和转换

4
sklearn中的fit()方法在同一接口中似乎有不同的用途。
当应用于训练集时,如下所示:
model.fit(X_train, y_train)

fit()用于学习参数,并在测试集上使用predict(X_test)。然而,有些情况下fit()并不涉及“学习”,只是对数据进行一些归一化处理,例如:

min_max_scaler = preprocessing.MinMaxScaler()
min_max_scaler.fit(X_train)

这将简单地将特征值在0到1之间进行缩放,以避免某些具有较高差异性的特征对模型产生不成比例的影响。


更加令人费解的是,有时需要在已经进行了缩放(似乎已经进行了转换)的fit()方法后跟随进一步的transform()方法,然后再次使用fit()方法来实际学习和构建模型,如下所示:

X_train2 = min_max_scaler.transform(X_train)
X_test2 = min_max_scaler.transform(X_test)

# the model being used
knn = KNeighborsClassifier(n_neighbors=3,metric="euclidean")
# learn parameters
knn.fit(X_train2, y_train)
# predict
y_pred = knn.predict(X_test2)

请问有人能够澄清fit()的用法或多种用法,以及缩放和转换数据的区别吗?

2个回答

3

fit() 函数提供了一个通用的接口,可以在所有scikit-learn对象之间共享。

这个函数以 X ( 有时还有 y) 数组作为参数来计算对象的统计信息。例如,在MinMaxScaler transformer上调用fit将计算其统计信息(data_min_data_max_data_range_ 等)。

因此,我们应该把 fit() 函数视为计算对象必要统计信息的方法。

这种通用接口非常有帮助,因为它允许使用 Pipeline 来将转换器和评估器组合起来。这样一来,就可以一次性计算和预测所有步骤,如下所示:

from sklearn.pipeline import make_pipeline
from sklearn.datasets import make_classification

from sklearn.preprocessing import MinMaxScaler
from sklearn.neighbors import NearestNeighbors


X, y = make_classification(n_samples=1000)
model = make_pipeline(MinMaxScaler(), NearestNeighbors())
model.fit(X, y)

这也提供了将整个模型序列化为单个对象的可能性。
没有这个组合模块,我可以同意您的观点,即使用独立的Transformer和Estimator并不是很实用。

2
scikit-learn中,有三个类共享接口:估计器(Estimators)转换器(Transformers)预测器(Predictors)估计器具有fit()函数,它始终用于估计基于数据集的参数。 转换器具有transform()函数。它返回转换后的数据集。一些估计器也是转换器,例如MinMaxScaler()预测器具有predict()函数,它返回新实例的预测结果,例如KNeighborsClassifier()MinMaxScaler()KNeighborClassifier()都包含fit()方法,因为它们共享估计器的接口。

然而,在某些情况下,fit()没有涉及“学习”。

事实上,涉及了“学习”。转换器MinMaxScaler()必须“学习”每个数字特征的最小值和最大值。当您调用min_max_scaler.fit(X_train)时,您的缩放器会估算训练集中每个数字列的值。 min_max_scaler.transform(X_train)基于估算结果缩放训练集。min_max_scaler.transform(X_test)使用为训练集学习的估算值来缩放测试集。这对于使用相同的估算值缩放训练集和测试集非常重要。
如需进一步了解,请参阅:https://arxiv.org/abs/1309.0238

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接