1. check_cv()

  1. def check_cv(cv=3, y=None, classifier=False):
  2. if cv is None:
  3. cv = 3
  4. if isinstance(cv, numbers.Integral):
  5. # 如果classifier为True 并且y 是 二类或者多类,就返回 StratifiedKFold,否则返回KFold
  6. if (classifier and (y is not None) and
  7. (type_of_target(y) in ('binary', 'multiclass'))):
  8. return StratifiedKFold(cv)
  9. else:
  10. return KFold(cv)
  11. # if not hasattr(cv, 'split') or isinstance(cv, str):
  12. # if not isinstance(cv, Iterable) or isinstance(cv, str):
  13. # raise ValueError("Expected cv as an integer, cross-validation "
  14. # "object (from sklearn.model_selection) "
  15. # "or an iterable. Got %s." % cv)
  16. # return _CVIterableWrapper(cv)
  17. return cv # New style cv objects are passed without any modification

阅读源代码要抓主干,所以我把细枝末节的代码注释掉了。

2. cross_validate()

这个函数的代码有点复杂,讲解其他有用的代码。

这里 可以找到 scoring的名字对应的函数

注意

得分函数(score function)是返回的值越高越好,而损失函数(loss function)是返回的值越低越好。原来scoring中的"mean_squared_error"已经改成了"neg_mean_squared_error"。

3. cross_val_score()

返回一个 estimator 做 k 折交叉验证后产生的 k 个 在测试集上的得分。返回值是一个有k个元素的数组。

4. cross_val_predict()

cross_val_predict提供了和cross_val_score相似的接口,但是后者返回k次得分,而前者返回所有数据集上的预测结果。如果传入的参数 method = 'predict'(默认情况),那么返回(n_samples, ) 形状的ndarray,如果传入的参数 method = 'predict_proba',那么返回(n_samples, n_classes) 形状的ndarray。

5. learning_curve()

  1. def learning_curve(estimator, X, y, groups=None,
  2. train_sizes=np.linspace(0.1, 1.0, 5), cv=None, scoring=None,
  3. exploit_incremental_learning=False, n_jobs=1,
  4. pre_dispatch="all", verbose=0, shuffle=False,
  5. random_state=None):
  6. # if exploit_incremental_learning and not hasattr(estimator, "partial_fit"):
  7. # raise ValueError("An estimator must support the partial_fit interface "
  8. # "to exploit incremental learning")
  9. X, y, groups = indexable(X, y, groups)
  10. cv = check_cv(cv, y, classifier=is_classifier(estimator)) # 默认是KFold(3)
  11. # Store it as list as we will be iterating over the list multiple times
  12. cv_iter = list(cv.split(X, y, groups))
  13. scorer = check_scoring(estimator, scoring=scoring)
  14. n_max_training_samples = len(cv_iter[0][0]) # 取出的是第一折中的train的数目
  15. # Because the lengths of folds can be significantly different, it is
  16. # not guaranteed that we use all of the available training data when we
  17. # use the first 'n_max_training_samples' samples.
  18. # 因为不同折中的数据数目可能会是不同的,当我们使用第一个 'n_max_training_samples'
  19. # 并不能保证我们使用所有可用的训练数据。(第一折长度一定是最短的)
  20. train_sizes_abs = _translate_train_sizes(train_sizes, # 将train_sizes中样本比例转换为具体数目(绝对size)
  21. n_max_training_samples)
  22. n_unique_ticks = train_sizes_abs.shape[0]
  23. if verbose > 0:
  24. print("[learning_curve] Training set sizes: " + str(train_sizes_abs))
  25. parallel = Parallel(n_jobs=n_jobs, pre_dispatch=pre_dispatch,
  26. verbose=verbose)
  27. if shuffle:
  28. rng = check_random_state(random_state)
  29. cv_iter = ((rng.permutation(train), test) for train, test in cv_iter)
  30. # if exploit_incremental_learning: # 默认为False,暂时先忽略
  31. # classes = np.unique(y) if is_classifier(estimator) else None
  32. # out = parallel(delayed(_incremental_fit_estimator)(
  33. # clone(estimator), X, y, classes, train, test, train_sizes_abs,
  34. # scorer, verbose) for train, test in cv_iter)
  35. else:
  36. train_test_proportions = []
  37. for train, test in cv_iter: # 在每一折中train有一个逐渐增大的变化,test不变
  38. for n_train_samples in train_sizes_abs:
  39. train_test_proportions.append((train[:n_train_samples], test))
  40. out = parallel(delayed(_fit_and_score)(
  41. clone(estimator), X, y, scorer, train, test,
  42. verbose, parameters=None, fit_params=None, return_train_score=True)
  43. for train, test in train_test_proportions)
  44. out = np.array(out)
  45. n_cv_folds = out.shape[0] // n_unique_ticks
  46. out = out.reshape(n_cv_folds, n_unique_ticks, 2)
  47. out = np.asarray(out).transpose((2, 1, 0))

函数的返回值:

  • train_sizes_abs :array, shape=(n_unique_ticks),曲线上每个点对应的训练数据集的size
  • train_scores:array, shape=(n_ticks, n_cv_folds),所有的在训练集上的分数。
  • test_scores: array, shape=(n_ticks, n_cv_folds),所有的在测试集上的分数。

注释掉了不重要的代码便于分析。该方法就是计算交叉验证中对于不同训练数据集大小的训练分数和测试分数。算法的中文描述如下:

  1. 将数据做 k(默认为3)折划分。
  2. 在每一折的验证中,有一个参数train_sizes (默认为np.linspace(0.1, 1.0, 5) = array([0.1 , 0.325, 0.55 , 0.775, 1. ])表示训练集依次取这一折中train_set的0.1比例的数据,0.325比例的数据,0.55比例的数据,0.775比例的数据,1.0比例的数据,然后分别和这一折中 test_set 组成新的训练集—测试集对,分别计算每一对上的训练分数和测试分数。

如果指定折数k,train_sizes的长度为m,那么训练estimator并验证其性能的过程要重复 k*m次。简单的就是在每一折上看训练集逐渐变大时,estimator的性能的变化情况。

这个函数计算的结果如何可视化的代码可以参考 这里

6. validation_curve()

计算在不同参数取值下的训练集分数和测试集分数。

需要设置的参数:

validation_curve(estimator, X, y, param_name, param_range)

param_name:string,参数名字

param_range: array-like,参数范围

返回的结果:

train_scores : array, shape (n_ticks, n_cv_folds),Scores on training sets.

test_scores : array, shape (n_ticks, n_cv_folds),Scores on test set.

可视化的代码可以参考 这里

7. permutation_test_score

不是很重要,几乎没见有用到过

sklearn.model_selection Part 2: Model validation的更多相关文章

  1. sklearn.model_selection 的train_test_split方法和参数

    train_test_split是sklearn中用于划分数据集,即将原始数据集划分成测试集和训练集两部分的函数. from sklearn.model_selection import train_ ...

  2. Model Validation in ASP.NET Web API

    Model Validation in ASP.NET Web API 原文:http://www.asp.net/web-api/overview/formats-and-model-binding ...

  3. <转>ASP.NET学习笔记之MVC 3 数据验证 Model Validation 详解

    MVC 3 数据验证 Model Validation 详解  再附加一些比较好的验证详解:(以下均为引用) 1.asp.net mvc3 的数据验证(一) - zhangkai2237 - 博客园 ...

  4. Model Validation in Asp.net MVC

    原文:Model Validation in Asp.net MVC 本文用于记录Pro ASP.NET MVC 3 Framework中阐述的数据验证的方式. 先说服务器端的吧.最简单的一种方式自然 ...

  5. Model Validation(模型验证)

    Model Validation(模型验证) 前言 阅读本文之前,您也可以到Asp.Net Web API 2 系列导航进行查看 http://www.cnblogs.com/aehyok/p/344 ...

  6. sklearn.model_selection 的 train_test_split作用

    train_test_split函数用于将数据划分为训练数据和测试数据. train_test_split是交叉验证中常用的函数,功能是从样本中随机的按比例选取train_data和test_data ...

  7. sklearn.model_selection.StratifiedShuffleSplit

    sklearn.model_selection.StratifiedShuffleSplit

  8. sklearn.model_selection模块

    后续补代码 sklearn.model_selection模块的几个方法参数

  9. 【sklearn】网格搜索 from sklearn.model_selection import GridSearchCV

    GridSearchCV用于系统地遍历模型的多种参数组合,通过交叉验证确定最佳参数. 1.GridSearchCV参数    # 不常用的参数 pre_dispatch 没看懂 refit 默认为Tr ...

随机推荐

  1. 安装Python环境

    首先我们来安装Python,Python3.5+以上即可 1.首先进入网站下载:点击打开链接(或自己输入网址https://www.python.org/downloads/),进入之后如下图,选择图 ...

  2. Skills CodeForces - 613B (双指针)

    大意: $n$门课, 第$i$门分数$a_i$, 可以增加共$m$分, 求$cnt_{mx}*cf+mi*cm$的最大值 $cnt_{mx}$为满分的科目数, $mi$为最低分, $cf$, $cm$ ...

  3. tasks.json 配置 解决vscode控制台乱码问题

    { "version": "2.0.0", "command": "dotnet", "tasks" ...

  4. 102、如何滚动更新 Service (Swarm09)

    参考https://www.cnblogs.com/CloudMan6/p/7988455.html   在前面的实验中,我们部署了多个副本的服务,本节将讨论如何滚动更新每一个副本.   滚动更新降低 ...

  5. 关于redis的几件小事(九)redis的并发竞争问题

    1.什么是并发竞争 就是多客户端同时并发写一个key,可能本来应该先到的数据后到了,导致数据版本错了.或者是多客户端同时获取一个key,修改值之后再写回去,只要顺序错了,数据就错了. 2.怎么解决 采 ...

  6. yii自定义验证

    自定义验证类 class BaseModel extends Model { public function rules() { return [ ['obj', ContentSecurityVal ...

  7. Javascript问题集锦

    1.Date.parse()函数兼容性问题:   IE Chrome Firefox Date.parse("07-17-2019") 1563292800000 15632928 ...

  8. WebSocket的兼容性

    https://github.com/sockjs/sockjs-client https://socket.io/ https://github.com/gimite/web-socket-js h ...

  9. 从命令行运行postman脚本

    为什么要在命令行中运行 可以在无UI界面的服务器上运行 可以在持续集成系统上运行 运行准备 导出collection 安装nodejs和npm(或cnpm) 安装Newman 运行及生成测试报告支持4 ...

  10. 排序——插入排序(C语言)

    void insertSort(int* a,int T){ int tmp,p; ;i<T;i++){ tmp=a[i]; p=i-; &&tmp<a[p]){ a[p+ ...