svm 需要很长时间来调整超参数
svm takes long time for hyperparameter tuning
我是 运行 credit card dataset 上的支持向量机、逻辑回归和随机森林。我的训练数据集的形状为 (454491, 30)。我将 'scoring' 设置为 'f1_weighted' 进行了 5 折交叉验证(花了一个多小时)并得到以下结果:
Logistic Regression Cross Validation F1 score: 0.9501631748525725
Random Forest Cross Validation F1 score: 0.9999383944188953
Support Vector Cross Validation F1 score: 0.9989703035983751
我选择了 SVM,因为随机森林容易过拟合,而且 SVM 得分比 Logistic 回归好。
我想通过超参数调整添加正则化。我最初使用 GridSearchCV 但它花了很长时间所以我将它更改为 RandomizedSearchCV 但即使这样也需要很长时间(大约 4-5 + 小时)。根据数据描述,对特征进行了缩放,并进行了 PCA 以保留隐私信息。我还在数量和时间列上使用了 RobustScaler(),因为它们没有缩放。
tuned_parameters={"kernel":['rbf','sigmoid'],
'gamma':[1e-2, 1e-3, 1e-4, 1e-5],
'C':[0.001, 0.10, 0.0001,0.00001]}
tuned_SVM=RandomizedSearchCV(SVC(),tuned_parameters,cv=3,scoring='f1_weighted',random_state=12,verbose=15,n_jobs=-1)
对如何进行有什么建议吗?
首先;随机森林的思想是减少过度拟合。单个决策树(经常)非常过度拟合是正确的——这就是为什么我们创建这个集成来减少方差但仍然保持低偏差的原因。请注意,随机森林的方差(过度拟合)可能会因您的参数而有很大差异,例如,如果您设置 max_features=n_features
其中 n_features
是特征的数量,您将只创建多个相同的决策树确实会导致过拟合。
我的意思是,随机森林可以是一个强大的工具,决策树严重过度拟合,而随机森林(应该) 不是。
其次;如果我没记错的话,SVM 的训练时间是 O(n^2),其中 n
是训练点的数量,即当有大量训练数据时,可能需要很长时间才能适应 grid-searching 在参数上可能需要很长 (!) 的时间。
第三;关于正则化。如果您有一个使用内核的 0.99 val-score(假设它是“rbf”),我会 运行 使用“rbf”内核并调整 C
参数,因为training-time 的支持向量机。另外,0.998 还不够好吗?
可以使用“成本复杂度 p运行ing”对决策树进行正则化,在逻辑回归中,您可以使用复杂度(树的深度)对评分函数进行惩罚。我不认为随机森林(sklearn)有那个选项。
他们的决策树有,所以你可以从中构建你自己的随机森林,但由于你在随机森林中有 max_depth
参数,我认为这不值得。
第四;考虑 bayesian optimization
当随机森林(根据您的结果)表现更好并且训练速度更快时,您为什么要使用 SVM?
我是 运行 credit card dataset 上的支持向量机、逻辑回归和随机森林。我的训练数据集的形状为 (454491, 30)。我将 'scoring' 设置为 'f1_weighted' 进行了 5 折交叉验证(花了一个多小时)并得到以下结果:
Logistic Regression Cross Validation F1 score: 0.9501631748525725
Random Forest Cross Validation F1 score: 0.9999383944188953
Support Vector Cross Validation F1 score: 0.9989703035983751
我选择了 SVM,因为随机森林容易过拟合,而且 SVM 得分比 Logistic 回归好。
我想通过超参数调整添加正则化。我最初使用 GridSearchCV 但它花了很长时间所以我将它更改为 RandomizedSearchCV 但即使这样也需要很长时间(大约 4-5 + 小时)。根据数据描述,对特征进行了缩放,并进行了 PCA 以保留隐私信息。我还在数量和时间列上使用了 RobustScaler(),因为它们没有缩放。
tuned_parameters={"kernel":['rbf','sigmoid'],
'gamma':[1e-2, 1e-3, 1e-4, 1e-5],
'C':[0.001, 0.10, 0.0001,0.00001]}
tuned_SVM=RandomizedSearchCV(SVC(),tuned_parameters,cv=3,scoring='f1_weighted',random_state=12,verbose=15,n_jobs=-1)
对如何进行有什么建议吗?
首先;随机森林的思想是减少过度拟合。单个决策树(经常)非常过度拟合是正确的——这就是为什么我们创建这个集成来减少方差但仍然保持低偏差的原因。请注意,随机森林的方差(过度拟合)可能会因您的参数而有很大差异,例如,如果您设置 max_features=n_features
其中 n_features
是特征的数量,您将只创建多个相同的决策树确实会导致过拟合。
我的意思是,随机森林可以是一个强大的工具,决策树严重过度拟合,而随机森林(应该) 不是。
其次;如果我没记错的话,SVM 的训练时间是 O(n^2),其中 n
是训练点的数量,即当有大量训练数据时,可能需要很长时间才能适应 grid-searching 在参数上可能需要很长 (!) 的时间。
第三;关于正则化。如果您有一个使用内核的 0.99 val-score(假设它是“rbf”),我会 运行 使用“rbf”内核并调整 C
参数,因为training-time 的支持向量机。另外,0.998 还不够好吗?
可以使用“成本复杂度 p运行ing”对决策树进行正则化,在逻辑回归中,您可以使用复杂度(树的深度)对评分函数进行惩罚。我不认为随机森林(sklearn)有那个选项。
他们的决策树有,所以你可以从中构建你自己的随机森林,但由于你在随机森林中有 max_depth
参数,我认为这不值得。
第四;考虑 bayesian optimization
当随机森林(根据您的结果)表现更好并且训练速度更快时,您为什么要使用 SVM?