我写了一个代码来处理Kaggle的泰坦尼克号数据。我写的课程如下:
class Transform(BaseEstimator,TransformerMixin):
def __init__(self,select_dict={},default=False,list_of_attributes=dataset_columns,
one_hot_default=True,one_hot={}):
if list_of_attributes is None:
list_of_attributes=dataset_columns
self.attributes=select_dict #Here I select which attributes to take
self.Transformed=[]
#if default is False(True) it changes all other attributes to
#default that I do not select (to make things a little easy
def transform_Name(self,X):
#Transformation function for specific attribute
#I made such functions for every attribute and then they append
#The transformed series in self.Transformed
self.Transformed.append(X);
def transform(self,X,y=None):
#This function calls transform function of whose value is True in
#self.attributes and finally returns the DataFrame
return pd.concat(self.Transformed_Data,axis=1)
我只显示此课程的相关代码 现在,我使用SVC类SKlearn
创建一个管道transfomer=Transform(select_dict={'PassengerId': False},default=True)
svc_grid_clf=Pipeline([
('transform',transformer),
('SVC',SVC())
])
创建此管道后,我使用以下参数grid
创建GridSearchCVParam=[
{
'SVC__kernel': ['rbf'],
'SVC__C': [0.1,1,1.5]
}]
现在创建GridSearchCV对象
grid_svm=GridSearchCV(estimator=svc_grid_clf,cv=3,param_grid=Param)
#Now fitting
grid_svm.fit(X,y)
但是,我收到一些我无法理解的错误,即
ValueError:没有要连接的对象。
我认为错误是因为GridSearchCV正在调用或不调用Transformer的 init 函数,因此有时候Transformer的select_dict不会按原样运行。
答案 0 :(得分:1)
sklearn API要求您在任何地方传递估算器实例,而不是估算类。创建与sklearn兼容的估算器时,只需创建一个包含参数(但不包含数据)的对象。实际工作应该在fit / transform / ...方法中执行。
您的Transformer类似乎没有遵循这些API的想法。您不应将传递的数据存储为类的属性; Transformer.transform方法应该对传递的X矩阵起作用,而不是对self.Transformed_Data属性起作用。如何编写这样的变换器有一个example。