尝试调整 GradientBoostedClassifer() 中的 min_samples_leaf。我看到了偏差/方差权衡的预期结果。然而,只是为了测试边界,我在训练数据集中设置了 min_samples_leaf > n_samples,预计会出现错误或其他情况,但我仍然得到与模型调整时类似的结果:
df = df_a # number of samples = 347
df=df.sample(frac=1)
train_proportion = 0.8
n = len(df)
t = int(train_proportion * n)
# separate training and test sets
y = df['detected']
X = df.loc[:, ~df.columns.isin(['detected'])]
# samples in training set
train_x = X.iloc[:t,:].reset_index().iloc[:,1:]
# samples in test set
test_x = X.iloc[t:,:].reset_index().iloc[:,1:]
#targets in train set
train_y = pd.Series(y[:t].reset_index().iloc[:,1:].iloc[:,0])
#targets in test set
test_y = pd.Series(y[t:].reset_index().iloc[:,1:].iloc[:,0])
clf = GradientBoostingClassifier(n_estimators = 100, max_depth = 10, random_state= 0, min_samples_leaf=500)
clf.fit(train_x,train_y)
print(clf.score(train_x,train_y))
print(clf.score(test_x,test_y))
output:
0.924187725631769
0.9142857142857143
为什么会这样呢?我预计会出现错误或者不会进行拆分。文档中似乎没有说明如果 min_samples_leaf > n_samples 会发生什么。对 int 的唯一要求是范围 [1,inf]。对此也没有额外的注释。
我在想也许它会将 min_samples_leaf 重置为一些可用值,但是子树都没有深度并且没有进行分割:subtree
我预计[...]不会出现任何分裂。
[...]
子树都没有深度,也没有进行分割
所以你已经证实了你的怀疑之一。为什么
score
看起来这么好,这是留给你的唯一问题吗?这可能是因为 score
是准确性指标,如果您的数据集不平衡并且始终预测多数类,那么准确性就是多数的流行率。