为什么我的机器学习模型在批量训练时表现不佳?
Why does my machine learning model perform poorly with batch training?
我的机器学习模型 (xgboost regressor) 似乎在批量训练时表现更差(即 epochs > 1)。如果我将轮数更改为 1(即没有批次),我的模型分数接近 93%。太好了 但是,当我将批次数设置为 25 或 100 时,样本外模型分数会随着时期数的增加而变得非常糟糕。到最后一批,样本分数外的模型非常差,无法很好地预测任何东西!有人在下面看到我的代码有问题吗?提前致谢!
编辑:genSold 是我整个数据库的生成器。
epochs = 100
batchSize = (int)(nSold / epochs)
print(batchSize)
print(batchSize * epochs)
model = xgboost.XGBRegressor()
for epoch in range(epochs):
print(f"Epoch {epoch+1} of {epochs}")
data = []
count = 0
for item in genSold:
if(count == batchSize):
break
data.append(item)
count += 1
print(len(data))
df = shuffle(pd.DataFrame(data))
df2 = processData(df, numerical_features, categorical_features)
df2.drop(columns=['house-id_listing'], inplace=True)
df2 = df2.dropna(subset=prediction)
Y = df2[prediction]
X = df2.drop(columns=prediction)
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.1)
if epoch == 0:
model.fit(X_train, Y_train)
else:
features = model.get_booster().feature_names
print(len(features))
model.fit(X_train[features], Y_train, xgb_model=model.get_booster())
print(model.score(X_test, Y_test))
model.fit
使用 sklearn API 不会更新现有的树,只会让新的树适应新的数据集。你可以 using the python API, but as of 2018, batch training was not recommended by the devs。如果必须这样做,则需要至少多次遍历整个训练集,以复制单批训练的性能。
编辑:这个假设是错误的。
如果我对你的代码的理解正确,你正在对 genSold
中的前 batchSize
个样本进行重复训练,因为样本永远不会从 genSold
中删除。
但是,如果是这种情况,我希望您在最后一行中报告的分数会提高,因为您在拆分成训练和测试折叠之前对每批进行洗牌,在第一批之后,应该意味着您正在测试您之前训练过的样本。您是说它在单独的 hold-out 集上表现不佳吗?
我的机器学习模型 (xgboost regressor) 似乎在批量训练时表现更差(即 epochs > 1)。如果我将轮数更改为 1(即没有批次),我的模型分数接近 93%。太好了 但是,当我将批次数设置为 25 或 100 时,样本外模型分数会随着时期数的增加而变得非常糟糕。到最后一批,样本分数外的模型非常差,无法很好地预测任何东西!有人在下面看到我的代码有问题吗?提前致谢!
编辑:genSold 是我整个数据库的生成器。
epochs = 100
batchSize = (int)(nSold / epochs)
print(batchSize)
print(batchSize * epochs)
model = xgboost.XGBRegressor()
for epoch in range(epochs):
print(f"Epoch {epoch+1} of {epochs}")
data = []
count = 0
for item in genSold:
if(count == batchSize):
break
data.append(item)
count += 1
print(len(data))
df = shuffle(pd.DataFrame(data))
df2 = processData(df, numerical_features, categorical_features)
df2.drop(columns=['house-id_listing'], inplace=True)
df2 = df2.dropna(subset=prediction)
Y = df2[prediction]
X = df2.drop(columns=prediction)
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.1)
if epoch == 0:
model.fit(X_train, Y_train)
else:
features = model.get_booster().feature_names
print(len(features))
model.fit(X_train[features], Y_train, xgb_model=model.get_booster())
print(model.score(X_test, Y_test))
model.fit
使用 sklearn API 不会更新现有的树,只会让新的树适应新的数据集。你可以
编辑:这个假设是错误的。
如果我对你的代码的理解正确,你正在对 genSold
中的前 batchSize
个样本进行重复训练,因为样本永远不会从 genSold
中删除。
但是,如果是这种情况,我希望您在最后一行中报告的分数会提高,因为您在拆分成训练和测试折叠之前对每批进行洗牌,在第一批之后,应该意味着您正在测试您之前训练过的样本。您是说它在单独的 hold-out 集上表现不佳吗?