在scikit learn中预训练一个模型(分类器)

7
我想要预训练一个模型,然后再用另一个模型进行训练。 我有一个“决策树分类器”模型,然后我想用“LGBM分类器”模型进一步训练它。在scikit learn中有可能这样做吗? 我已经阅读了这篇文章 https://datascience.stackexchange.com/questions/28512/train-new-data-to-pre-trained-model. 关于这个问题的解释如下: “根据官方文档,调用fit()超过一次将覆盖之前任何fit()学到的内容。”
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)
3个回答

2
也许您正在寻找堆叠分类器。
在这种方法中,早期模型的预测可用作后续模型的特征。
请查看 StackingClassifiers
摘自文档:
from sklearn.ensemble import StackingClassifier

estimators = [
     ('dtc_model', DecisionTreeClassifier()),
 ]

clf = StackingClassifier(
                estimators=estimators, 
                final_estimator=LGBMClassifier()
      )

1
很遗憾,目前这是不可能的。根据https://lightgbm.readthedocs.io/en/latest/pythonapi/lightgbm.LGBMClassifier.html?highlight=init_model上的文档,如果模型来自于lightgbm,你可以继续训练该模型。我曾尝试过以下设置:
# 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)

我收到的结果是:
LightGBMError: Unknown model format or submodel type in model file dtc.pickle.db

1
@Ferdy在他的文章中所解释的那样,执行这个操作并不简单,这是可以理解的。
Scikit-learn的DecisionTreeClassifier只能处理数字特征,无法处理nan值,而LGBMClassifier可以处理这些值。
通过查看scikit-learn的决策函数,您可以看到它只能基于feature <= threshold进行分裂。
相反,LGBM可以执行以下操作:
  • feature is na
  • feature <= threshold
  • feature in categories
决策树中的分裂是在每个步骤中选择最佳分裂集合的。它们试图最小化节点不纯度(giny)或熵。
进一步训练DecisionTreeClassifier的风险在于,由于使用LGBM具有新的分裂能力,因此您不能确定原始树中执行的分裂是否最佳,这可能/应该会导致更好的性能。
我建议你只用 LGBMClassifier 重新训练模型,因为可能会有不同于原始的 scikit-learn Tree 的分割点。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接