如何解决可能的错误?自定义目标函数不随比例变化
脚本有两个损失,平方损失 L_a = (y-F(x))^2
和相同的损失,但具有 0.5
因子:L_b = 0.5*(y-F(x))^2
。使用 L_a
让我得到一个分裂的树(即使 max_split
设置为 > 1),但使用 L_b
导致没有分裂的树。两者之间应该没有区别,因为它们仅相差一个常数因子。
我确保设置了 gamma=0
(允许拆分的最小改进)并将 lambda=0
(L_2
罚分)设置为零,但仍然遇到此问题。>
第 202 行和第 203 行报告的 eval-rmse
和 eval-error
不匹配,即使在计算了 eval-error 的 sqrt 之后也是如此。
我在 R
和 Python
上试过这个,都返回相同的结果。有没有我省略的参数?不知道如何处理这个问题。任何帮助将不胜感激!
x1 = np.random.uniform(0,1,10000)
x2 = np.random.uniform(0,10000)
x3 = np.random.uniform(0,10000)
y = 10*x1*x2+np.random.normal(size=10000)*x2
x1_train = x1[:8000,]
x2_train = x2[:8000,]
y_train = y[:8000,]
x1_test = x1[8000:,]
x2_test = x2[8000:,]
y_test = y[8000:,]
data_train= np.asmatrix(pd.DataFrame(x1_train,x2_train))
data_test = np.asmatrix(pd.DataFrame(x1_train,x2_train))
def logregobj(preds,data_train):
labels = data_train.get_label()
grad = -2*(labels-preds)/len(labels)
hess = grad*0 + 2/len(labels)
return grad,hess
def evalerror(preds,data_train):
labels = data_train.get_label()
return 'error',float((sum(labels - preds)**2) / len(labels))
def logregobj2(preds,data_train):
labels = data_train.get_label()
grad = (-2*(labels-preds)/len(labels))/2
hess = (grad*0 + 2/len(labels))/2
return grad,hess
def evalerror2(preds,data_train):
labels = data_train.get_label()
return 'error',(float(sum(labels - preds)**2) / len(labels))/2
data_train = xgb.DMatrix(data_train,label=y_train)
data_test = xgb.DMatrix(data_test,label=y_test)
param = {'max_depth': 3,'eta': 1,'n_thread': 3,'verbosity':2,'lambda':0,'gamma':0}
watchlist = list([(dtest,'eval'),(dtrain,'train')])
num_round = 5
bst = xgb.train(param,dtrain,num_round,watchlist,logregobj,evalerror)
bst = xgb.train(param,logregobj2,evalerror2)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。