Возможность кэширования дорогостоящего в вычислительном отношении метода .fit() оценщика scikit-learn?

#python #caching #scikit-learn

#python #кэширование #scikit-learn

Вопрос:

Я использую sklearn.ensemble.BaggingClassifier для подгонки 1000 оценок к своим данным. Интересно, можно ли кэшировать .fit() метод этого класса, чтобы выходные .fit() данные метода можно было просто кэшировать после первого запуска скрипта?

Возьмите это в качестве примера:

 import numpy as np
from sklearn.ensemble import BaggingClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import make_classification

rng = np.random.RandomState(42)
X, y = make_classification(n_samples=1000,n_features=4,n_informative=2,
                           n_redundant=0,random_state=rng,shuffle=False)

# initialize bagging classifier
clf = BaggingClassifier(base_estimator=LogisticRegression(),n_estimators=1000,random_state=rng)
result = clf.fit(X,y).estimators_[0].coef_
 

Редактировать:

Приведенные ниже ответы, по-видимому, дают ответы о том, как кэшировать результаты в процессе подбора, т. Е. При подборе n оценок попробуйте использовать предварительно вычисленные результаты из уже подобранных классификаторов. Вместо этого я ищу способ кэширования всего процесса. Интересно, можно ли было бы использовать sklearn.pipeline.Pipeline для этого? Адаптированный код будет выглядеть следующим образом (буду рад получить обратную связь, если это правильно):

 from sklearn.pipeline import Pipeline
# initialize bagging classifier
clf = BaggingClassifier(base_estimator=LogisticRegression(),n_estimators=1000,random_state=rng)
pipe = Pipeline([('clf',clf)],memory='./cache')
result = pipe.fit(X,y)._final_estimator.estimators_[0].coef_
 

Комментарии:

1. не могли бы вы уточнить, что вы подразумеваете под кэшированием fit() метода? Когда вы подгоняете один и тот же набор данных, который вы можете использовать warm_start , но если вы хотите подогнать разные пакеты данных partial_fit , работает

2. Недостаточно ли иметь подогнанный классификатор? Если нет, то каким образом?

3. Извините, не могли бы вы быть более конкретными? Я не уверен, понял ли я ваш вопрос

Ответ №1:

Вы можете использовать warm_start для повторного использования решения предыдущего вызова для подгонки и добавления дополнительных оценок в ансамбль.

С помощью этого решения вы можете вычислять оценки по пакетам и сохранять текущие состояния модели.

Ниже приведен пример warm_start :

 from sklearn.svm import SVC
from sklearn.ensemble import BaggingClassifier
from sklearn.datasets import make_classification

X, y = make_classification(n_samples=100, n_features=4,
                           n_informative=2, n_redundant=0,
                           random_state=0, shuffle=False)

clf = BaggingClassifier(base_estimator=SVC(),
                        n_estimators=10, random_state=0, warm_start=True)

for i in range(5):
    clf.fit(X, y)
    print(f'Iteration {i} score with {clf.n_estimators}: {clf.score(X, y)}')
    clf.n_estimators  = 10
 

Это приведет к следующему:

 Iteration 0 score with 10: 0.92
Iteration 1 score with 20: 0.93
Iteration 2 score with 30: 0.92
Iteration 3 score with 40: 0.92
Iteration 4 score with 50: 0.92
 

Комментарии:

1. Но если я правильно понял, это не будет кэшировать весь процесс подгонки? Другими словами, когда вы помещаете 1000 оценщиков в свой набор данных, затем закрываете и перезапускаете сеанс python и вызываете .fit() снова, он не будет кэшировать ранее вычисленные результаты, верно?

2. Если вы хотите сохранить и перезапустить подгонку после этого, вам следует сериализовать свою модель перед перезапуском python. Затем вы можете загрузить модель и продолжить процесс обучения.