所有中间步骤都应该是变压器并实施拟合和变换
All intermediate steps should be transformers and implement fit and transform
我正在实施一个使用重要特征选择的管道,然后使用相同的特征来训练我的随机森林分类器。以下是我的代码。
m = ExtraTreesClassifier(n_estimators = 10)
m.fit(train_cv_x,train_cv_y)
sel = SelectFromModel(m, prefit=True)
X_new = sel.transform(train_cv_x)
clf = RandomForestClassifier(5000)
model = Pipeline([('m', m),('sel', sel),('X_new', X_new),('clf', clf),])
params = {'clf__max_features': ['auto', 'sqrt', 'log2']}
gs = GridSearchCV(model, params)
gs.fit(train_cv_x,train_cv_y)
因此 X_new
是通过 SelectFromModel
和 sel.transform
选择的新功能。然后我想使用所选的新功能来训练我的 RF。
我收到以下错误:
All intermediate steps should be transformers and implement fit and
transform, ExtraTreesClassifier ...
就像回溯所说:管道中的每个步骤都需要有一个 fit()
和 transform()
方法(除了最后一个,它只需要 fit()
)。这是因为一个管道将每一步的数据转换链接在一起。
sel.transform(train_cv_x)
不是估算器,不符合此标准。
事实上,根据您要执行的操作,您可以省略此步骤。在内部,('sel', sel)
已经进行了这种转换——这就是它包含在管道中的原因。
其次,ExtraTreesClassifier
(管道中的第一步)也没有 transform()
方法。您可以在 class 文档字符串中验证 here。监督学习模型不是为转换数据而设计的;它们是为适应它而设计的,并以此为基础进行预测。
什么类型的 classes 能够进行转换?
- 缩放您的数据的那些。参见 preprocessing and normalization。
- 转换您的数据(以上述方式之外的其他方式)。 Decomposition 和其他无监督学习方法就是这样做的。
无需过多了解您在这里尝试做的事情,这对您有用:
- 首先使用
train_test_split
拆分 x 和 y。由此产生的测试数据集用于最终测试,GridSearchCV
交叉验证中的训练数据集将进一步分解为更小的训练集和验证集。
- 构建满足回溯试图告诉您的内容的管道。
- 将该管道传递给
GridSearchCV
,.fit()
在 X_train/y_train 上进行网格搜索,然后 .score()
在 X_test/y_test 上进行搜索。
大致看起来像这样:
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.33, random_state=444)
sel = SelectFromModel(ExtraTreesClassifier(n_estimators=10, random_state=444),
threshold='mean')
clf = RandomForestClassifier(n_estimators=5000, random_state=444)
model = Pipeline([('sel', sel), ('clf', clf)])
params = {'clf__max_features': ['auto', 'sqrt', 'log2']}
gs = GridSearchCV(model, params)
gs.fit(X_train, y_train)
# How well do your hyperparameter optimizations generalize
# to unseen test data?
gs.score(X_test, y_test)
进一步阅读的两个例子:
发生这种情况是因为您在管道中传递的第一个转换器必须同时具有 fit 和 transform 方法。
m = ExtraTreesClassifier(n_estimators = 10)
m.fit(train_cv_x,train_cv_y)
这里 m 没有转换方法,因为 ExtraTreesClassifier 模型没有转换方法,因此在管道中失败。
所以改变流水线的顺序,为流水线的第一步添加另一个转换器
我正在实施一个使用重要特征选择的管道,然后使用相同的特征来训练我的随机森林分类器。以下是我的代码。
m = ExtraTreesClassifier(n_estimators = 10)
m.fit(train_cv_x,train_cv_y)
sel = SelectFromModel(m, prefit=True)
X_new = sel.transform(train_cv_x)
clf = RandomForestClassifier(5000)
model = Pipeline([('m', m),('sel', sel),('X_new', X_new),('clf', clf),])
params = {'clf__max_features': ['auto', 'sqrt', 'log2']}
gs = GridSearchCV(model, params)
gs.fit(train_cv_x,train_cv_y)
因此 X_new
是通过 SelectFromModel
和 sel.transform
选择的新功能。然后我想使用所选的新功能来训练我的 RF。
我收到以下错误:
All intermediate steps should be transformers and implement fit and transform, ExtraTreesClassifier ...
就像回溯所说:管道中的每个步骤都需要有一个 fit()
和 transform()
方法(除了最后一个,它只需要 fit()
)。这是因为一个管道将每一步的数据转换链接在一起。
sel.transform(train_cv_x)
不是估算器,不符合此标准。
事实上,根据您要执行的操作,您可以省略此步骤。在内部,('sel', sel)
已经进行了这种转换——这就是它包含在管道中的原因。
其次,ExtraTreesClassifier
(管道中的第一步)也没有 transform()
方法。您可以在 class 文档字符串中验证 here。监督学习模型不是为转换数据而设计的;它们是为适应它而设计的,并以此为基础进行预测。
什么类型的 classes 能够进行转换?
- 缩放您的数据的那些。参见 preprocessing and normalization。
- 转换您的数据(以上述方式之外的其他方式)。 Decomposition 和其他无监督学习方法就是这样做的。
无需过多了解您在这里尝试做的事情,这对您有用:
- 首先使用
train_test_split
拆分 x 和 y。由此产生的测试数据集用于最终测试,GridSearchCV
交叉验证中的训练数据集将进一步分解为更小的训练集和验证集。 - 构建满足回溯试图告诉您的内容的管道。
- 将该管道传递给
GridSearchCV
,.fit()
在 X_train/y_train 上进行网格搜索,然后.score()
在 X_test/y_test 上进行搜索。
大致看起来像这样:
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.33, random_state=444)
sel = SelectFromModel(ExtraTreesClassifier(n_estimators=10, random_state=444),
threshold='mean')
clf = RandomForestClassifier(n_estimators=5000, random_state=444)
model = Pipeline([('sel', sel), ('clf', clf)])
params = {'clf__max_features': ['auto', 'sqrt', 'log2']}
gs = GridSearchCV(model, params)
gs.fit(X_train, y_train)
# How well do your hyperparameter optimizations generalize
# to unseen test data?
gs.score(X_test, y_test)
进一步阅读的两个例子:
发生这种情况是因为您在管道中传递的第一个转换器必须同时具有 fit 和 transform 方法。
m = ExtraTreesClassifier(n_estimators = 10)
m.fit(train_cv_x,train_cv_y)
这里 m 没有转换方法,因为 ExtraTreesClassifier 模型没有转换方法,因此在管道中失败。
所以改变流水线的顺序,为流水线的第一步添加另一个转换器