[scikit-learn] MLPClassifier as a feature selector
Gael Varoquaux
gael.varoquaux at normalesup.org
Fri Dec 29 12:14:15 EST 2017
I think that a transform method would be good. We would have to add a parameter to the constructor to specify which layer is used for the transform. It should default to "-1", in my opinion.
Cheers,
Gaël
Sent from my phone. Please forgive typos and briefness.
On Dec 29, 2017, 17:48, at 17:48, "Javier López" <jlopez at ende.cc> wrote:
>Hi Thomas,
>
>it is possible to obtain the activation values of any hidden layer, but
>the
>procedure is not completely straight forward. If you look at the code
>of
>the `_predict` method of MLPs you can see the following:
>
>```python
> def _predict(self, X):
> """Predict using the trained model
>
> Parameters
> ----------
> X : {array-like, sparse matrix}, shape (n_samples, n_features)
> The input data.
>
> Returns
> -------
> y_pred : array-like, shape (n_samples,) or (n_samples, n_outputs)
> The decision function of the samples for each class in the
>model.
> """
> X = check_array(X, accept_sparse=['csr', 'csc', 'coo'])
>
> # Make sure self.hidden_layer_sizes is a list
> hidden_layer_sizes = self.hidden_layer_sizes
> if not hasattr(hidden_layer_sizes, "__iter__"):
> hidden_layer_sizes = [hidden_layer_sizes]
> hidden_layer_sizes = list(hidden_layer_sizes)
>
> layer_units = [X.shape[1]] + hidden_layer_sizes + \
> [self.n_outputs_]
>
> # Initialize layers
> activations = [X]
>
> for i in range(self.n_layers_ - 1):
> activations.append(np.empty((X.shape[0],
> layer_units[i + 1])))
> # forward propagate
> self._forward_pass(activations)
> y_pred = activations[-1]
>
> return y_pred
>```
>
>the line `y_pred = activations[-1]` is responsible for extracting the
>values for the last layer,
>but the `activations` variable contains the values for all the neurons.
>
>You can make this function into your own external method (changing the
>`self` attribute by
>a proper parameter) and add an extra argument which specifies the
>layer(s)
>that you want.
>I have done this myself in order to make an AutoEncoderNetwork out of
>the
>MLP
>implementation.
>
>This makes me wonder, would it be worth adding this to sklearn?
>A very simple way would be to refactor the `_predict` method, with the
>additional layer
>argument, to a new method `_predict_layer`, then we can have the
>`_predict`
>method
>simply call `_predict_layer(..., layer=-1)` and add a new method
>(perhaps a
>`transform`?)
>that allows to get (raveled) values for an arbitrary subset of the
>layers.
>
>I'd be happy to submit a PR if you guys think it would be interesting
>for
>the project.
>
>Javier
>
>
>
>On Thu, Dec 7, 2017 at 12:51 AM Thomas Evangelidis <tevang3 at gmail.com>
>wrote:
>
>> Greetings,
>>
>> I want to train a MLPClassifier with one hidden layer and use it as a
>> feature selector for an MLPRegressor.
>> Is it possible to get the values of the neurons from the last hidden
>layer
>> of the MLPClassifier to pass them as input to the MLPRegressor?
>>
>> If it is not possible with scikit-learn, is anyone aware of any
>> scikit-compatible NN library that offers this functionality? For
>example
>> this one:
>>
>> http://scikit-neuralnetwork.readthedocs.io/en/latest/index.html
>>
>> I wouldn't like to do this in Tensorflow because the MLP there is
>much
>> slower than scikit-learn's implementation.
>>
>
>
>------------------------------------------------------------------------
>
>_______________________________________________
>scikit-learn mailing list
>scikit-learn at python.org
>https://mail.python.org/mailman/listinfo/scikit-learn
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/scikit-learn/attachments/20171229/eeebf602/attachment.html>
More information about the scikit-learn
mailing list