[Mne_analysis] GeneralizingEstimator with incremental learning / .partial_fit

Jean-Rémi KING jeanremi.king at gmail.com
Thu Aug 6 10:11:26 EDT 2020
Search archives:

        External Email - Use Caution        

Hi Giula,

good catch, I had forgotten that we're cloning the estimator for each time
sample; you'll thus need to do this:

class MyModel(SGDClassifier):
    def fit(self, X, y):
        super().partial_fit(X, y)
        return self

model = MyModel(loss='log', class_weight='balanced')
slider = SlidingEstimator(model, scoring='roc_auc')

Hope that helps

JR


On Thu, 6 Aug 2020 at 15:56, Giulia Gennari <giulia.gennari1991 at gmail.com>
wrote:

>         External Email - Use Caution
>
> Dear Jean-Rémi,
>
> Thank you for the nice suggestion!
>
> Just to make sure that this is working (I apologize for my ignorance):
>
> When I run:
> model = SGDClassifier(loss='log', class_weight='balanced')
> model.fit = model.partial_fit
> slider1 = SlidingEstimator(model, scoring='roc_auc')
> slider1.fit(X_train, y_train)
>
> or
>
> clf = make_pipeline(Vectorizer(), StandardScaler(), model)
> slider2 = SlidingEstimator(clf, scoring='roc_auc')
> slider2.fit(X_train, y_train)
>
> I do not get any error, while I would expect:
>
> ValueError: class_weight 'balanced' is not supported for partial_fit. In order to use 'balanced' weights, use compute_class_weight('balanced', classes, y). Pass the resulting weights as the class_weight parameter.
>
>
> Since this is what I get with:
> model.fit(X_train[:,:,single_time_point], y_train)
>
> Is there a good reason for that? E.g. class weights are computed
> internally beforehand by SlidingEstimator?
>
> Thank you again!
>
> Giulia
>
> On Wed, Aug 5, 2020 at 7:18 PM Jean-Rémi KING <jeanremi.king at gmail.com>
> wrote:
>
>>         External Email - Use Caution
>>
>> Hi Giulia,
>>
>> I think you should be able to change the method:
>>
>> model = sklearn.linear_model.SGDClassifier()
>> model.fit = model.partial_fit
>> slider = mne.decoding.SlidingEstimator(model)
>> for X, y in train_batches:
>>     slider.fit(X, y)
>>
>> Best
>>
>> JR
>>
>> On Wed, 5 Aug 2020 at 18:40, Giulia Gennari <giulia.gennari1991 at gmail.com>
>> wrote:
>>
>>>         External Email - Use Caution
>>>
>>> Hi!
>>>
>>> I would need to try decoding with incremental learning (EEG data).
>>> I was planning to use logistic regression by means of the SGDClassifier
>>> <https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.SGDClassifier.html>
>>>  .
>>> I would then need to call .partial_fit to make my estimator learn on
>>> each of my training sets.
>>> However:
>>>
>>> 'GeneralizingEstimator' object has no attribute 'partial_fit'
>>>
>>> Same issue for SlidingEstimator.
>>> Is there a way to work around this limitation?
>>>
>>> Thank you so so much in advance!
>>>
>>> Giulia Gennari
>>> _______________________________________________
>>> Mne_analysis mailing list
>>> Mne_analysis at nmr.mgh.harvard.edu
>>> https://mail.nmr.mgh.harvard.edu/mailman/listinfo/mne_analysis
>>
>> _______________________________________________
>> Mne_analysis mailing list
>> Mne_analysis at nmr.mgh.harvard.edu
>> https://mail.nmr.mgh.harvard.edu/mailman/listinfo/mne_analysis
>
> _______________________________________________
> Mne_analysis mailing list
> Mne_analysis at nmr.mgh.harvard.edu
> https://mail.nmr.mgh.harvard.edu/mailman/listinfo/mne_analysis
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mail.nmr.mgh.harvard.edu/pipermail/mne_analysis/attachments/20200806/f199577f/attachment.html 


More information about the Mne_analysis mailing list