简介
本全面的 Python 教程探讨了机器学习项目中数据拆分的关键过程。了解如何有效地划分数据集对于构建强大且准确的预测模型至关重要。我们将涵盖基本策略、实用技术和实际示例,以帮助你掌握数据准备和模型评估。
本全面的 Python 教程探讨了机器学习项目中数据拆分的关键过程。了解如何有效地划分数据集对于构建强大且准确的预测模型至关重要。我们将涵盖基本策略、实用技术和实际示例,以帮助你掌握数据准备和模型评估。
数据拆分是机器学习中的一项基本技术,它涉及在模型开发和评估过程中,将数据集划分为不同的子集以用于不同目的。主要目标是通过将数据分离为训练集、验证集和测试集,来创建可靠且无偏差的机器学习模型。
数据拆分在机器学习中具有几个关键作用:
最基本的拆分策略是将数据分为两部分:
使用 Python 和 scikit - learn 的示例:
from sklearn.model_selection import train_test_split
import numpy as np
## 创建示例数据
X = np.array([[1, 2], [3, 4], [5, 6], [7, 8]])
y = np.array([0, 1, 0, 1])
## 拆分数据
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.25, random_state=42
)
一种更全面的方法,包括一个验证集:
| 拆分类型 | 目的 | 典型比例 |
|---|---|---|
| 训练集 | 模型学习 | 60 - 70% |
| 验证集 | 超参数调整 | 15 - 20% |
| 测试集 | 最终模型评估 | 15 - 20% |
交叉验证是一种高级技术,可提供更稳健的评估:
K折交叉验证示例:
from sklearn.model_selection import cross_val_score
from sklearn.linear_model import LogisticRegression
## 执行5折交叉验证
model = LogisticRegression()
scores = cross_val_score(model, X, y, cv=5)
print("交叉验证分数:", scores)
print("平均CV分数:", scores.mean())
通过掌握数据拆分技术,你将有能力开发更可靠的机器学习模型。LabEx 建议通过实践这些技术来积累实际经验。
数据拆分策略对于开发强大的机器学习模型至关重要。本节将探讨有效划分数据集的各种方法。
from sklearn.model_selection import train_test_split
import pandas as pd
import numpy as np
## 加载示例数据集
data = pd.DataFrame({
'特征1': np.random.rand(100),
'特征2': np.random.rand(100),
'目标': np.random.randint(0, 2, 100)
})
## 以固定测试集大小进行随机拆分
X_train, X_test, y_train, y_test = train_test_split(
data[['特征1', '特征2']],
data['目标'],
test_size=0.2,
random_state=42
)
| 拆分比例 | 训练集 | 测试集 | 使用场景 |
|---|---|---|---|
| 70/30 | 70% | 30% | 标准方法 |
| 80/20 | 80% | 20% | 小数据集 |
| 60/40 | 60% | 40% | 数据有限的情况 |
from sklearn.model_selection import train_test_split
## 用于分类的分层拆分
X_train, X_test, y_train, y_test = train_test_split(
X, y,
test_size=0.3,
stratify=y, ## 保持类别分布
random_state=42
)
def time_based_split(data, train_ratio=0.7):
## 按时间顺序对数据进行排序
sorted_data = data.sort_values('时间戳')
## 计算拆分索引
split_index = int(len(sorted_data) * train_ratio)
## 拆分数据集
train_data = sorted_data.iloc[:split_index]
test_data = sorted_data.iloc[split_index:]
return train_data, test_data
from sklearn.model_selection import KFold
import numpy as np
## K折交叉验证
kf = KFold(n_splits=5, shuffle=True, random_state=42)
for train_index, test_index in kf.split(X):
X_train, X_test = X[train_index], X[test_index]
y_train, y_test = y[train_index], y[test_index]
LabEx 建议尝试不同的拆分策略,以了解它们对模型性能的影响。
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, classification_report
## 加载垃圾邮件数据集
spam_data = pd.read_csv('spam_dataset.csv')
## 准备特征和目标
X = spam_data.drop('is_spam', axis=1)
y = spam_data['is_spam']
## 分层拆分
X_train, X_test, y_train, y_test = train_test_split(
X, y,
test_size=0.2,
stratify=y,
random_state=42
)
## 缩放特征
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
## 训练模型
model = LogisticRegression()
model.fit(X_train_scaled, y_train)
## 评估
y_pred = model.predict(X_test_scaled)
print(classification_report(y_test, y_pred))
import pandas as pd
import numpy as np
from sklearn.preprocessing import MinMaxScaler
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense
def create_time_series_split(data, train_ratio=0.8):
## 按日期排序
data_sorted = data.sort_values('date')
## 计算拆分点
split_index = int(len(data_sorted) * train_ratio)
## 拆分数据
train_data = data_sorted.iloc[:split_index]
test_data = data_sorted.iloc[split_index:]
return train_data, test_data
## 加载股票价格数据
stock_data = pd.read_csv('stock_prices.csv')
## 基于时间的拆分
train_data, test_data = create_time_series_split(stock_data)
## 准备序列
def create_sequences(data, time_steps=10):
X, y = [], []
for i in range(len(data) - time_steps):
X.append(data[i:i+time_steps])
y.append(data[i+time_steps])
return np.array(X), np.array(y)
## 创建LSTM模型
model = Sequential([
LSTM(50, activation='relu', input_shape=(10, 1)),
Dense(1)
])
model.compile(optimizer='adam', loss='mse')
from sklearn.datasets import load_iris
from sklearn.model_selection import cross_val_score
from sklearn.svm import SVC
## 加载鸢尾花数据集
iris = load_iris()
X, y = iris.data, iris.target
## 执行交叉验证
cv_scores = cross_val_score(
SVC(kernel='rbf'),
X, y,
cv=5, ## 5折交叉验证
scoring='accuracy'
)
## 评估指标
print("交叉验证分数:", cv_scores)
print("平均CV分数: {:.2f} (+/- {:.2f})".format(
cv_scores.mean(), cv_scores.std() * 2
))
| 场景 | 拆分方法 | 关键注意事项 |
|---|---|---|
| 小数据集 | 分层拆分 | 保留类别分布 |
| 时间序列 | 按时间顺序拆分 | 保持时间顺序 |
| 复杂问题 | K折交叉验证 | 稳健的性能估计 |
LabEx 建议通过实践这些技术来开发强大的机器学习模型。
通过掌握 Python 中的数据拆分技术,数据科学家和机器学习从业者可以显著提高模型的性能和可靠性。本教程深入介绍了各种拆分策略,展示了如何使用 Python 的强大库和工具来创建可靠的训练、验证和测试数据集。