网格搜索寻找AUC参数

12

我试图找到SVM的参数,以获得最佳AUC。但是我在sklearn中找不到任何评分函数来计算AUC。有人有什么想法吗?以下是我的代码:

    parameters = {"C":[0.1, 1, 10, 100, 1000], "gamma":[0.1, 0.01, 0.001, 0.0001, 0.00001]}
    clf = SVC(kernel = "rbf")
    clf = GridSearchCV(clf, parameters, scoring = ???)
    svr.fit(features_train , labels_train)
    print svr.best_params_

那么我该使用什么来获取高AUC得分的最佳参数?

4个回答

32

您可以简单地使用:

clf = GridSearchCV(clf, parameters, scoring='roc_auc')

2
如果我打印出 svr.best_score_,那么它就是AUC吗?因为我尝试像这样计算它:#ROC false_positive_rate, true_positive_rate, thresholds = roc_curve(labels_test, labels_predicted) roc_auc = auc(false_positive_rate, true_positive_rate) print roc_auc 但它显示的AUC比最佳得分要低。 - julianspaeth
1
最佳得分对应于训练过程中每个折叠的最佳平均roc_auc。人们预计在测试集上会看到较低的分数。 - piman314

11

您可以自己制作任何得分器:

from sklearn.metrics import make_scorer
from sklearn.metrics import roc_curve, auc

# define scoring function 
 def custom_auc(ground_truth, predictions):
     # I need only one column of predictions["0" and "1"]. You can get an error here
     # while trying to return both columns at once
     fpr, tpr, _ = roc_curve(ground_truth, predictions[:, 1], pos_label=1)    
     return auc(fpr, tpr)

# to be standart sklearn's scorer        
 my_auc = make_scorer(custom_auc, greater_is_better=True, needs_proba=True)

 pipeline = Pipeline(
                [("transformer", TruncatedSVD(n_components=70)),
                ("classifier", xgb.XGBClassifier(scale_pos_weight=1.0, learning_rate=0.1, 
                                max_depth=5, n_estimators=50, min_child_weight=5))])

 parameters_grid = {'transformer__n_components': [60, 40, 20] }

 grid_cv = GridSearchCV(pipeline, parameters_grid, scoring = my_auc, n_jobs=-1,
                                                        cv = StratifiedShuffleSplit(n_splits=5,test_size=0.3,random_state = 0))
 grid_cv.fit(X, y)

请查看此处获取更多信息:sklearn make_scorer


6
使用以下代码,将会给你所有参数的列表。
import sklearn

sklearn.metrics.SCORERS.keys()

选择适当的参数以便使用

在您的情况下,以下代码将起作用

clf = GridSearchCV(clf, parameters, scoring = 'roc_auc')

3
我还没有尝试过,但我认为你想要使用sklearn.metrics.roc_auc_score。问题是它不是一个模型评分器,因此您需要构建一个。可以像下面这样实现:
from sklearn.metrics import roc_auc_score

def score_auc(estimator, X, y):
    y_score = estimator.predict_proba(X)  # You could also use the binary predict, but probabilities should give you a more realistic score.
    return roc_auc_score(y, y_score)

并在GridSearch中将此函数用作得分参数。


谢谢,我喜欢你的想法,但如果我这样做:svr = GridSearchCV(svr, parameters, scoring = score_auc(svr, features_train, labels_train))会导致:AttributeError: predict_proba在probability=False时不可用。如果我将其设置为true,则会出现另一个错误。 - julianspaeth
1
只需执行 svr = GridSearchCV(svr, parameters, scoring=score_auc),不要调用函数,只需将其传递给搜索。如果 predict_proba 给您带来问题,只需使用常规的 predict 进行评分即可。 - pekapa
感觉这将会在训练数据上通过“score_auc” - 如果我们想要在交叉验证数据上进行评分,该怎么办? - Mohamad Zeina
对于某些 SVM 模型,您需要在初始化时显式设置超参数 "probability=True",以便获得概率预测。 - GrimSqueaker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接