我使用scikit学习下面显示的代码。
我有阶级不平衡(大致是0:1的90:10分裂)。在阅读了许多其他问题后,我使用了class_weighted参数。
然而,每次运行代码时,我都会得到一组不同的重要功能和不同的AOC,精度,召回等。
当我删除class_weight参数时,问题不存在。
如图所示,我已将random_state设置为常量,因此这不是问题。许多预测因子具有高度相关性。有谁知道这是什么问题? (注意我昨天发布了一个类似的问题,但由于我还不够清楚,所以我没有给出一长串评论,而是删除了一些问题,我希望其他人更清楚,现在提供了相关信息。需要)。
x_train, x_test, y_train, y_test = train_test_split(x, y)
parameters = {
'max_depth': [6,7, 8],
'min_samples_split': [100, 150],
'min_samples_leaf': [50,75]
}
clf = GridSearchCV(DecisionTreeClassifier(
random_state=99,
class_weight='balanced'),
parameters, refit=True, cv=10)
clf.fit(x_train, y_train.ravel()
# create main tree using best settings
clf2 = DecisionTreeClassifier(
max_depth=clf.best_params_['max_depth'],
min_samples_split=clf.best_params_['min_samples_split'],
min_samples_leaf=clf.best_params_['min_samples_leaf'],
random_state=99,
class_weight='balanced')
clf2.fit(x_train, y_train.ravel())
答案 0 :(得分:1)
在上面的代码中,有多个随机点。
1)train_test_split
使用随机改组来混洗数据,然后分成训练和测试。所以首先你需要稳定它。
2)GridSearchCV使用cv
参数,对于分类任务,该参数使用StratifiedKFold()将数据拆分为不同的折叠。所以这也是随机性。
解决方法:请在处理数据之前在代码中设置此行(如果位于顶部,则位于导入行的下方,则更好。)
numpy.random.seed(SOME_INTEGER)
导入时使用numpy
或np
。
说明:请参阅以下问题: -