Me gustaría entrenar previamente un modelo y luego entrenarlo con otro modelo.
Tengo el modelo Decision Tree Classifer y luego me gustaría entrenarlo más con el modelo LGBM Classifier . ¿Existe la posibilidad de hacer esto en scikit learn? Ya he leído esta publicación al respecto https://datascience.stackexchange.com/questions/28512/train-new-data-to-pre-trained-model. . En la publicación dice
Según la documentación oficial, llamar a fit() más de una vez sobrescribirá lo aprendido por cualquier fit() anterior
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=1) # Train Decision Tree Classifer clf = DecisionTreeClassifier() clf = clf.fit(X_train,y_train) lgbm = lgb.LGBMClassifier() lgbm = lgbm.fit(X_train,y_train) #Predict the response for test dataset y_pred = lgbm.predict(X_test)Quizás esté buscando clasificadores apilados.
En este enfoque, las predicciones de modelos anteriores están disponibles como características para modelos posteriores.
Mire en StackingClassifiers .
Adaptado de la documentación:
from sklearn.ensemble import StackingClassifier estimators = [ ('dtc_model', DecisionTreeClassifier()), ] clf = StackingClassifier( estimators=estimators, final_estimator=LGBMClassifier() )Desafortunadamente, esto no es posible en la actualidad. De acuerdo con el documento en https://lightgbm.readthedocs.io/en/latest/pythonapi/lightgbm.LGBMClassifier.html?highlight=init_model , puede continuar entrenando el modelo si el modelo es de lightgbm.
Intenté esta configuración con:
# dtc dtc_model = DecisionTreeClassifier() dtc_model = dtc_model.fit(X_train, y_train) # save dtc_fn = 'dtc.pickle.db' pickle.dump(dtc_model, open(dtc_fn, 'wb')) # lgbm lgbm_model = LGBMClassifier() lgbm_model.fit(X_train_2, y_train_2, init_model=dtc_fn)Y obtengo:
LightGBMError: Unknown model format or submodel type in model file dtc.pickle.dbComo explicó @Ferdy en su publicación, no existe una forma sencilla de realizar esta operación y es comprensible.
Scikit-learn DecisionTreeClassifier solo toma características numéricas y no puede manejar valores nan mientras que LGBMClassifier puede manejarlos.
Al observar la función de decisión de scikit-learn , puede ver que todo lo que puede realizar son divisiones basadas en feature <= threshold .
Por el contrario LGBM puede realizar lo siguiente:
feature is nafeature <= thresholdfeature in categoriesLas divisiones en el árbol de decisión se seleccionan en cada paso, ya que dividen mejor el conjunto de elementos. Intentan minimizar la impureza (giny) o entropía del nodo.
El riesgo de capacitar más a un DecisionTreeClassifier es que no está seguro de que las divisiones realizadas en el árbol original sean las mejores, ya que tiene nuevas capacidades de división con LGBM que podrían/deberían conducir a un mejor rendimiento.
Le recomendaría volver a entrenar el modelo con LGBMClassifier solo, ya que es posible que las divisiones sean diferentes del árbol original scikit-learn .