【发布时间】:2017-01-17 07:22:37
【问题描述】:
在为 sk-learn 编写我的第一个管道时,当只有一部分列被放入管道时,我偶然发现了一些问题:
mydf = pd.DataFrame({'classLabel':[0,0,0,1,1,0,0,0],
'categorical':[7,8,9,5,7,5,6,4],
'numeric1':[7,8,9,5,7,5,6,4],
'numeric2':[7,8,9,5,7,5,6,"N.A"]})
columnsNumber = ['numeric1']
XoneColumn = X[columnsNumber]
我使用functionTransformer 喜欢:
def extractSpecificColumn(X, columns):
return X[columns]
pipeline = Pipeline([
('features', FeatureUnion([
('continuous', Pipeline([
('numeric', FunctionTransformer(columnsNumber)),
('scale', StandardScaler())
]))
], n_jobs=1)),
('estimator', RandomForestClassifier(n_estimators=50, criterion='entropy', n_jobs=-1))
])
cv.cross_val_score(pipeline, XoneColumn, y, cv=folds, scoring=kappaScore)
这会导致:TypeError: 'list' object is not callable 启用功能转换器时。
编辑:
如果我像下面那样实例化ColumnExtractor,则不会返回任何错误。但是functionTransformer 不是仅适用于像这样的简单案例并且应该可以正常工作吗?
class ColumnExtractor(TransformerMixin):
def __init__(self, columns):
self.columns = columns
def transform(self, X, *_):
return X[self.columns]
def fit(self, *_):
return self
【问题讨论】:
-
不应该是
XoneColumn = X[columnsNumber]是XoneColumn = mydf[columnsNumber]? -
也在你的github中查看问题2,从
train_test_split返回的索引是序数索引值,所以我建议在dfs上使用.ilocX_train = X.iloc[train_index] X_test = X.iloc[test_index] y_train = y.iloc[train_index] y_test = y.iloc[test_index] -
sklearn 代码假定一切都是 np 数组,因此您可以选择使用属性
.values将 pandas df 转换为 np 数组或使用pandas索引器,例如 @987654335 @、loc和ix -
@EdChurn 在单元格 3 中我转换 mydf itno 2 部分 X, y = transform(mydf) 所以 X 应该没问题。无论如何,mydf 也不能正常工作。谢谢你帮我解决了问题2。但是最后一个问题3没有解决。
-
如果我在这里尝试使用
cv.cross_val_score(pipeline, XoneColumn.values, y, cv=folds, scoring=kappaScore).values,同样的错误仍然存在
标签: python scikit-learn pipeline transformer