分类器中的 scikit-learn refit/partial fit 选项

Posted

技术标签:

【中文标题】分类器中的 scikit-learn refit/partial fit 选项【英文标题】:scikit-learn refit/partial fit option in Classifers 【发布时间】:2018-01-20 03:49:36 【问题描述】:

我想知道 sklearn 分类器中是否有任何选项可以使用一些超参数进行拟合,并在更改一些超参数后,通过节省计算(拟合)成本来重新拟合模型。

让我们说,逻辑回归适合使用 C=1e5 (logreg=linear_model.LogisticRegression(C=1e5)),我们仅将 C 更改为 C=1e3。我想节省一些计算,因为只更改了一个参数。

【问题讨论】:

据我所知,贝叶斯超参数优化是最快的方法:github.com/fmfn/BayesianOptimization。您可以为此创建一个新问题,也许人们会有更好的想法。 贝叶斯超参数优化通常存在的问题是它的超参数比您要调整的模型多。这是一个有趣的替代方案:blog.dlib.net/2017/12/… 【参考方案1】:

是的,有一种称为warm_start 的技术,从文档中引用,它的意思是:

warm_start :布尔值,默认值:False 当设置为 True 时,重用之前调用 fit 作为初始化的解决方案,否则, 只需删除以前的解决方案。对 liblinear 求解器无用。

如文档here 中所述,它在LogisticRegression 中可用:

sklearn.linear_model.LogisticRegression(..., warm_start=False, n_jobs=1)

因此,具体而言,对于您的情况,您将执行以下操作:

from sklearn.linear_model import LogisticRegression 

# create an instance of LogisticRegression with warm_start=True
logreg = LogisticRegression(C=1e5, warm_start=True)
# you can access the C parameter's value as follows
logreg.C 
# it's set to 100000.0

# .... 
# train your model here by calling logreg.fit(..)
# ....

# reset the value of the C parameter as follows 
logreg.C = 1e3 

logreg.C 
# now it's set to 1000.0

# .... 
# re-train your model here by calling logreg.fit(..)
# ....

就我能够快速检查的情况而言,它也可以在以下位置使用:

sklearn.ensemble.RandomForestClassifier sklearn.ensemble.GradientBoostingClassifier sklearn.linear_model.PassiveAggressiveClassifier sklearn.ensemble.BaggingClassifier sklearn.ensemble.ExtraTreesClassifier

【讨论】:

谢谢。实际上,我正在尝试搜索最佳参数(作为 sklearn 中网格搜索的替代方法)。理论上,我的立场是,如果我们只更改一个参数并再次fit 模型,它应该比第一次花费更少的时间(如果warm_start=True),但从经验上来说并非如此。你能帮忙吗? @Nawaz 我刚刚评论了你的问题。 谢谢,我看到了。

以上是关于分类器中的 scikit-learn refit/partial fit 选项的主要内容,如果未能解决你的问题,请参考以下文章

多标签分类器中的拟合概率

如何在 sklearn 的集成分类器中使用自定义分类器?

执行 python scikit-learn 网格搜索方法时出现无效参数错误

Scikit-Learn 中的分类数据转换

scikit-learn,线性回归中的分类(但数字)特征

ValueError:使用 GaussianNB 在 scikit-learn (sklearn) 中设置具有序列的数组元素