Me gustaría usar el parámetro warm_start para agregar datos de entrenamiento a mi clasificador de bosque aleatorio. Esperaba que se usara así:
clf = RandomForestClassifier(...) clf.fit(get_data()) clf.fit(get_more_data(), warm_start=True) Pero el parámetro warm_start es un parámetro de constructor. Entonces, ¿hago algo como esto?
clf = RandomForestClassifier() clf.fit(get_data()) clf = RandomForestClassifier (warm_start=True) clf.fit(get_more_data)Eso no tiene sentido. ¿La nueva llamada al constructor no descartará los datos de entrenamiento anteriores? Creo que me estoy perdiendo algo.
El patrón básico de (tomado de la respuesta de Miriam):
clf = RandomForestClassifier(warm_start=True) clf.fit(get_data()) clf.fit(get_more_data())sería el uso correcto de la API.
Pero hay un problema aquí.
Como dicen los documentos lo siguiente:
Cuando se establece en True, reutiliza la solución de la llamada anterior para ajustar y agregar más estimadores al conjunto; de lo contrario, solo ajusta un bosque completamente nuevo.
significa que lo único que puede hacer warm_start por usted es agregar nuevos árboles de decisión. ¡Todos los árboles anteriores parecen estar intactos!
Comprobemos esto con algunas fuentes :
n_more_estimators = self.n_estimators - len(self.estimators_) if n_more_estimators < 0: raise ValueError('n_estimators=%d must be larger or equal to ' 'len(estimators_)=%d when warm_start==True' % (self.n_estimators, len(self.estimators_))) elif n_more_estimators == 0: warn("Warm-start fitting without increasing n_estimators does not " "fit new trees.")¡Esto básicamente nos dice que necesitaría aumentar la cantidad de estimadores antes de acercarse a un nuevo ajuste!
No tengo idea de qué tipo de uso espera Sklearn aquí. No estoy seguro, si ajustar, aumentar las variables internas y ajustar nuevamente es el uso correcto, pero de alguna manera lo dudo (especialmente porque n_estimators no es una variable de clase pública).
¡Su enfoque básico (con respecto a esta biblioteca y este clasificador) probablemente no sea una buena idea para su aprendizaje fuera del núcleo aquí! No continuaría con esto.
Solo para agregar a la excelente respuesta de @sascha, este método hackie funciona:
rf = RandomForestClassifier(n_estimators=1, warm_start=True) rf.fit(X_train, y_train) rf.n_estimators += 1 rf.fit(X_train, y_train)from sklearn.datasets import load_iris boston = load_iris() X, y = boston.data, boston.target ### RandomForestClassifier from sklearn.ensemble import RandomForestClassifier rfc = RandomForestClassifier(n_estimators=10, warm_start=True) rfc.fit(X[:50], y[:50]) print(rfc.score(X, y)) rfc.n_estimators += 10 rfc.fit(X[51:100], y[51:100]) print(rfc.score(X, y)) rfc.n_estimators += 10 rfc.fit(X[101:150], y[101:150]) print(rfc.score(X, y))A continuación se muestra la diferenciación entre warm_start y parcial_fit.
Al ajustar un estimador repetidamente en el mismo conjunto de datos, pero para valores de parámetros múltiples (como para encontrar el valor que maximiza el rendimiento como en la búsqueda de cuadrícula), es posible reutilizar aspectos del modelo aprendidos del valor de parámetro anterior, ahorrando tiempo. Cuando warm_start es verdadero, los atributos del modelo ajustado existente se utilizan para inicializar el nuevo modelo en una llamada posterior para ajustar. Tenga en cuenta que esto solo se aplica a algunos modelos y algunos parámetros, e incluso a algunos órdenes de valores de parámetros. Por ejemplo, warm_start se puede usar al construir bosques aleatorios para agregar más árboles al bosque (aumentando n_estimators) pero no para reducir su número.
parcial_fit también retiene el modelo entre llamadas, pero difiere: con warm_start los parámetros cambian y los datos son (más o menos) constantes entre llamadas para ajustarse; con parcial_fit, el mini lote de cambios de datos y los parámetros del modelo permanecen fijos.
Hay casos en los que desea utilizar warm_start para adaptarse a datos diferentes pero estrechamente relacionados. Por ejemplo, se puede ajustar inicialmente a un subconjunto de datos y luego ajustar la búsqueda de parámetros en el conjunto de datos completo. Para la clasificación, todos los datos en una secuencia de llamadas de ajuste de warm_start deben incluir muestras de cada clase.