On 10/24/18 4:11 AM, Manuel Castejón Limas wrote:
Dear all,
as a way of improving the documentation of PipeGraph we intend to provide more examples of its usage. It was a popular demand to show application cases to motivate its usage, so here it is a very simple case with two steps: a KMeans followed by a LDA.

https://mcasl.github.io/PipeGraph/auto_examples/plot_Finding_Number_of_clusters.html#sphx-glr-auto-examples-plot-finding-number-of-clusters-py

This short example points out the following challenges:
- KMeans is not a transformer but an estimator

KMeans is a transformer in sklearn: http://scikit-learn.org/stable/modules/generated/sklearn.cluster.KMeans.html#sklearn.cluster.KMeans.transform

(you can't get the labels to be the output which is what you're doing here, but it is a transformer)

- LDA score function requires the y parameter, while its input does not come from a known set of labels, but from the previous KMeans
- Moreover, the GridSearchCV.fit call would also require a 'y' parameter

Not true if you provide a scoring that doesn't require y or if you don't specify scoring and the scoring method of the estimator doesn't require y.

GridSearchCV.fit doesn't require y.

- It would be nice to have access to the output of the KMeans step as well.

PipeGraph is capable of addressing these challenges.

The rationale for this example lies in the identification-reconstruction realm. In a scenario where the class labels are unknown, we might want to associate the quality of the clustering structure to the capability of a later model to be able to reconstruct this structure. So the basic idea here is that if LDA is capable of getting good results it was because the information of the KMeans was good enough for that purpose, hinting the discovery of a good structure.

Can you provide a citation for that? That seems to heavily depend on the clustering algorithms and the classifier.
To me, stability scoring seems more natural: https://arxiv.org/abs/1007.1075

This does seem interesting as well, though, haven't thought about this.

It's cool that this is possible, but I feel this is still not really a "killer application" in that this is not a very common pattern.

Also you could replicate something similar in sklearn with

def estimator_scorer(testing_estimator):
    def my_scorer(estimator, X, y=None):
        y = estimator.predict(X)

        return np.mean(cross_val_score(testing_estimator, X, y))

Though using that we'd be doing nested cross-validation on the test set...
That's a bit of an issue in the current GridSearchCV implementation :-/ There's an issue by Joel somewhere to implement something that allows training without splitting which is what you'd want here. You could run the outer grid-search with a custom cross-validation iterator that returns all indices as training and test set and only does a single split, though...

class NoSplitCV(object):

    def split(self, X, y, class_weights):

        indices = np.arange(_num_samples(X))
        yield indices, indices

Though I acknowledge that your code only takes 4 lines, while mine takes 8 (thought if we'd add NoSplitCV to sklearn mine would also only take 4 lines :P)

I think pipegraph is cool, not meaning to give you a hard time ;)

_______________________________________________
scikit-learn mailing list
scikit-learn@python.org
https://mail.python.org/mailman/listinfo/scikit-learn

Reply via email to