gpt4 book ai didi

scikit-learn - 有没有办法在 One-Class SVM 上执行网格搜索超参数优化

转载 作者:行者123 更新时间:2023-12-04 05:21:07 26 4
gpt4 key购买 nike

有没有办法使用 GridSearchCV 或任何其他内置 sklearn 函数来找到 OneClassSVM 分类器的最佳超参数?

我目前所做的是使用这样的训练/测试拆分自己执行搜索:

Gamma 和 nu 值定义为:

gammas = np.logspace(-9, 3, 13)
nus = np.linspace(0.01, 0.99, 99)

探索所有可能的超参数并找到最佳超参数的函数:
clf = OneClassSVM()

results = []

train_x = vectorizer.fit_transform(train_contents)
test_x = vectorizer.transform(test_contents)

for gamma in gammas:
for nu in nus:
clf.set_params(gamma=gamma, nu=nu)

clf.fit(train_x)

y_pred = clf.predict(test_x)

if 1. in y_pred: # Check if at least 1 review is predicted to be in the class
results.append(((gamma, nu), (accuracy_score(y_true, y_pred),
precision_score(y_true, y_pred),
recall_score(y_true, y_pred),
f1_score(y_true, y_pred),
roc_auc_score(y_true, y_pred),
))
)

# Determine and print the best parameter settings and their performance
print_best_parameters(results, best_parameters(results))

结果存储在以下形式的元组列表中:

((gamma, nu)(accuracy_score, precision_score, recall_score, f1_score, roc_auc_score))



为了找到最佳准确度、f1、roc_auc 分数和参数,我编写了自己的函数:

best_parameters(results)

最佳答案

我遇到了同样的问题,并在寻找解决方案时发现了这个问题。我最终找到了一个使用 GridSearchCV 的解决方案并将此答案留给搜索并找到此问题的任何其他人。
cv GridSearchCV 的参数class 可以将可迭代的 yielding (train, test) 拆分为索引数组作为其输入。您可以生成仅使用训练折叠中正类的数据、正类中的剩余数据以及测试折叠中负类中的所有数据的拆分。

您可以使用 sklearn.model_selection.KFold使 split

from sklearn.model_selection import KFold

假设 XposOneClassSVM 的正类数据的 nXp numpy 数组和 Xneg是已知异常示例的 mXp 数据数组。

您可以先为 Xpos 生成拆分使用
splits = KFold(n_splits=5).split(Xpos)

这将构造一个形式为 (train, test) 的元组生成器哪里 train是一个 numpy 数组,包含训练折叠中示例的索引和 test是一个 numpy 数组,其中包含测试折叠中示例的索引。

然后您可以组合 XposXneg使用
X = np.concatenate([Xpos, Xneg], axis=0)
OneClassSVM会做预测 1.0例如,它认为属于正类和预测 -1.0例如它认为是异常的。我们可以使用以下方法为我们的数据制作标签
y = np.concatenate([np.repeat(1.0, len(Xpos)), np.repeat(-1.0, len(Xneg))])

然后我们可以制作一个新的生成器 (train, test)使用包含在测试折叠中的异常示例的索引进行拆分。
n, m = len(Xpos), len(Xneg)

splits = ((train, np.concatenate([test, np.arange(n, n + m)], axis=0)
for train, test in splits)

然后,您可以将这些拆分传递给 GridSearchCV使用数据 X, y以及您希望的任何评分方法和其他参数。
grid_search = GridSearchCV(estimator, param_grid, cv=splits, scoring=...)

编辑:我没有注意到 Vivek Kumar 在另一个答案的评论中建议了这种方法,并且 OP 拒绝了它,因为他们不相信它会适用于他们选择最佳参数的方法。我仍然更喜欢我所描述的方法,因为 GridSearchCV 将自动处理多处理并提供异常处理和信息性警告和错误消息。

在评分方法的选择上也很灵活。您可以通过将字典映射字符串传递给可调用的评分来使用多种评分方法,甚至可以定义自定义
得分可调用。这在 Scikit-learn 文档 here 中有所描述。 .选择最佳参数的定制方法可能可以通过自定义评分函数来实现。 OP 使用的所有指标都可以使用文档中描述的字典方法包含在内。

你可以找到一个真实世界的例子 here .当它合并到 master 时,我会记下更改链接。

关于scikit-learn - 有没有办法在 One-Class SVM 上执行网格搜索超参数优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44698928/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com