- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在 sci-kit learn 中构建 MLPClassifier 模型。我使用 gridSearchCV 和 roc_auc 对模型进行评分。训练和考试的平均成绩在 0.76 左右,还不错。 cv_results_
的输出是:
Train set AUC: 0.553465272412
Grid best score (AUC): 0.757236688092
Grid best parameter (max. AUC): {'hidden_layer_sizes': 10}
{ 'mean_fit_time': array([63.54, 136.37, 136.32, 119.23, 121.38, 124.03]),
'mean_score_time': array([ 0.04, 0.04, 0.04, 0.05, 0.05, 0.06]),
'mean_test_score': array([ 0.76, 0.74, 0.75, 0.76, 0.76, 0.76]),
'mean_train_score': array([ 0.76, 0.76, 0.76, 0.77, 0.77, 0.77]),
'param_hidden_layer_sizes': masked_array(data = [5 (5, 5) (5, 10) 10 (10, 5) (10, 10)],
mask = [False False False False False False],
fill_value = ?)
,
'params': [ {'hidden_layer_sizes': 5},
{'hidden_layer_sizes': (5, 5)},
{'hidden_layer_sizes': (5, 10)},
{'hidden_layer_sizes': 10},
{'hidden_layer_sizes': (10, 5)},
{'hidden_layer_sizes': (10, 10)}],
'rank_test_score': array([ 2, 6, 5, 1, 4, 3]),
'split0_test_score': array([ 0.76, 0.75, 0.75, 0.76, 0.76, 0.76]),
'split0_train_score': array([ 0.76, 0.75, 0.75, 0.76, 0.76, 0.76]),
'split1_test_score': array([ 0.77, 0.76, 0.76, 0.77, 0.76, 0.76]),
'split1_train_score': array([ 0.76, 0.75, 0.75, 0.76, 0.76, 0.76]),
'split2_test_score': array([ 0.74, 0.72, 0.73, 0.74, 0.74, 0.75]),
'split2_train_score': array([ 0.77, 0.77, 0.77, 0.77, 0.77, 0.77]),
'std_fit_time': array([47.59, 1.29, 1.86, 3.43, 2.49, 9.22]),
'std_score_time': array([ 0.01, 0.01, 0.01, 0.00, 0.00, 0.01]),
'std_test_score': array([ 0.01, 0.01, 0.01, 0.01, 0.01, 0.01]),
'std_train_score': array([ 0.01, 0.01, 0.01, 0.01, 0.01, 0.00])}
正如你所看到的,我使用的 KFold 为 3。有趣的是,手动计算的训练集的 roc_auc_score 报告为 0.55,而平均训练分数报告为 ~0.76。生成此输出的代码是:
def model_mlp (X_train, y_train, verbose=True, random_state = 42):
grid_values = {'hidden_layer_sizes': [(5), (5,5), (5, 10),
(10), (10, 5), (10, 10)]}
# MLP requires scaling of all predictors
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
mlp = MLPClassifier(solver='adam', learning_rate_init=1e-4,
max_iter=200,
verbose=False,
random_state=random_state)
# perform the grid search
grid_auc = GridSearchCV(mlp,
param_grid=grid_values,
scoring='roc_auc',
verbose=2, n_jobs=-1)
grid_auc.fit(X_train, y_train)
y_hat = grid_auc.predict(X_train)
# print out the results
if verbose:
print('Train set AUC: ', roc_auc_score(y_train, y_hat))
print('Grid best score (AUC): ', grid_auc.best_score_)
print('Grid best parameter (max. AUC): ', grid_auc.best_params_)
print('')
pp = pprint.PrettyPrinter(indent=4)
pp.pprint (grid_auc.cv_results_)
print ('MLPClassifier fitted, {:.2f} seconds used'.format (time.time () - t))
return grid_auc.best_estimator_
由于这种差异,我决定“模拟”GridSearchCV
例程并得到以下结果:
Shape X_train: (107119, 15)
Shape y_train: (107119,)
Shape X_val: (52761, 15)
Shape y_val: (52761,)
layers roc-auc
Seq l1 l2 train test iters runtime
1 5 0 0.5522 0.5488 85 20.54
2 5 5 0.5542 0.5513 80 27.10
3 5 10 0.5544 0.5521 83 28.56
4 10 0 0.5532 0.5516 61 15.24
5 10 5 0.5540 0.5518 54 19.86
6 10 10 0.5507 0.5474 56 21.09
分数都在0.55左右,与上面代码中手动计算的结果一致。令我惊讶的是结果没有变化。看来我犯了一些错误,但我找不到错误,请参阅代码:
def simple_mlp (X, y, verbose=True, random_state = 42):
def do_mlp (X_t, X_v, y_t, y_v, n, l1, l2=None):
if l2 is None:
layers = (l1)
l2 = 0
else:
layers = (l1, l2)
t = time.time ()
mlp = MLPClassifier(solver='adam', learning_rate_init=1e-4,
hidden_layer_sizes=layers,
max_iter=200,
verbose=False,
random_state=random_state)
mlp.fit(X_t, y_t)
y_hat_train = mlp.predict(X_t)
y_hat_val = mlp.predict(X_v)
if verbose:
av = 'samples'
acc_trn = roc_auc_score(y_train, y_hat_train, average=av)
acc_tst = roc_auc_score(y_val, y_hat_val, average=av)
print ("{:5d}{:4d}{:4d}{:7.4f}{:7.4f}{:9d}{:8.2f}"
.format(n, l1, l2, acc_trn, acc_tst, mlp.n_iter_, time.time() - t))
return mlp, n + 1
X_train, X_val, y_train, y_val = train_test_split (X, y, test_size=0.33, random_state=random_state)
if verbose:
print('Shape X_train:', X_train.shape)
print('Shape y_train:', y_train.shape)
print('Shape X_val:', X_val.shape)
print('Shape y_val:', y_val.shape)
# MLP requires scaling of all predictors
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_val = scaler.transform(X_val)
n = 1
layers1 = [5, 10]
layers2 = [5, 10]
if verbose:
print (" layers roc-auc")
print (" Seq l1 l2 train validation iters runtime")
for l1 in layers1:
mlp, n = do_mlp (X_train, X_val, y_train, y_val, n, l1)
for l2 in layers2:
mlp, n = do_mlp (X_train, X_val, y_train, y_val, n, l1, l2)
return mlp
我在这两种情况下使用完全相同的数据(159880 个观测值和 15 个预测变量)。我对 GridSearchCV 使用 cv=3
(默认值),并在我的手工代码中使用相同比例的验证集。在寻找可能的答案时,我发现 this post on SO它描述了同样的问题。没有人回答。也许有人明白到底发生了什么?
感谢您的宝贵时间。
编辑
我按照@Mohammed Kashif的建议检查了GridSearchCV和KFold的代码,确实发现了一个明确的注释,即KFold没有对数据进行混洗。因此,我在缩放器之前将以下代码添加到 model_mlp 中:
np.random.seed (random_state)
index = np.random.permutation (len(X_train))
X_train = X_train.iloc[index]
并进入 simple_mlp 作为 train_test_split 的替代品:
np.random.seed (random_state)
index = np.random.permutation (len(X))
X = X.iloc[index]
y = y.iloc[index]
train_size = int (2 * len(X) / 3.0) # sample of 2 third
X_train = X[:train_size]
X_val = X[train_size:]
y_train = y[:train_size]
y_val = y[train_size:]
这导致了以下输出:
Train set AUC: 0.5
Grid best score (AUC): 0.501410198106
Grid best parameter (max. AUC): {'hidden_layer_sizes': (5, 10)}
{ 'mean_fit_time': array([28.62, 46.00, 54.44, 46.74, 55.25, 53.33]),
'mean_score_time': array([ 0.04, 0.05, 0.05, 0.05, 0.05, 0.06]),
'mean_test_score': array([ 0.50, 0.50, 0.50, 0.50, 0.50, 0.50]),
'mean_train_score': array([ 0.50, 0.51, 0.51, 0.51, 0.50, 0.51]),
'param_hidden_layer_sizes': masked_array(data = [5 (5, 5) (5, 10) 10 (10, 5) (10, 10)],
mask = [False False False False False False],
fill_value = ?)
,
'params': [ {'hidden_layer_sizes': 5},
{'hidden_layer_sizes': (5, 5)},
{'hidden_layer_sizes': (5, 10)},
{'hidden_layer_sizes': 10},
{'hidden_layer_sizes': (10, 5)},
{'hidden_layer_sizes': (10, 10)}],
'rank_test_score': array([ 6, 2, 1, 4, 5, 3]),
'split0_test_score': array([ 0.50, 0.50, 0.51, 0.50, 0.50, 0.50]),
'split0_train_score': array([ 0.50, 0.51, 0.50, 0.51, 0.50, 0.51]),
'split1_test_score': array([ 0.50, 0.50, 0.50, 0.50, 0.49, 0.50]),
'split1_train_score': array([ 0.50, 0.50, 0.51, 0.50, 0.51, 0.51]),
'split2_test_score': array([ 0.49, 0.50, 0.49, 0.50, 0.50, 0.50]),
'split2_train_score': array([ 0.51, 0.51, 0.51, 0.51, 0.50, 0.51]),
'std_fit_time': array([19.74, 19.33, 0.55, 0.64, 2.36, 0.65]),
'std_score_time': array([ 0.01, 0.01, 0.00, 0.01, 0.00, 0.01]),
'std_test_score': array([ 0.01, 0.00, 0.01, 0.00, 0.00, 0.00]),
'std_train_score': array([ 0.00, 0.00, 0.00, 0.00, 0.00, 0.00])}
这似乎证实了穆罕默德的言论。我必须说,一开始我很怀疑,因为我无法想象随机化对如此大的数据集产生如此强烈的影响,而这个数据集看起来并不真正有序。
但是我有一些疑问。在原始设置中,GridSearchCV 始终过高约 0.20,现在始终过低约 0.05。这是一个进步,因为两种方法的偏差都减少了 4 倍。是否有对最后发现的解释,或者两种方法之间大约 0.05 的偏差仅仅是噪声的事实?我决定将此标记为正确答案,但我希望有人能够解答我的小疑问。
最佳答案
分数的差异主要是由于 GridSearchCV
分割数据集的方式不同以及模拟它的函数造成的。这样想吧。假设您的数据集中有 9 个数据点。现在 GridSearchCV 有 3 倍,假设分布如下:
train_cv_fold1_indices : 1 2 3 4 5 6
test_cv_fold1_indices : 7 8 9
train_cv_fold2_indices : 1 2 3 7 8 9
test_cv_fold2_indices : 4 5 6
train_cv_fold3_indices : 4 5 6 7 8 9
test_cv_fold3_indices : 1 2 3
但是,模拟 GridSearchCV 的函数可能会以不同的方式分割数据,例如:
train_indices : 1 3 5 7 8 9
test_indices : 2 4 6
现在正如您所看到的,这是数据集上的不同分割,因此在其上训练的分类器的行为可能会完全不同。 (它甚至可能表现相同,这完全取决于数据点和各种其他因素,例如它们的相关程度,它们是否有助于检查数据点之间的变化等)。
因此,为了完美模拟 GridSearchCV,您需要以相同的方式执行拆分。
检查GridSearchCV Source你会发现在第 592 行,为了执行 CV,他们调用了 check_cv
指定的另一个函数 at this link 。它实际上调用 Kfold CV或startified CV .
因此,根据您的实验,我建议使用固定随机种子和上述函数( Kfold CV 或 startified CV )在您的数据集上显式执行 CV。然后在模拟函数中使用相同的 CV 对象以获得更具可比性的分析。然后您可能会获得更多相关的值。
关于python - AUC 与 GridSearchCV AUC 有何不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46940280/
在 SQL 中计算 AUC 的最佳方法是什么? 这是我得到的(假设表 T(label, confid) 和 label=0,1): SELECT sum(cumneg * label) * 1e0 /
我正在训练用于图像分类的CNN。由于我的数据集有限,我正在使用转移学习。基本上,我使用的是Google在其再培训示例(https://www.tensorflow.org/tutorials/imag
我正在 sci-kit learn 中构建 MLPClassifier 模型。我使用 gridSearchCV 和 roc_auc 对模型进行评分。训练和考试的平均成绩在 0.76 左右,还不错。 c
我使用我的测试集作为验证集。我使用了与 How to compute Receiving Operating Characteristic (ROC) and AUC in keras? 类似的方法
我分别从 sklearn 的 RandomForestClassifier 和 roc_curve、auc 方法收到不同的 ROC-AUC 分数。 以下代码让我获得了 0.878 的 ROC-AUC(
如何获得具有 fpr 和 tpr 的 AUC 值? Fpr 和 tpr 只是从这些公式中获得的 2 个浮点数: my_fpr = fp / (fp + tn) my_tpr = tp / (tp +
我有一个分类问题,我想在 sklearn 中使用 cross_validate 获取 roc_auc 值。我的代码如下。 from sklearn import datasets iris = dat
我有一个分类问题,我想在 sklearn 中使用 cross_validate 获取 roc_auc 值。我的代码如下。 from sklearn import datasets iris = dat
在 scikit learn 中,您可以使用以下方法计算二元分类器的曲线下面积 roc_auc_score( Y, clf.predict_proba(X)[:,1] ) 我只对误报率小于 0.1 的
我正在尝试为我的 SVM 找到参数,这些参数会给我最好的 AUC。但是我在 sklearn 中找不到 AUC 的任何评分函数。有人有想法吗?这是我的代码: parameters = {"C":
这是一个代表 library(caret) library(dplyr) set.seed(88, sample.kind = "Rounding") mtcars % mutate(am = a
对于二元分类问题,我有一个略微不平衡的数据集,正负比为 0.6。 我最近从这个答案中了解到了 auc 指标:https://stats.stackexchange.com/a/132832/12822
我有一个 Spark 数据框,如下所示: predictions.show(5) +------+----+------+-----------+ | user|item|rating| predi
我正在研究一个分类问题,其评估指标为 ROC AUC。到目前为止,我已经尝试使用具有不同参数的 xgb 。这是我用来采样数据的函数。并且可以找到相关笔记本here (google colab) def
我对 python 中的 scikit-learn 中如何生成阈值感到困惑。对于以下示例,生成了四个阈值,当我将 pred 中的第三个值更改为 0.6 时,阈值数量降至 3。任何人都可以解释为什么会这
假设我有一个如下所示的数据集: word label_numeric 0 active 0 1 adventurous 0 2 aggressive 0 3 aggressi
我有一个分类问题,需要根据给定的数据预测 (0,1) 类。基本上我有一个包含超过 300 个特征(包括预测目标值)和超过 2000 行(样本)的数据集。我应用了不同的分类器,如下所示: 1. Dec
我的目标是找到预测模型来确定是否偿还贷款。我的来源是一个 CSV 文件,其中包含贷款特征以及是否已偿还。我使用 ROC 曲线和 AUC 评估模型的性能 df = pd.read_csv(your_pa
我想知道为什么我们的目标是在最大化准确率时最大化 AUC? 我认为,除了最大化准确性的主要目标之外,AUC 也会自动变大。 最佳答案 我想我们使用 AUC 是因为它解释了我们的方法能够在多大程度上独立
我正在尝试在非常不平衡的数据集上使用 LightGBM 构建分类器。不平衡的比例为 97:3,即: Class 0 0.970691 1 0.029309 我使用的参数和训练代码如下所示。
我是一名优秀的程序员,十分优秀!