Dear scikit-learn developers,

I am developing a transformer, named Sqizer, that has the ultimate goal of modifying a kernel for use with the sklearn.svm package. When given an input data array XSqizer.transform(X) should have as its output the Gram matrix for X using the modified version of the kernel. Here is the code for the class so far:

class Sqizer(BaseEstimator, TransformerMixin):

    def __init__(self, C=1.0, kernel='rbf', degree=3, gamma=1,
                     coef0=0.0, cut_ord_pair=(2,1)):
            self.C = C
            self.kernel = kernel
            self.degree = degree
            self.gamma = gamma
            self.coef0 = coef0
            self.cut_ord_pair = cut_ord_pair

    def fit(self, X, y=None):
        # Check that X and y have correct shape
        X, y = check_X_y(X, y)
        # Store the classes seen during fit
        self.classes_ = unique_labels(y)

        self.X_ = X
        self.y_ = y
        return self

    def transform(self, X):

        X = check_array(X, warn_on_dtype=True)

        """Returns Gram matrix corresponding to X, once sqized."""
        def kPolynom(x,y):
            return (self.coef0+self.gamma*np.inner(x,y))**self.degree
        def kGauss(x,y):
            return np.exp(-self.gamma*np.sum(np.square(x-y)))
        def kLinear(x,y):
            return np.inner(x,y)
        def kSigmoid(x,y):
            return np.tanh(self.gamma*np.inner(x,y) +self.coef0)

        def kernselect(kername):
            switcher = {
                'linear': kPolynom,
                'rbf': kGauss,
                'sigmoid': kLinear,
                'poly': kSigmoid,
                    }
            return switcher.get(kername, "nothing")

        cut_off = self.cut_ord_pair[0]
        order = self.cut_ord_pair[1]

        from SeqKernel import hiSeqKernEval

        def getGram(Y):
            gram_matrix = np.zeros((Y.shape[0], Y.shape[0]))
            for row1ind in range(Y.shape[0]):
                for row2ind in range(X.shape[0]):
                    gram_matrix[row1ind,row2ind] = \
                    hiSeqKernEval(Y[row1ind],Y[row2ind],kernselect(self.kernel),\
                    cut_off,order)
            return gram_matrix

        return getGram(X)

However, when I run the check_estimator method on Sqizer, I get an error with the following check:

# raises error on malformed input for transform
if hasattr(X, 'T'):
    # If it's not an array, it does not have a 'T' property
    assert_raises(ValueError, transformer.transform, X.T)

How do I alter my code to pass this test? Could my estimator trip up on any further tests?

I have attached the relevant .py files if you require a bigger picture. This particular snippet comes from the OptimalKernel.py file.



Many thanks,

Sam Barnett