我正在Kaggle中处理一个标签为正数的知识问题。我尝试在scikit中使用SGDRegressor来训练和测试模型。然而,学习模型中的一些预测是负面的。
因此,我想知道是否有一种方法可以限制像SGD这样的回归器(在scikit-learn中)的预测只有正值。我知道在得到预测后使用蛮力技术来限制值,但我不喜欢遵循这种方法,因为它不能代表真正的模型。
您可能希望适合z = np.log(y)
而不是y
:model = SGDRegressor(**params).fit(X_train, np.log(y_train))
,然后是y_predicted = np.exp(model.predict(X_test))
。
如果您希望能够在这样的模型上使用sklearn的cross_val_score
和GridSearchCV
工具,则可以将SGDRegressor
子类化以重载fit
和predict
方法,从而在内部更改目标变量
我知道这是一个旧线程,但我只是在与原始帖子有相同经验的基础上搜索后找到的。我尝试了给出的答案,但我无法使用我的数据。在进一步研究之后,我能够在缩放X…中的列后,让SGDR除法器工作(即,给出非常适合我的数据的积极预测)
# add to imports
from sklearn.preprocessing import StandardScaler
# add to code before training SGDRegressor model
scaler = StandardScaler()
scaler.fit(X)
Xs = scaler.transform(X)
# I used train_test_split, so I changed first parameter from X to Xs
X_train, X_test, y_train, y_test = train_test_split(Xs, y, test_size=0.3, random_state=26)
# train model
sgd = linear_model.SGDRegressor()
sgd.fit(X_train, y_train)
# test model
y_predicted = sgd.predict(X_test)
在添加用于缩放输入的部分之前,我得到了所有的负面预测,尽管y(训练和测试)都是正面的。添加缩放后,y_predicted都是正数,非常接近y_test[假设我基于X为该数据创建了y,所以我期待着良好的性能]。张贴这个答案,以防对其他人有帮助。
有关文档,请访问此处。