scikit-learn 分类器循环重置

数据挖掘 机器学习 Python 分类 scikit-学习
2022-03-09 10:18:01

我正在尝试通过运行可以在此处找到的示例脚本来评估分类器比较

我注意到在某些情况下分类器没有被重置。事实上,复制其中一些(没有参数变化)分数和计数在两者之间的变化。

这可以简单地AdaBoostClassifier()在分类器列表中替换为另一个MLPClassifier(alpha=1)

我想在 for 循环的每个 cicle 中都应该重置分类器,以便在不同模型之间进行公平比较,我认为这种情况应该表现相同。

特别是,在复制 MPL(神经网络)和随机森林时注意到了差异,而复制 KNN 或 RBF SVM 则没有变化。

我也尝试clone了分类器,甚至del clf在循环中,但行为保持不变。

如何使评估可复制且不受前一次运行的影响?我想确保当我使用相同的模型并且只更改参数时结果是正确的,并且只有当两个相同的模型产生相同的结果时才有可能。

1个回答

您看到的行为与未正确重置模型无关,而是与大多数这些算法的随机性有关。通过设置随机种子,每次都会生成相同的随机数。看:

如何为 scikit-learn 播种随机数生成器?

然而,虽然这会产生可重复的样本,但这可能仍然不公平。如果一个模型随机获得一个好种子而另一个模型随机获得一个坏种子,那么您将不公平地总是偏爱第一个。您可以做的是使用相同的超参数但使用不同的种子多次运行模型并寻找平均性能。通过这种方式,您可以获得更公平的比较和可重复性。把种子放在前面,然后你可以把它们循环起来。像这样的东西:

seeds = (1, 2, 3, 4, 5)
performances = []
for seed in seeds:
    performances.append(score(Model(param1=1, param2=2, random_state=seed)))