Scikit learn 将scikit learn中SGDRegressor的预测限制为正值

Scikit learn 将scikit learn中SGDRegressor的预测限制为正值,scikit-learn,Scikit Learn,我正在研究卡格尔的一个知识问题,它的标签是正数。我试着在scikit中使用SGDRegressor来学习训练和测试模型。然而,从所学模型得出的一些预测是否定的 因此,我想知道是否有一种方法可以限制像SGD(在scikit learn中)这样的回归器的预测只有正值。我知道在我得到预测后使用蛮力技术来限制值,但我不喜欢采用这种方法,因为它不能代表真实的模型。你可能想适应z=np.log(y)而不是y:model=SGDRegressor(**params).fit(X_train,np.log(y_

我正在研究卡格尔的一个知识问题,它的标签是正数。我试着在scikit中使用SGDRegressor来学习训练和测试模型。然而,从所学模型得出的一些预测是否定的


因此,我想知道是否有一种方法可以限制像SGD(在scikit learn中)这样的回归器的预测只有正值。我知道在我得到预测后使用蛮力技术来限制值,但我不喜欢采用这种方法,因为它不能代表真实的模型。

你可能想适应
z=np.log(y)
而不是
y
model=SGDRegressor(**params).fit(X_train,np.log(y_train))
然后
y\u predicted=np.exp(model.predicte(X\u测试))


如果您希望能够在这样一个模型上使用sklearn的
cross_val_score
GridSearchCV
工具,您可以将
SGDRegressor
子类化,以重载
fit
predict
方法,在内部执行此目标变量更改,但我只是在搜索后发现它的基础上有相同的经验,原来的职位。我尝试了给出的答案,但无法使用我的数据。在进一步研究这一点之后,我能够让SGDRegressor在缩放X中的列后工作(即给出与我的数据非常吻合的积极预测)

#添加到导入
从sklearn.preprocessing导入StandardScaler
#在培训SGDRegressor模型之前添加到代码中
scaler=StandardScaler()
scaler.fit(X)
Xs=scaler.transform(X)
#我使用了train_test_split,所以我将第一个参数从X改为Xs
X_序列,X_测试,y_序列,y_测试=序列测试分割(X,y,测试大小=0.3,随机状态=26)
#列车模型
sgd=线性_模型。SGDRegressor()
sgd.fit(X_列车、y_列车)
#测试模型
y_预测=新加坡元预测(X_测试)
在添加用于缩放输入的部分之前,我得到了所有的负面预测,即使y(训练和测试)都是正面的。在添加缩放后,y_预测的都是正数,非常接近y_测试[当然,我根据X为这个数据创建了y,所以我期望有好的性能]。发布此答案以防对其他人有所帮助


有关文件,请访问

如果您在
y
中有零值,则可能
z=log(1+y)
y\u pred=exp(z\u pred)-1
。感谢您的快速响应。我理解您解决方案的第一部分,即y或1+y的日志转换。但是,请您详细说明或为我指出第二部分的一个示例,在该示例中,我们可以将SGDRegressor子类化,以重载fit和predict方法。我是ML和scikit新手,因此非常感谢您的帮助!我只是说,如果您不想将boiler plate代码包装起来,反复手动进行转换,您可以在一个类中对其进行分解,您可以通过实现一个遵循sklearn约定的类来实现这一点:这将使它能够与交叉验证工具一起使用。感谢您澄清这一点!我真的很感激。另外,很抱歉,我不能投票支持你的答案,因为我没有足够的代表。