在 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 - 训练高斯朴素贝叶斯分类器

scikit-learn 中多数投票的训练会重新训练分类器吗?

在 scikit-learn 中平均多个随机森林模型

Scikit-learn 分类器具有依赖于训练特征的自定义记分器

在 Scikit-Learn 分类器上使用交叉验证

Scikit-Learn集成机器学习:boosting(4万字详解,收藏)