当我使用pipeline对象时,
-
当我使用
.fit()
方法时,pipeline对象是否会拟合并转换训练数据?还是我应该使用.fit_transform()
方法?这两者有什么区别? -
当我对测试数据使用
.predict()
方法时,pipeline对象是否会先转换测试数据然后再进行预测?也就是说,我是否应该在使用.predict()
方法之前使用.transform()
方法来转换测试数据?
这是我使用的代码:
import pandas as pdimport numpy as npfrom sklearn.model_selection import train_test_splitfrom sklearn.feature_selection import SelectKBest, f_classiffrom sklearn.decomposition import PCAfrom sklearn.tree import DecisionTreeClassifier#creating some dataX, y = np.ones((50, 1)), np.hstack(([0] * 45, [1] * 5))#creating the pipelinesteps = [('scaler', StandardScaler()), ('SelectKBest', SelectKBest(f_classif, k=3)), ('pca', PCA(n_components=2)), ('DT', DecisionTreeClassifier(random_state=0))]model = Pipeline(steps=steps)#splitting the dataX_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.33, random_state=42)model.fit(X_train,y_train)model.predict(X_test)
回答:
Pipeline对象暴露了其最后一步的方法。由于你的最后一步是DecisionTreeClassifier
(一个估计器),pipeline将不会有fit_transform()
方法,但会具有估计器函数如fit()
、predict()
、score()
等。
当使用fit()
时,pipeline会对所有转换器调用fit_transform()
,最后对估计器调用fit()
。
当使用predict()
时,pipeline会transform()
所有数据,然后对估计器调用predict()
。
如图所示:(图片来自Raschka, Sebastian. Python machine learning. Birmingham, UK: Packt Publishing, 2015. Print)