- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
GridSearchCV
仅返回每个参数化的分数,我还希望看到 Roc 曲线以更好地理解结果。为了做到这一点,我想从 GridSearchCV 中获取性能最佳的模型并重现这些相同的结果,但缓存概率。这是我的代码
import numpy as np
import pandas as pd
from sklearn.datasets import make_classification
from sklearn.decomposition import PCA
from sklearn.ensemble import RandomForestClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.feature_selection import SelectFromModel
from sklearn.metrics import roc_auc_score
from sklearn.model_selection import GridSearchCV
from sklearn.model_selection import StratifiedKFold
from sklearn.pipeline import Pipeline
from tqdm import tqdm
import warnings
warnings.simplefilter("ignore")
data = make_classification(n_samples=100, n_features=20, n_classes=2,
random_state=1, class_sep=0.1)
X, y = data
small_pipe = Pipeline([
('rfs', SelectFromModel(RandomForestClassifier(n_estimators=100))),
('clf', LogisticRegression())
])
params = {
'clf__class_weight': ['balanced'],
'clf__penalty' : ['l1', 'l2'],
'clf__C' : [0.1, 0.5, 1.0],
'rfs__max_features': [3, 5, 10]
}
key_feats = ['mean_train_score', 'mean_test_score', 'param_clf__C',
'param_clf__penalty', 'param_rfs__max_features']
skf = StratifiedKFold(n_splits=5, random_state=0)
all_results = list()
for _ in tqdm(range(25)):
gs = GridSearchCV(small_pipe, param_grid=params, scoring='roc_auc', cv=skf, n_jobs=-1);
gs.fit(X, y);
results = pd.DataFrame(gs.cv_results_)[key_feats]
all_results.append(results)
param_group = ['param_clf__C', 'param_clf__penalty', 'param_rfs__max_features']
all_results_df = pd.concat(all_results)
all_results_df.groupby(param_group).agg(['mean', 'std']
).sort_values(('mean_test_score', 'mean'), ascending=False).head(20)
这是我重现结果的尝试
small_pipe_w_params = Pipeline([
('rfs', SelectFromModel(RandomForestClassifier(n_estimators=100), max_features=3)),
('clf', LogisticRegression(class_weight='balanced', penalty='l2', C=0.1))
])
skf = StratifiedKFold(n_splits=5, random_state=0)
all_scores = list()
for _ in range(25):
scores = list()
for train, test in skf.split(X, y):
small_pipe_w_params.fit(X[train, :], y[train])
probas = small_pipe_w_params.predict_proba(X[test, :])[:, 1]
# cache probas here to build an Roc w/ conf interval later
scores.append(roc_auc_score(y[test], probas))
all_scores.extend(scores)
print('mean: {:<1.3f}, std: {:<1.3f}'.format(np.mean(all_scores), np.std(all_scores)))
我多次运行上述命令,因为结果似乎不稳定。我创建了一个具有挑战性的数据集,因为我自己的数据集同样难以学习。 groupby 旨在采用 GridSearchCV 的所有迭代并对训练和测试分数进行平均和标准差以稳定结果。然后,我挑选出性能最佳的模型(在我最近的模型中,C=0.1、penalty=l2 和 max_features=3),并在故意放入这些参数时尝试重现这些相同的结果。
GridSearchCV 模型产生 0.63 平均值和 0.042 std roc 分数,而我自己的实现得到 0.59 平均值和 std 0.131 roc 分数。网格搜索得分要好得多。如果我对 GSCV 和我自己的实验进行 100 次迭代,结果是相似的。
为什么这些结果不一样?当提供 cv 的整数时,它们都在内部使用 StratifiedKFold() ......并且也许 GridSearchCV 按折叠大小对分数进行加权?我不确定这一点,但这是有道理的。我的实现有缺陷吗?
编辑:random_state
添加到 SKFold
最佳答案
如果您设置RandomForestClassifier
的random_state集合,则不同girdsearchCV
之间的差异将被消除。
为了简化,我设置了 n_estimators =10 并得到了以下结果
mean_train_score mean_test_score
param_clf__C param_clf__penalty param_ rfs_max_features mean std mean std
1.0 l2 5 0.766701 0.000000 0.580727 0.0 10 0.768849 0.000000 0.577737 0.0
现在,如果查看最佳超参数的每个分割(通过删除 key_feats
过滤)的性能,请使用
all_results_df.sort_values(('mean_test_score'), ascending=False).head(1).T
我们会得到
16
mean_fit_time 0.228381
mean_score_time 0.113187
mean_test_score 0.580727
mean_train_score 0.766701
param_clf__C 1
param_clf__class_weight balanced
param_clf__penalty l2
param_rfs__max_features 5
params {'clf__class_weight': 'balanced', 'clf__penalt...
rank_test_score 1
split0_test_score 0.427273
split0_train_score 0.807051
split1_test_score 0.47
split1_train_score 0.791745
split2_test_score 0.54
split2_train_score 0.789243
split3_test_score 0.78
split3_train_score 0.769856
split4_test_score 0.7
split4_train_score 0.67561
std_fit_time 0.00586908
std_score_time 0.00152781
std_test_score 0.13555
std_train_score 0.0470554
让我们重现这个!
skf = StratifiedKFold(n_splits=5, random_state=0)
all_scores = list()
scores = []
weights = []
for train, test in skf.split(X, y):
small_pipe_w_params = Pipeline([
('rfs', SelectFromModel(RandomForestClassifier(n_estimators=10,
random_state=0),max_features=5)),
('clf', LogisticRegression(class_weight='balanced', penalty='l2', C=1.0,random_state=0))
])
small_pipe_w_params.fit(X[train, :], y[train])
probas = small_pipe_w_params.predict_proba(X[test, :])
# cache probas here to build an Roc w/ conf interval later
scores.append(roc_auc_score(y[test], probas[:,1]))
weights.append(len(test))
print(scores)
print('mean: {:<1.6f}, std: {:<1.3f}'.format(np.average(scores, axis=0, weights=weights), np.std(scores)))
[0.42727272727272736, 0.47, 0.54, 0.78, 0.7]
mean: 0.580727, std: 0.135
注意:mean_test_score
不仅仅是简单平均值,它是加权平均值。原因是iid
param
来自Documentation :
iid : boolean, default=’warn’ If True, return the average score across folds, weighted by the number of samples in each test set. In this case, the data is assumed to be identically distributed across the folds, and the loss minimized is the total loss per sample, and not the mean loss across the folds. If False, return the average score across folds. Default is True, but will change to False in version 0.21, to correspond to the standard definition of cross-validation.
Changed in version 0.20: Parameter iid will change from True to False by default in version 0.22, and will be removed in 0.24.
关于python - 为什么我不能得到与 GridSearchCV 相同的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55717820/
考虑以下网格搜索: grid = GridSearchCV(clf, parameters, n_jobs =-1, iid=True, cv =5) grid_fit = grid.fit(X_tr
我正在做一个 GridSearchCV,我已经监控了核心的百分比,并且我看到当我运行一个简单的神经网络时,4 个核心具有相同的百分比,但是当网格搜索 cv (n_jobs = 1) 开始时在情节的线条
我在带有 RBF 内核的 SVM 上进行了网格搜索 + 交叉验证,以使用类 GridShearchCV 找到参数 C 和 gamma 的最佳值。现在我想以表格格式获得结果,例如 C/gamma 1e-
我正在尝试为 sklearn 的 GridSearchCV 结果生成热图。我喜欢的东西sklearn-evaluation是因为生成热图真的很容易。但是,我遇到了一个问题。当我将参数设为 None 时
我想提高这个的参数GridSearchCV 对于 随机森林回归器 . def Grid_Search_CV_RFR(X_train, y_train): from sklearn.model_
我正在尝试设置 GridSearchCV 的实例来确定哪一组超参数将产生最低的平均绝对误差。 This scikit documentation表示分数指标可以在创建 GridSearchCV 时传递
当使用网格搜索在 python 中使用此函数 GridSearchCV() 进行分类器时,假设我们有一个参数区间来调整形式 1 到 100,我们如何能够指定它(1:100 不起作用)? p> 最佳答案
我是机器学习的新手,并且一直坚持这个。 当我尝试在线性模型中实现多项式回归时,例如使用多个次数的多项式范围(1,10)并获得不同的 MSE。我实际上使用 GridsearchCV 方法来查找多项式的最
我想在一系列 alpha(拉普拉斯平滑参数)上使用 GridSearchCV 来检查哪个为伯努利朴素贝叶斯模型提供了最佳准确度。 def binarize_pixels(data, threshold
使用 sklearn 在随机森林分类器上运行网格搜索。这个运行的时间比我想象的要长,我正在尝试估计这个过程还剩多少时间。我认为它的总拟合次数是 3*3*3*3*5 = 405。 clf = Rando
我正在尝试使用网格搜索找出要在 PCA 中使用的 n_components 的最佳值: from sklearn.decomposition import PCA from sklearn.grid_
我正在尝试 GridsearchCV 但我希望在 param grid 中有一些异常(exception)。这是我的网格搜索代码: from sklearn.model_selection impor
我很难找出 GridSearchCV 中的参数 return_train_score。来自docs : return_train_score : boolean, optional If
我必须进行多类分类 (3)。我使用 GridSearchCV 为我的分类器搜索最佳参数。 但我有一个不平衡的 x_train(和 x_test):0 有 3079 个实例,1 有 12 个实例,3 有
有没有办法访问在 GridSearchCV 过程中计算的预测值? 我希望能够根据实际值(来自测试/验证集)绘制预测的 y 值。 网格搜索完成后,我可以使用 将其与其他一些数据相匹配 ypred =
我正在使用GridsearchCV来调整超参数,现在我想在训练和验证步骤中进行最小-最大Normalization(StandardScaler())。但我认为我不能做到这一点。 问题是: 如果我对整
我正在使用 scikit learn 进行多标签分类。我使用 RandomForestClassifier 作为基本估计器。我想使用 GridSearchCV 优化每个标签的参数。目前我正在按以下方式
好的,我只想说,我对 SciKit-Learn 和数据科学完全陌生。但这是问题所在,也是我目前对该问题的研究。代码在底部。 总结 我正尝试使用 BernoulliRBM 进行类型识别(例如数字),并尝
我正在使用 GridSearchCV ,并且在每次迭代之后,我想将 clf.cv_results_ 属性保存到一个文件中(以防进程在中间崩溃)。 我尝试寻找解决方案,但就是想不通。 我们将不胜感激。
我正在尝试自学如何在基本的多层神经网络中对神经元的数量进行网格搜索。我正在使用 Python 的 GridSearchCV 和 KerasClasifier 以及 Keras。下面的代码适用于其他数据
我是一名优秀的程序员,十分优秀!