sklearn的交叉验证

什么是交叉验证

交叉验证是用来观察模型的稳定性的一种方法,我们将数据划分为n份,依次使用其中一份作为测试集,其他n-1份作为训练集,多次计算模型的精确性来评估模型的平均准确程度。训练集和测试集的划分会干扰模型的结果,因此用交叉验证n次的结果求出的平均值,是对模型效果的一个更好的度量。

在这里插入图片描述
在机器学习和深度学习中,数据集的划分是一个重要的步骤,确保模型能够进行有效的训练和评估。常见的数据集划分方法有以下几种:

  1. 训练集、验证集和测试集划分

    • 训练集(Training Set):用于训练模型。
    • 验证集(Validation Set):用于调整模型超参数和评估模型的性能。
    • 测试集(Test Set):用于评估最终模型的泛化能力。

    一般的划分比例为70%训练集,15%验证集,15%测试集,但具体比例可以根据数据集的大小和任务需求进行调整。

  2. 交叉验证(Cross-Validation)

    • K折交叉验证(K-Fold Cross-Validation):将数据集平均分成K个子集,每次用K-1个子集进行训练,剩下的一个子集进行验证。重复K次,每次选择不同的子集作为验证集,最终取平均性能作为模型的评估结果。
    • 留一法交叉验证(Leave-One-Out Cross-Validation, LOOCV):每次将一个样本作为验证集,其余样本作为训练集,重复N次(N为样本数),适用于小数据集。
  3. 分层采样(Stratified Sampling)

    • 用于分类任务,确保每个类别在训练集、验证集和测试集中均有相同比例的样本,避免类别不平衡影响模型性能。
  4. 时间序列分割(Time Series Split)

    • 针对时间序列数据,确保训练数据在时间上早于验证和测试数据,防止未来数据泄露到过去。
  5. 留出法(Holdout Method)

    • 简单地将数据集随机划分为训练集和测试集,通常用于快速评估模型性能。

Sklearn
使用sklearn的工具来进行数据划分,测试集和训练集在7:3的比例。

from sklearn.model_selection import train_test_split
from sklearn.datasets import load_wine
wine = load_wine()
Xtrain, Xtest, Ytrain, Ytest = train_test_split(wine.data,wine.target,test_size=0.3)

此外,对于交叉验证的使用sklearn的工具来进行数据划分,测试集和训练集在7:3的比例。

from sklearn.model_selection import cross_val_score
from sklearn.datasets import fetch_california_housing
from sklearn.tree import DecisionTreeRegressor
#使用加利福尼亚州的数据,因为之前的波士顿数据被撤销了
#但是可以通过下面的方式下载数据
import pandas as pd
import numpy as np

data_url = "http://lib.stat.cmu.edu/datasets/boston"
raw_df = pd.read_csv(data_url, sep="\s+", skiprows=22, header=None)
data = np.hstack([raw_df.values[::2, :], raw_df.values[1::2, :2]])
target = raw_df.values[1::2, 2]

California =  fetch_california_housing()

cross_val_score(regressor, California.data, California.target, cv=10,scoring = "neg_mean_squared_error")

进一步拆分这个函数的过程:

from sklearn.model_selection import KFold
from sklearn.metrics import mean_squared_error
from sklearn.datasets import fetch_california_housing
from sklearn.linear_model import LinearRegression
import numpy as np

# 加载California数据集
california = fetch_california_housing()
X = california.data
y = california.target

# 定义回归器
regressor = LinearRegression()

# 定义交叉验证的折数
kf = KFold(n_splits=10)

# 存储每个折的负均方误差
neg_mean_squared_errors = []

# 进行K折交叉验证
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]
    
    # 训练模型
    regressor.fit(X_train, y_train)
    
    # 预测
    y_pred = regressor.predict(X_test)
    
    # 计算负均方误差
    mse = mean_squared_error(y_test, y_pred)
    neg_mse = -mse
    neg_mean_squared_errors.append(neg_mse)

# 计算平均负均方误差
mean_neg_mse = np.mean(neg_mean_squared_errors)
print(f"Mean Negative Mean Squared Error: {mean_neg_mse}")

#Kfold的说明
from sklearn.model_selection import KFold
# KFold的一些参数
KFold(n_splits=10, random_state=None, shuffle=True) # 如果KFold设置shuffle参数是True,是的打乱

for train_index, test_index in kf.split(data):
    print('训练:',train_index,'测试:',test_index)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值