【发布时间】:2015-09-08 10:34:51
【问题描述】:
如果我排除我的自定义转换器,GridSearchCV 运行良好,但会出错。 这是一个假数据集:
import pandas
import numpy
from sklearn_pandas import DataFrameMapper
from sklearn_pandas import cross_val_score
from sklearn.pipeline import Pipeline
from sklearn.grid_search import GridSearchCV
from sklearn.base import TransformerMixin
from sklearn.preprocessing import LabelBinarizer
from sklearn.ensemble import RandomForestClassifier
import sklearn_pandas
from sklearn.preprocessing import MinMaxScaler
df = pandas.DataFrame({"Letter":["a","b","c","d","a","b","c","d","a","b","c","d","a","b","c","d"],
"Number":[1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4],
"Label":["G","G","B","B","G","G","B","B","G","G","B","B","G","G","B","B"]})
class MyTransformer(TransformerMixin):
def transform(self, x, **transform_args):
x["Number"] = x["Number"].apply(lambda row: row*2)
return x
def fit(self, x, y=None, **fit_args):
return self
x_train = df
y_train = x_train.pop("Label")
mapper = DataFrameMapper([
("Number", MinMaxScaler()),
("Letter", LabelBinarizer()),
])
pipe = Pipeline([
("custom", MyTransformer()),
("mapper", mapper),
("classifier", RandomForestClassifier()),
])
param_grid = {"classifier__min_samples_split":[10,20], "classifier__n_estimators":[2,3,4]}
model_grid = sklearn_pandas.GridSearchCV(pipe, param_grid, verbose=2, scoring="accuracy")
model_grid.fit(x_train, y_train)
错误是
list indices must be integers, not str
当我的管道中有自定义转换器时,如何使 GridSearchCV 工作?
【问题讨论】:
-
您可以添加您的
import语句,以便我可以运行您的代码吗? -
+1 表示之前的评论。没有时间查看无法重现错误的代码。可能有必要从
BaseEstimator和TransformerMixin继承,但我的错误似乎并不指向那个方向。完整的回溯也很好...... -
我得到一个不同的错误:
AttributeError: 'MyTransformer' object has no attribute 'get_params' -
是的,您需要将 BaseEstimator 添加到您的估算器的超类列表中。
-
我没有解决方案,但看起来问题出在非数字功能上。当您从
df中取出它时,它工作正常。问题可能是,当特征都是数字时,DataFrame可以强制转换为 Numpyarray,但是当存在非数字特征时,它会被强制转换为list。如果您将print(type(x))放入MyTransformer.transform,您可以看到这一点
标签: python pandas scikit-learn