Group k-fold解释和代码实现

Group k-fold解释和代码实现


一、Group k-fold解释和代码实现是什么?

0,1,2,3:每一行表示测试集和训练集的划分的一种方式。
class:表示类别的个数(下图显示的是3类),有些交叉验证根据类别的比例划分测试集和训练集(例三)。
group:表示从不同的组采集到的样本,颜色的个数表示组的个数(有些时候我们关注在一组特定组上训练的模型是否能很好地泛化到看不见的组)。举个例子(解释“组”的意思):我们有10个人,我们想要希望训练集上所用的数据来自(1,2,3,4,5,6,7,8),测试集上的数据来自(9,10),也就是说我们不希望测试集上的数据和训练集上的数据来自同一个人(如果来自同一个人的话,训练集上的信息泄漏到测试集上了,模型的泛化性能会降低,测试结果会偏好)。
在这里插入图片描述
GroupKFold 是 K-Fold 的变体,可确保在测试集包含一个组的数据,那训练集将不会再包含这个组的数据了。例如,如果数据是从不同的受试者那里获得的,每个受试者有几个样本,并且如果模型足够灵活,从一批人的样本中训练得到的模型,可以推广到新的受试者样本。 GroupKFold 使这种情况成为可能。

二、 实验数据设置

2.1 实验数据生成代码

X, y = np.arange(0,60).reshape((30,2)), np.hstack(([0] * 3, [1] * 9, [2] * 18))
groups = np.hstack((["a"] * 3, ["b"] * 1,["c"] * 2, ["d"] * 4,["e"] * 5, ["f"] * 3,["g"] * 4,["h"] * 5, ["i"] * 3))
print("数据:", end=" ")
for l in X:
    print(l, end=' ')
print("")
print("标签:", y)
print("组别:", groups)

2.2 代码结果


数据: [0 1] [2 3] [4 5] [6 7] [8 9] [10 11] [12 13] [14 15] [16 17] [18 19] [20 21] [22 23] [24 25] [26 27] [28 29] [30 31] [32 33] [34 35] [36 37] [38 39] [40 41] [42 43] [44 45] [46 47] [48 49] [50 51] [52 53] [54 55] [56 57] [58 59] 
标签: [0 0 0 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2]
组别: ['a' 'a' 'a' 'b' 'c' 'c' 'd' 'd' 'd' 'd' 'e' 'e' 'e' 'e' 'e' 'f' 'f' 'f' 'g' 'g' 'g' 'g' 'h' 'h' 'h' 'h' 'h' 'i' 'i' 'i']

数据个数、标签个数:30个
类别个数:3个(分别是0,1,2,比例是0.1:0.3:0.6和class每类对应)(GroupKFold和类别无关)
组别(group):9个(分别是a-i,个数是3,1,2,4,5,3,4,5,3)

三、实验代码

3.1 实验代码

代码如下:

# Group k-fold
import numpy as np
from sklearn.model_selection import GroupKFold

# X = [0.1, 0.2, 2.2, 2.4, 2.3, 4.55, 5.8, 8.8, 9, 10]
# y = ["a", "b", "b", "b", "c", "c", "c", "d", "d", "d"]
# groups = [1, 1, 1, 2, 2, 2, 3, 3, 3, 3]

X, y = np.arange(0,60).reshape((30,2)), np.hstack(([0] * 3, [1] * 9, [2] * 18))
groups = np.hstack((["a"] * 3, ["b"] * 1,["c"] * 2, ["d"] * 4,["e"] * 5, ["f"] * 3,["g"] * 4,["h"] * 5, ["i"] * 3))
print("数据:", end=" ")
for l in X:
    print(l, end=' ')
print("")
print("标签:", y)
print("组别:", groups)
gkf = GroupKFold(n_splits=3)
for i,(train, test) in enumerate(gkf.split(X, y, groups=groups)):
    print("=================Group k-fold 第%d折叠 ===================="% (i+1))
    # print('train -  {}'.format(np.bincount(y[train])))
    print("  训练集索引:%s" % train)
    print("  训练集标签:", y[train])
    print("  训练集组别标签", groups[train])
    print("  训练集数据:", end=" ")
    for l in X[train]:
        print(l, end=' ')
    print("")
    # print("  训练集数据:", X[train])
    # print("test  -  {}".format(np.bincount(y[test])))
    print("  测试集索引:%s" % test)
    print("  测试集标签:", y[test])
    print("  测试集组别标签", groups[test])
    print("  测试集数据:", end=" ")
    for l in X[test]:
        print(l, end=' ')
    print("")
    # print("  测试集数据:", X[test])
    print("=============================================================")

3.2 实验结果

结果如下:

数据: [0 1] [2 3] [4 5] [6 7] [8 9] [10 11] [12 13] [14 15] [16 17] [18 19] [20 21] [22 23] [24 25] [26 27] [28 29] [30 31] [32 33] [34 35] [36 37] [38 39] [40 41] [42 43] [44 45] [46 47] [48 49] [50 51] [52 53] [54 55] [56 57] [58 59] 
标签: [0 0 0 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2]
组别: ['a' 'a' 'a' 'b' 'c' 'c' 'd' 'd' 'd' 'd' 'e' 'e' 'e' 'e' 'e' 'f' 'f' 'f'
 'g' 'g' 'g' 'g' 'h' 'h' 'h' 'h' 'h' 'i' 'i' 'i']
=================Group k-fold 第1折叠 ====================
  训练集索引:[ 3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21]
  训练集标签: [1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2]
  训练集组别标签 ['b' 'c' 'c' 'd' 'd' 'd' 'd' 'e' 'e' 'e' 'e' 'e' 'f' 'f' 'f' 'g' 'g' 'g'
 'g']
  训练集数据: [6 7] [8 9] [10 11] [12 13] [14 15] [16 17] [18 19] [20 21] [22 23] [24 25] [26 27] [28 29] [30 31] [32 33] [34 35] [36 37] [38 39] [40 41] [42 43] 
  测试集索引:[ 0  1  2 22 23 24 25 26 27 28 29]
  测试集标签: [0 0 0 2 2 2 2 2 2 2 2]
  测试集组别标签 ['a' 'a' 'a' 'h' 'h' 'h' 'h' 'h' 'i' 'i' 'i']
  测试集数据: [0 1] [2 3] [4 5] [44 45] [46 47] [48 49] [50 51] [52 53] [54 55] [56 57] [58 59] 
=============================================================
=================Group k-fold 第2折叠 ====================
  训练集索引:[ 0  1  2  3  6  7  8  9 18 19 20 21 22 23 24 25 26 27 28 29]
  训练集标签: [0 0 0 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2]
  训练集组别标签 ['a' 'a' 'a' 'b' 'd' 'd' 'd' 'd' 'g' 'g' 'g' 'g' 'h' 'h' 'h' 'h' 'h' 'i'
 'i' 'i']
  训练集数据: [0 1] [2 3] [4 5] [6 7] [12 13] [14 15] [16 17] [18 19] [36 37] [38 39] [40 41] [42 43] [44 45] [46 47] [48 49] [50 51] [52 53] [54 55] [56 57] [58 59] 
  测试集索引:[ 4  5 10 11 12 13 14 15 16 17]
  测试集标签: [1 1 1 1 2 2 2 2 2 2]
  测试集组别标签 ['c' 'c' 'e' 'e' 'e' 'e' 'e' 'f' 'f' 'f']
  测试集数据: [8 9] [10 11] [20 21] [22 23] [24 25] [26 27] [28 29] [30 31] [32 33] [34 35] 
=============================================================
=================Group k-fold 第3折叠 ====================
  训练集索引:[ 0  1  2  4  5 10 11 12 13 14 15 16 17 22 23 24 25 26 27 28 29]
  训练集标签: [0 0 0 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2]
  训练集组别标签 ['a' 'a' 'a' 'c' 'c' 'e' 'e' 'e' 'e' 'e' 'f' 'f' 'f' 'h' 'h' 'h' 'h' 'h'
 'i' 'i' 'i']
  训练集数据: [0 1] [2 3] [4 5] [8 9] [10 11] [20 21] [22 23] [24 25] [26 27] [28 29] [30 31] [32 33] [34 35] [44 45] [46 47] [48 49] [50 51] [52 53] [54 55] [56 57] [58 59] 
  测试集索引:[ 3  6  7  8  9 18 19 20 21]
  测试集标签: [1 1 1 1 1 2 2 2 2]
  测试集组别标签 ['b' 'd' 'd' 'd' 'd' 'g' 'g' 'g' 'g']
  测试集数据: [6 7] [12 13] [14 15] [16 17] [18 19] [36 37] [38 39] [40 41] [42 43] 
=============================================================

进程已结束,退出代码 0

3.3 结果解释

可以看到测试集标签里面有0,但是训练集标签里没有0——这没办法做测试。
可以看到数据集的划分和组别和折叠数(3折)有关,但是和标签比例无关(这一点不科学)

=================Group k-fold 第1折叠 ====================
  训练集索引:[ 3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21]
  训练集标签: [1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2]
  训练集组别标签 ['b' 'c' 'c' 'd' 'd' 'd' 'd' 'e' 'e' 'e' 'e' 'e' 'f' 'f' 'f' 'g' 'g' 'g' 'g']
  训练集数据: [6 7] [8 9] [10 11] [12 13] [14 15] [16 17] [18 19] [20 21] [22 23] [24 25] [26 27] [28 29] [30 31] [32 33] [34 35] [36 37] [38 39] [40 41] [42 43] 
  测试集索引:[ 0  1  2 22 23 24 25 26 27 28 29]
  测试集标签: [0 0 0 2 2 2 2 2 2 2 2]
  测试集组别标签 ['a' 'a' 'a' 'h' 'h' 'h' 'h' 'h' 'i' 'i' 'i']
  测试集数据: [0 1] [2 3] [4 5] [44 45] [46 47] [48 49] [50 51] [52 53] [54 55] [56 57] [58 59] 
=============================================================

四、总结

Group k-fold:不考虑标签(class)和组(group)的影响。

  • 有时候测试集包含某一类的全部标签,而训练集不包含该类的样本。也就是说没经过训练,就要测试(KFold 第1折叠)。
  • 适用于每一组的数据类型都很全的时候。
<think>嗯,用户想快速学习Python并掌握数据分析预测。首先,我得理解他们的需求。可能他们是想转行或者提升技能,用于工作或者项目?需要明确他们的背景,是否有编程经验,或者对数据分析了解多少。不过用户没有提到这些,所以得假设是零基础开始。 接下来,要拆解问题。快速学习Python,然后掌握数据分析预测。Python的学习路径有很多,但针对数据分析预测,可能需要侧重特定的库工具。比如NumPy、Pandas、Matplotlib这些数据处理可视化的库,然后是Scikit-learn、Statsmodels用于分析预测,可能还会涉及机器学习。 用户提到“快速”,所以需要高效的学习方法,避免陷入不必要的细节。应该推荐结构化的步骤,分阶段学习,先打好基础,再逐步深入。可能需要推荐一些优质资源,比如在线课程、书籍、实战项目,以及练习的平台。 然后,数据分析预测需要实际项目经验,所以实践部分很重要。或许要建议他们通过Kaggle竞赛或者自己找数据集来做项目,应用所学知识。同时,学习数据分析的方法论,比如数据清洗、特征工程、模型选择与评估等。 还要考虑常见的问题,比如学习过程中的难点,比如Python语法、库的使用,或者机器学习算法的理解。可能需要提醒他们遇到问题如何解决,比如查文档、Stack Overflow、社区支持等。 另外,时间安排也很关键。如何分配时间学习Python基础,然后转向数据分析库,再学习预测模型。可能需要一个时间计划,比如两周学习Python基础,两周学习数据分析库,两周机器学习入门,然后做项目巩固。 最后,要确保他们保持动力,通过实际案例看到成果,比如完成一个预测模型,可视化结果,这样能增强信心。可能还需要强调持续学习实践的重要性,因为数据分析预测是一个不断发展的领域,需要不断更新知识。</think>要快速掌握Python进行数据分析预测,可以按照以下结构化路径学习,结合理论+实战,通常3-6个月可实现基础到进阶: --- ### **一、Python基础快速突破(1-2周)** 1. **核心语法** - 变量、数据类型、运算符 - 流程控制(`if`/`for`/`while`) - 函数定义与模块化编程 - 文件读写(文本/CSV) *推荐资源*:[菜鸟教程Python3](https://www.runoob.com/python3/python3-tutorial.html) 2. **重点库初学** - `NumPy`:数组操作、矩阵计算 - `Pandas`:`DataFrame`核心操作(`iloc`/`groupby`/`merge`) - `Matplotlib`/`Seaborn`:折线图、散点图、直方图绘制 --- ### **二、数据分析核心技能(2-3周)** 1. **数据清洗实战** - 缺失值处理(删除/填充) - 异常值检测(IQR/Z-score) - 数据标准化与归一化 2. **探索性分析(EDA)** - 统计描述(`describe()`) - 相关性分析(热力图、`pairplot`) - 特征分布与业务洞察 3. **实战工具链** - 使用`Jupyter Notebook`交互分析 - 案例:分析泰坦尼克数据集([Kaggle经典案例](https://www.kaggle.com/c/titanic)) --- ### **三、预测模型入门(3-4周)** 1. **机器学习基础** - 监督学习 vs 无监督学习 - 过拟合与交叉验证(`train_test_split`/`K-Fold`) - 评估指标:准确率、精确率、召回率、RMSE 2. **Scikit-learn实战** - 线性回归/逻辑回归 - 决策树/随机森林 - 聚类算法(K-Means) *代码示例*: ```python from sklearn.ensemble import RandomForestClassifier model = RandomForestClassifier() model.fit(X_train, y_train) predictions = model.predict(X_test) ``` 3. **时间序列预测** - ARIMA模型(`statsmodels`库) - Prophet(Facebook开源工具) --- ### **四、加速提升的实战策略** 1. **项目驱动学习** - 初级:房价预测、用户流失分析 - 进阶:股票趋势预测、自然语言处理(NLP) *数据集平台*:Kaggle、UCI Machine Learning Repository 2. **效率工具** - `PyCharm`或`VS Code`开发环境 - `SQL`+Python联动(数据库查询) - `Git`版本控制 3. **避坑指南** - 避免过早陷入算法理论,先实现再优化 - 优先掌握`Pandas`的向量化操作而非循环 - 学会查阅官方文档(如[Pandas文档](https://pandas.pydata.org/docs/)) --- ### **五、学习资源推荐** - **书籍**: - 《利用Python进行数据分析》(Pandas作者亲著) -机器学习实战:基于Scikit-LearnTensorFlow》 - **课程**: - Coursera专项课程《Applied Data Science with Python- 吴恩达《机器学习》(数学基础强化) - **社区**: - Stack Overflow解决报错 - GitHub参考开源项目 --- ### **六、进阶方向** - 深度学习:`TensorFlow`/`PyTorch`框架 - 大数据处理:`PySpark`/`Dask` - 自动化部署:`Flask`/`FastAPI`构建预测API 坚持每天2-3小时刻意练习,通过5-10个完整项目迭代,可快速形成数据分析与预测的完整能力闭环。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值