【发布时间】:2020-03-07 07:32:59
【问题描述】:
我想实现一个与所有 scikit-learn 兼容的简单包装器/元估计器。很难找到我到底需要什么的完整描述。
目标是有一个回归器,它也学习一个阈值来成为一个分类器。所以我想出了:
from sklearn.base import BaseEstimator, ClassifierMixin, clone
class Thresholder(BaseEstimator, ClassifierMixin):
def __init__(self, regressor):
self.regressor = regressor
# threshold_ does not get initialized in __init__ ??
def fit(self, X, y, optimal_threshold):
self.regressor = clone(self.regressor) # is this required my sklearn??
self.regressor.fit(X, y)
y_raw = self.regressor.predict()
self.threshold_ = optimal_threshold(y_raw)
def predict(self, X):
y_raw = self.regressor.predict(X)
y = np.digitize(y_raw, [self.threshold_])
return y
这是否实现了我需要的完整 API?
我的主要问题是把threshold 放在哪里。我希望它只学习一次,并且可以在后续 .fit 调用中重新使用新数据而无需重新调整。但是对于当前版本,必须在每次调用 .fit 时重新调整它——我不希望这样吗?
另一方面,如果我将其设为固定参数self.threshold 并将其传递给__init__,那么我不应该用数据更改它吗?
我怎样才能创建一个threshold 参数,该参数可以在.fit 的一次调用中调整并在后续.fit 调用中修复?
【问题讨论】:
-
请问多次
fit电话的原因是什么?这是某种在线学习吗?还是由于交叉验证?还是别的什么? -
@ShihabShahriarKhan 只有一个与特定数据集合(以及存储在最佳阈值中的特定测试数据)的拟合才能确定阈值。从那时起,我希望不再调整阈值,而只调整我的数据折叠的回归量。
-
我可能误解了一些东西...如果您在init中将
threshold_初始化为None,并检查它的值是否设置在fit中,它不会工作吗?有点类似于warm_startparam -
很难说它是否有效,因为 sklearn 有一定的 API 和函数,如
clone和其他元估计器在幕后做了某种魔术。这就是为什么我想知道使用 sklearn 的正确方法。 -
为什么不在构造函数中初始化
self.threshold = None而不是 if 语句 -if self.threshold is not None: self.threshold = optimal_threshold(y_raw)?虽然我认为更好的方法是在fit方法中添加一个布尔值,指示是否更新阈值
标签: python scikit-learn