@Issacx 现在的核心问题,其实和具体业务是无关的。我来具体解释下矛盾在哪里
传统的机器学习任务,比如用决策树做分类,如果我们在 trainset 上建立一颗尽量精细的决策树 (model),然后把这个 model 用于 testset,通常效果是不太好的,因为有过拟合,这是个典型的错误
因为是典型的问题,所以也有典型的解法,对于决策树分类问题,解法是这样的:
我们把 trainset 分为两个子集: trainset_1_of_2, trainset_2_of_2
接下来的重点是,我们不是直接构建一个最佳的 model,而是构建一个最佳的 model 的生成参数 (比如 max_depth)
“`C++
int best_depth = -1;
int best_score = -1;
for (int max_depth = 1; max_depth < 10; max_depth++) {
tree1 = construct(trainset_1_of_2, max_depth);
score1 = run(trainset_2_of_2, tree1);
tree2 = construct(trainset_2_of_2, max_depth);
score2 = run(trainset_1_of_2, tree2);
score = (score1 + score2) / 2;
if (score > best_score) {
best_score = score;
best_depth = max_depth;
}
}
“`
这样我们就得到了 best_depth,然后在整个 trainset 上用这个参数来构建决策树
“`C++
tree = construct(trainset, best_depth);
“`
接下来这颗树在 testset 上效果就比较好了
但是如果我们搜索的,不是模型生成参数,而是模型本身 (使用遗传算法),这套方法还成立吗?
PS: 目前使用的是类似图像演化的遗传算法,得到是一个类似 BMP 的图像