在 scikit learn 中预训练模型(分类器)
Posted
技术标签:
【中文标题】在 scikit learn 中预训练模型(分类器)【英文标题】:Pre train a model (classifier) in scikit learn 【发布时间】:2022-01-05 18:48:33 【问题描述】:我想预训练一个模型,然后用另一个模型训练它。
我有模型Decision Tree Classifer
,然后我想用模型LGBM Classifier
进一步训练它。有没有可能在 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)
【问题讨论】:
【参考方案1】:也许您正在寻找堆叠分类器。
在这种方法中,早期模型的预测可用作后期模型的特征。
查看StackingClassifiers。
改编自文档:
from sklearn.ensemble import StackingClassifier
estimators = [
('dtc_model', DecisionTreeClassifier()),
]
clf = StackingClassifier(
estimators=estimators,
final_estimator=LGBMClassifier()
)
【讨论】:
【参考方案2】:很遗憾,目前这是不可能的。根据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
【讨论】:
【参考方案3】:正如@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
树不同。
【讨论】:
以上是关于在 scikit learn 中预训练模型(分类器)的主要内容,如果未能解决你的问题,请参考以下文章
scikit-learn 中多数投票的训练会重新训练分类器吗?