Python 数据集分割技巧与最佳实践239


在机器学习项目中,数据集的分割是至关重要的步骤。一个好的分割策略能够确保模型在 unseen data 上具有良好的泛化能力,避免过拟合和欠拟合。Python 提供了丰富的库和工具,可以方便地进行数据集分割。本文将深入探讨各种数据集分割方法,并结合实际案例,讲解如何在 Python 中高效且正确地分割数据集,同时提供一些最佳实践建议。

1. 数据集分割的目的

数据集分割的主要目的是将数据集划分成训练集、验证集和测试集三个部分。这三个集合分别用于不同的目的:
训练集 (Training Set): 用于训练机器学习模型,模型学习数据中的模式和规律。
验证集 (Validation Set): 用于评估模型在 unseen data 上的性能,并用于调整模型超参数 (hyperparameters)。验证集有助于防止过拟合,选择最佳模型。
测试集 (Test Set): 用于最终评估训练好的模型的泛化能力。测试集应该在模型训练和超参数调整完成后才使用,以获得对模型实际性能的无偏估计。

合理的比例分配通常是:训练集占 70%~80%,验证集占 10%~15%,测试集占 10%~15%。但具体比例应根据数据集大小和问题的复杂性进行调整。数据集过小可能需要减少验证集和测试集的比例,以保证训练集足够大。

2. 常用的数据集分割方法

Python 中有多种方法可以分割数据集,最常用的包括:

2.1 使用 `scikit-learn` 库的 `train_test_split` 函数

scikit-learn (sklearn) 是一个流行的机器学习库,其 `model_selection` 模块中的 `train_test_split` 函数提供了简单而强大的数据集分割功能。该函数可以随机将数据集分割成训练集和测试集,并可指定测试集大小、随机种子 (random_state) 等参数,确保结果可复现。```python
from sklearn.model_selection import train_test_split
import numpy as np
# 样本数据 (特征和标签)
X = ([[1, 2], [3, 4], [5, 6], [7, 8], [9, 10], [11, 12]])
y = ([0, 1, 0, 1, 0, 1])
# 将数据集分割成训练集和测试集,测试集大小为 30%
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
print("X_train:", X_train)
print("X_test:", X_test)
print("y_train:", y_train)
print("y_test:", y_test)
```

为了进一步分割为训练集、验证集和测试集,可以先使用 `train_test_split` 将数据分为训练集和测试集,然后再次使用 `train_test_split` 将训练集分割为训练集和验证集。```python
X_train, X_temp, y_train, y_temp = train_test_split(X, y, test_size=0.4, random_state=42) # 训练集60%,剩余40%
X_val, X_test, y_val, y_test = train_test_split(X_temp, y_temp, test_size=0.5, random_state=42) # 剩余的40%平均分为验证集和测试集,各20%
```

2.2 使用 `pandas` 库进行分割

如果数据存储在 `pandas` 的 DataFrame 中,可以使用 `sample` 方法进行随机采样分割。此方法同样需要指定随机种子以确保结果可复现。```python
import pandas as pd
# 假设 df 是一个 pandas DataFrame
df = ({'feature1': [1, 2, 3, 4, 5, 6], 'feature2': [7, 8, 9, 10, 11, 12], 'label': [0, 1, 0, 1, 0, 1]})
train_df = (frac=0.7, random_state=42)
test_df = ()
print("Train DataFrame:", train_df)
print("Test DataFrame:", test_df)
```

类似地,可以先用 `sample` 抽取训练集,再从剩余数据中抽取验证集和测试集。

3. 分层采样 (Stratified Sampling)

如果数据集存在类别不平衡的情况 (某些类别的数据远多于其他类别),简单的随机采样可能会导致训练集和测试集的类别比例失衡,影响模型性能。这时需要使用分层采样,确保每个类别在各个子集中都保持一定的比例。 `train_test_split` 函数可以通过 `stratify` 参数实现分层采样。```python
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42, stratify=y)
```

这里 `stratify=y` 表示根据标签 `y` 进行分层采样。

4. K 折交叉验证 (K-fold Cross-Validation)

K 折交叉验证是一种更高级的数据集分割方法,它将数据集分成 K 个大小相似的子集,每次使用 K-1 个子集作为训练集,剩余一个子集作为测试集。重复 K 次,每个子集都作为一次测试集,最终将 K 次的结果平均作为模型性能的估计。K 折交叉验证可以更有效地利用数据,并提供更可靠的模型性能评估。```python
from sklearn.model_selection import KFold, cross_val_score
from sklearn.linear_model import LogisticRegression
kf = KFold(n_splits=5, shuffle=True, random_state=42) # 5折交叉验证
model = LogisticRegression()
scores = cross_val_score(model, X, y, cv=kf)
print("Cross-validation scores:", scores)
print("Average cross-validation score:", (scores))
```

5. 最佳实践
使用随机种子: 设置随机种子 (例如 `random_state` 参数) 可以确保每次运行代码时得到相同的数据分割结果,方便复现实验结果。
确保数据独立性: 训练集、验证集和测试集之间的数据应该相互独立,避免数据泄漏 (data leakage)。
选择合适的分割比例: 根据数据集大小和问题的复杂性选择合适的训练集、验证集和测试集比例。
考虑数据分布: 对于类别不平衡的数据集,使用分层采样。
使用交叉验证: 对于小数据集,使用交叉验证可以提高模型评估的可靠性。

总而言之,选择合适的数据集分割方法对于机器学习模型的成功至关重要。本文介绍了多种 Python 数据集分割方法,并提供了最佳实践建议,希望能够帮助读者更好地进行数据集分割,从而构建更 robust 和更 accurate 的机器学习模型。

2025-04-19


上一篇:深入探索Python中的`mm`函数:不存在的函数与命名规范

下一篇:Python 数据集定义与处理:从创建到分析