ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

NVIDIA cuML GPU 加速数据划分与交叉验证指南:cuml.model_selection 全解析

NVIDIA cuML GPU 加速数据划分与交叉验证指南:cuml.model_selection 全解析 NVIDIA cuML GPU 加速数据划分与交叉验证指南cuml.model_selection 全解析【免费下载链接】cumlNVIDIA cuML: GPU-Accelerated Machine Learning项目地址: https://gitcode.com/GitHub_Trending/cu/cumlcuML 的cuml.model_selection模块为 GPU 上的机器学习工作流提供了与 scikit-learn 风格一致的数据划分与交叉验证能力核心包含train_test_split、KFold与StratifiedKFold可直接接收 cuDF DataFrame/Series、CuPy 数组等 GPU 数据并保持输入输出类型一致。读完本文你将掌握在 RAPIDS cuML 生态中正确完成训练/测试集切分、K 折交叉验证与分层抽样并理解其底层实现与兼容性保障。模块定位与文档入口cuml.model_selection是 cuML API 参考文档中的一个独立模块页面见 docs/source/api/cuml.model_selection.rst在 API Reference 总览中被归类为 Model Selection and Data Splitting见 docs/source/api/index.rst。官方 API 文档列出并通过autosummary生成详细签名的公开对象为train_test_split将数组或矩阵随机切分为训练集与测试集KFoldK 折交叉验证器。需要说明的是实际包还额外暴露了StratifiedKFold类内分层 K 折并延迟加载 scikit-learn 的GridSearchCV这些内容本文会一并讲解。模块的公开导出定义位于 python/cuml/cuml/model_selection/init.py其中__all__为[train_test_split, KFold, GridSearchCV, StratifiedKFold]而全部实现集中在 python/cuml/cuml/model_selection/_split.py。模块定位有两个显著特点API 兼容性优先__init__.py的模块文档明确说明这套代码由 scikit-learn 开发者维护、cuML 导入以保持熟悉的 sklearn 命名空间结构cuML 侧通过测试保证这些包装器与 CUDA 数据及 cuML 估计器完全兼容GPU 原生数据支持所有函数与类均直接面向 GPU 端数据容器cuDF、CuPy设计避免数据在 CPU/GPU 之间往返拷贝。train_test_splitGPU 数据集的训练/测试切分train_test_split是模块中使用频率最高的 API实现见 _split.py。它是对sklearn.model_selection.train_test_split的封装但在输入校验、随机种子与分层标签处理上针对 GPU 数据做了适配。函数签名与参数说明from cuml.model_selection import train_test_split train_test_split( *arrays, test_sizeNone, train_sizeNone, random_stateNone, shuffleTrue, stratifyNone, )各参数语义与 sklearn 保持一致同时明确 GPU 数据行为参数类型默认值说明*arrays序列必填长度或shape[0]相同的一组输入允许 cuDF DataFrame/Series、CuPy 数组、NumPy 数组、pandas DataFrame/Series 以及任何带shape属性的类数组对象test_sizefloat 或 intNonefloat 时取 0.0~1.0 表示测试集比例int 时表示测试集绝对样本数None时取训练集大小的补集若train_size也为None则固定为 0.25train_sizefloat 或 intNonefloat 表示训练集比例int 表示训练集绝对样本数None时自动取测试集大小的补集random_stateintNone控制切分前的打乱行为传入 int 可保证多次调用结果可复现shuffleboolTrue切分前是否打乱数据stratify类数组None不为None时按该标签做分层切分保持各类别比例返回值与类型保持规则函数返回一个长度为2 * len(arrays)的列表即每个输入都对应一对训练/测试结果。关键契约是输出类型与输入类型一一对应cuDF 输入返回 cuDF 输出CuPy 输入返回 CuPy 输出pandas 输入返回 pandas 输出numpy 输入返回 numpy 输出。这一点由测试 python/cuml/tests/test_train_test_split.py 中的test_split_dataframe_array、test_array_split、test_variadic_input_type_preservation等用例严格验证例如 cuDF DataFrame 输入X返回 cuDF DataFrame而 CuPy ndarray 输入y返回 CuPy ndarray对于ndim 1的输入返回 DataFramendim 1返回 Series且 DataFrame 的列名与类型都会被保留见test_dataframe_column_preservation。官方示例可复制运行来源 _split.py import cupy as cp from cuml.model_selection import train_test_split X cp.arange(10).reshape((5, 2)) y cp.array([0, 0, 1, 1, 1]) X_train, X_test, y_train, y_test train_test_split( ... X, y, test_size0.2, random_state42 ... )与 sklearn 的典型用法完全一致只是输入从 NumPy 换成了 CuPy。也可以在一条调用中同时切分多个数组如X、y、权重等且它们会使用同一套索引划分保证行级对齐——test_multiple_arrays_same_split验证了这一点。默认值行为当test_size与train_size都为None时默认按 75%/25% 划分train_test_split(X, y)会产生 75% 训练样本与 25% 测试样本测试test_default_values断言了该行为。也可以显式传入整数例如train_test_split(X, train_size70, test_size30)精确切出 70/30 个样本test_integer_sizes。GPU 适配的底层实现细节从源码看train_test_split在转发给 sklearn 前做了三处关键适配_split.py输入校验调用cuml.internals.validation中的check_consistent_length(*arrays)任何长度不一致的输入都会抛出ValueError测试test_split_size_mismatch验证了 3 行X与 2 行y报错空参数调用同样会抛出At least one array required as inputtest_zero_arrays_raises随机种子转换CuPy 的RandomState不被 sklearn 直接支持源码通过check_random_seed将cp.random.RandomState实例转成 int 种子int、None 与np.random.RandomState则原样透传。测试test_random_state分别验证了 int/cupy/numpy 三种种子类型都能复现相同划分分层标签搬运stratify参数经check_array(stratify, ensure_2dFalse, mem_typehost)显式转到主机内存再交给 sklearn——这是为兼容 sklearn 底层实现所必需的。test_stratified_split用 10000 样本的make_classification数据验证分层前后各类别比例保持容差 rtol0.1test_stratified_binary_classification验证类别样本过少时正确抛错test_stratify_retain_index验证分层切分后 cuDF 索引被保留。需要留意的边界行为shuffleFalse时数据保持原顺序前train_size个样本进入训练集、末尾test_size个进入测试集test_shuffle_false_preserves_order且切分不会丢失任何数据test_no_data_loss_cupy、test_no_data_loss_cudf通过合并排序重建验证完整性。KFoldGPU 上的 K 折交叉验证KFold提供标准的 K 折交叉验证划分实现见 _split.py。它继承自模块内部的_KFoldBase基类_split.py该基类统一负责构造参数校验、样本数检查与可选的洗牌逻辑。类签名与参数说明from cuml.model_selection import KFold kf KFold(n_splits5, shuffleFalse, random_stateNone)参数类型默认值说明n_splitsint5折数必须 2否则抛出Expected an integral n_splits 2shuffleboolFalse切分前是否打乱样本注意每个折内部的样本顺序不会被重排random_stateint / CuPy RandomState / NumPy RandomState / NoneNone仅当shuffleTrue时影响索引顺序、控制每折的随机性否则无效果split 方法与生成式接口调用kf.split(X, yNone)会生成训练/测试索引对逐个yield出(train, test)其中索引为CuPy ndarray。接口流程_split.pycheck_consistent_length(X, y)校验长度一致通过_get_n_samples(X)获取样本数若样本数小于n_splits则抛出ValueError生成cp.arange(n_samples)索引若shuffleTrue用cp.random.RandomState(check_random_seed(self.seed)).shuffle(indices)在 GPU 上打乱索引交给子类_split方法产出每一折。get_n_splits(XNone, yNone)返回折数X、y参数仅为兼容 sklearn 而保留并被忽略。KFold 划分的底层算法KFold._split的实现_split.py思路清晰用cp.full(n_splits, n_samples // n_splits)为每折分配基础大小再将余数n_samples % n_splits依次加到前若干折上按顺序取indices[start:stop]作为测试集通过布尔掩码cp.zeros(n_samples, dtypecp.bool_)配合cp.logical_not取补集得到训练集。因此默认不洗牌情况下折是按数据原始顺序连续切分的折 0 用第 1 段作为测试集、其余作为训练集折 1 用第 2 段……每折轮流充当一次验证集。官方示例_split.py import cupy as cp from cuml.model_selection import KFold X cp.array([[1, 2], [3, 4], [1, 2], [3, 4]]) y cp.array([0, 0, 1, 1]) kf KFold(n_splits2) kf.get_n_splits() 2 for i, (train_index, test_index) in enumerate(kf.split(X, y)): ... print(fFold{i}:) ... print(f Train: index{train_index}) ... print(f Test: index{test_index}) Fold 0: Train: index[2 3] Test: index[0 1] Fold 1: Train: index[0 1] Test: index[2 3]StratifiedKFold类内分层的 K 折验证虽然 API 参考页的autosummary仅列出train_test_split与KFold但模块实际导出了StratifiedKFold_split.py它保证每个折中各类别样本的占比与原始数据一致适合类别不平衡的分类任务。基于 cuDF 的分层实现StratifiedKFold._split的实现充分利用 cuDF 的 GPU 分组能力_split.pycheck_cudf(y, ensure_ndim1)将标签统一为 cuDF 一维数据y.nunique() 2时抛出number of unique classes cannot be less than 2构造cudf.DataFrame({y: y[indices], ids: indices})并按y分组若n_splits大于任一类别成员数抛出n_splits... cannot be greater than the number of members in each class用groupby.cumcount()给组内样本编号再按order % n_splits分配各折保证每个类别的样本均匀散布到所有折中。三个约束条件在测试 python/cuml/tests/test_split.py 中均有覆盖test_stratified_kfold_n_splits_invalid验证单类别报错与n_splits超类别成员数报错test_invalid_folds验证KFold与StratifiedKFold对n_splits in (0, 1, bad)统一拒绝test_split_dataframe用 10000 样本、2/10 类、5/10 折组合验证每折训练/测试集中各n_classes的比例完全相等以及len(train_index) len(test_index) * (n_splits - 1)的折间规模关系。官方示例_split.py import cupy as cp from cuml.model_selection import StratifiedKFold X cp.array([[1, 2], [3, 4], [1, 2], [3, 4]]) y cp.array([0, 0, 1, 1]) kf StratifiedKFold(n_splits2) for i, (train_index, test_index) in enumerate(kf.split(X, y)): ... print(fFold{i}: Train: index{train_index}, Test: index{test_index}) Fold 0: Train: index[1 3] Test: index[0 2] Fold 1: Train: index[0 2] Test: index[1 3]注意对比普通KFold由于分层逻辑要求每个类别的 0/1 样本轮流进入测试折这里 Fold 0 的测试集是索引[0 2]每类取一个而不是按原始顺序连续切分的[0 1]。与其他模块的协作GridSearchCV 与全局输出配置cuml.model_selection还通过延迟加载机制与 scikit-learn 生态衔接python/cuml/cuml/model_selection/init.py当访问GridSearchCV时__getattr__会动态导入并返回sklearn.model_selection.GridSearchCV。也就是说from cuml.model_selection import GridSearchCV的写法可用但网格搜索本身由 sklearn 实现需要配合 GPU 数据容器如 CuPy 数组或 cuDF与 cuML 估计器使用——这与train_test_split、KFold返回的 GPU 索引天然兼容。在实际工作流中cuml.model_selection常与以下模块搭配cuml.datasets用make_classification、make_regression等 GPU 数据集生成函数产出测试数据测试代码中大量这样使用cuML 估计器如 cuml.ensemble 的RandomForestClassifier、cuml.linear_model 的LogisticRegression把train_test_split的输出直接喂给.fit()全局输出类型配置cuml.set_global_output_type/cuml.using_output_type见 docs/source/api/index.rst控制估计器输出格式与切分结果无缝衔接。测试保障与质量基线模块的功能正确性由两层测试保障python/cuml/tests/test_train_test_split.py覆盖train_test_split的类型保持、默认比例、整数/浮点尺寸、三种随机种子、分层切分、索引保留、空输入与尺寸不匹配报错以及 sklearn 重构后的关键字参数兼容回归test_sklearn_signature_keywords_args验证random_state与shuffle的 sklearn 参数顺序python/cuml/tests/test_split.py覆盖KFold与StratifiedKFold的折数校验、分层比例一致性、非法n_splits、random_state可复现性与洗牌行为。这些测试在 cuDF/cuPy/pandas 三种后端convert_to_typefixture上统一执行确保跨容器类型的行为一致同时验证了与 sklearn 的 API 兼容承诺。结语cuml.model_selection是 cuML 生态中连接数据准备与模型训练的关键一环它以 sklearn 兼容的 API 形态为 cuDF 与 CuPy 数据提供零拷贝的 GPU 数据划分与交叉验证能力并通过_KFoldBase基类统一了KFold与StratifiedKFold的校验与洗牌逻辑。理解其参数语义、类型保持契约与底层 cuDF/CuPy 实现能帮助你在构建 GPU 加速的机器学习流水线时写出正确、可复现且高性能的划分代码。【免费下载链接】cumlNVIDIA cuML: GPU-Accelerated Machine Learning项目地址: https://gitcode.com/GitHub_Trending/cu/cuml创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表