Python实现基于AUC的SVM随机搜索调参:最佳参数模型筛选
Python实现基于AUC的SVM随机搜索调参:最佳参数模型筛选
本文介绍了如何使用Python代码实现基于AUC指标的SVM随机搜索调参方法,并通过设定训练集和验证集AUC阈值以及二者差值阈值来筛选最佳参数模型,最终输出满足条件的最佳参数模型。
代码实现:
from sklearn.svm import SVC
from sklearn.model_selection import RandomizedSearchCV
from sklearn.metrics import roc_auc_score
import numpy as np
# X_train, y_train, X_val, y_val为训练集和验证集的特征和标签
# param_distributions为SVM的参数分布范围
# n_iter为随机搜索的迭代次数
# scoring为评估指标,这里使用AUC作为评估指标
def random_search_SVM(X_train, y_train, X_val, y_val, param_distributions, n_iter=10, scoring='roc_auc'):
best_score = 0
while True:
# 随机搜索SVM的参数
svm = SVC()
random_search = RandomizedSearchCV(svm, param_distributions, n_iter=n_iter, scoring=scoring)
random_search.fit(X_train, y_train)
# 计算训练集和验证集的AUC
y_train_prob = random_search.predict_proba(X_train)[:, 1]
train_auc = roc_auc_score(y_train, y_train_prob)
y_val_prob = random_search.predict_proba(X_val)[:, 1]
val_auc = roc_auc_score(y_val, y_val_prob)
# 判断是否满足条件
if train_auc > 0.75 and val_auc > 0.75 and abs(train_auc - val_auc) < 0.1:
# 输出最佳参数模型
print('Best parameters:', random_search.best_params_)
print('Best score:', random_search.best_score_)
return random_search.best_estimator_
# 记录当前最佳结果
if val_auc > best_score:
best_score = val_auc
best_estimator = random_search.best_estimator_
代码说明:
- 函数
random_search_SVM()接受训练集特征X_train、训练集标签y_train、验证集特征X_val、验证集标签y_val、SVM参数分布param_distributions、随机搜索迭代次数n_iter和评估指标scoring作为参数。 - 函数首先定义一个循环,不断进行随机搜索,直到找到满足条件的最佳参数模型。
- 在每个迭代中,使用
RandomizedSearchCV进行随机搜索,并计算训练集和验证集的AUC。 - 如果训练集AUC和验证集AUC都大于0.75,且二者差值小于0.1,则输出最佳参数模型,并结束循环。
- 如果当前迭代的验证集AUC高于之前记录的最佳结果,则更新最佳结果。
使用方法:
- 将训练集特征
X_train、训练集标签y_train、验证集特征X_val、验证集标签y_val以及SVM参数分布param_distributions传入函数random_search_SVM()。 - 运行函数
random_search_SVM(),函数会返回满足条件的最佳参数模型。
注意:
- 训练集AUC和验证集AUC的阈值以及二者差值阈值可以根据实际情况进行调整。
- 随机搜索迭代次数
n_iter也需要根据实际情况进行调整,迭代次数越多,找到最佳参数模型的概率越高,但耗时也越长。
示例:
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
# 加载鸢尾花数据集
data = load_iris()
X = data.data
y = data.target
# 将数据集划分为训练集和验证集
X_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.2)
# 定义SVM参数分布范围
param_distributions = {'C': [0.1, 1, 10, 100],
'gamma': [0.01, 0.1, 1, 10]}
# 使用随机搜索调参
best_estimator = random_search_SVM(X_train, y_train, X_val, y_val, param_distributions)
# 使用最佳参数模型进行预测
# ...
原文地址: https://www.cveoy.top/t/topic/oJXq 著作权归作者所有。请勿转载和采集!