验证数据集和交叉验证以及偏差方差平衡


一、验证数据集

1、验证数据集的引入

上篇结尾我们已经说过,对于只有训练数据集和测试数据集是不够的,因为对于模型来说,这两个数据集都是已知的,训练数据集用来训练模型,测试数据集用来调整超参数调整模型。但不论怎样,对于这个模型来说,没有一个未知数据的测试,会出现过拟合的现象。此时我们就需要一个验证数据集
在这里插入图片描述
对于模型来说,训练数据集用来训练模型,验证数据集调整超参数,而测试数据集作为最终衡量模型性能的数据集。测试数据集对于模型来说是完全未知的。

2、交叉验证 cross validation

因为对于验证数据集它是随机的数据,可能会有极端值:

如果只使用一个验证数据集进行调参来获取模型的话,假设验证数据集中有极端的数据,就会导致该模型拟合验证数据集拟合的好,但是模型却不适用的情况。这种情况下,我们可以使用交叉验证的方式。
在这里插入图片描述

使用交叉验证的方式,会有多个验证数据集,我们使用交叉验证后的模型的均值作为评判模型的好坏(即使有一个极端情况也不影响)之后进行调参来调整模型。

3、交叉验证代码实例:

from sklearn import datasets
import numpy as np
digits=datasets.load_digits()
x=digits.data
y=digits.target

#这里先没有使用划分验证数据
测试train_test_split

from sklearn.model_selection import train_test_split
x_train,x_test,y_train,y_test=train_test_split(x,y)
from sklearn.neighbors import KNeighborsClassifier
#根据测试数据集来修改寻找最好的超参数
best_score,best_p,best_k=0,0,0
for k in range(1,11):
    for p in range(1,6):
        knn=KNeighborsClassifier(weights="distance",n_neighbors=k,p=p)
        knn.fit(x_train,y_train)
        score=knn.score(x_test,y_test)
        if score>best_score:
            best_score=score
            best_p=p
            best_k=k
print("best_score:",best_score)
print("best_p:",best_p)
print("best_k:",best_k)

在这里插入图片描述

交叉验证 有了验证数据集

knn=KNeighborsClassifier()
cross_val_score(knn,x_train,y_train)  #默认k为3 交叉验证3次

在这里插入图片描述

from sklearn.model_selection import cross_val_score
best_score,best_p,best_k=0,0,0
for k in range(1,11):
    for p in range(1,6):
        knn=KNeighborsClassifier(weights="distance",n_neighbors=k,p=p)
        scores=cross_val_score(knn,x_train,y_train)
        score=np.mean(scores)
        if score>best_score:
            best_score=score
            best_p=p
            best_k=k
print("best_score:",best_score)
print("best_p:",best_p)
print("best_k:",best_k)

在这里插入图片描述
可以看到 与不区分验证数据的结果不同
通过使用验证数据来调整参数获得的模型来测试数据

best_knn=KNeighborsClassifier(weights="distance",n_neighbors=1,p=3)
best_knn.fit(x_train,y_train)
best_knn.score(x_test,y_test)

在这里插入图片描述

	我们可以看到,虽然该结果比不使用验证数据的结果值低,但是使用交叉验证的获得的模型应该更值得信赖

回顾网格搜索,其实网格搜索使用的也是交叉验证

from sklearn.model_selection import GridSearchCV

para_grid=[
           {'weights':['distance'],
           'n_neighbors':[i for i in range(1,11)],
           'p':[i for i in range(1,6)]}]
grid_search=GridSearchCV(knn,para_grid)
grid_search.fit(x_train,y_train)
grid_search.best_params_

在这里插入图片描述
与交叉验证获得的超参数相同

二、偏差方差平衡

1.什么是方差与偏差

在这里插入图片描述

2.模型有偏差和方差的原因

1、偏差:

在这里插入图片描述

简单来说,就是我们对数据本身的认识不够充分不够合理

2、方差:

在这里插入图片描述

如过拟合,对测试数据拟合的很好,但是由于模型太过复杂,泛化能力弱,导致其他数据的拟合程度不好,方差过大

3、算法的方差与偏差

在这里插入图片描述

3、方差与偏差的矛盾性

在这里插入图片描述
在这里插入图片描述

4、算法中的最大挑战是方差

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
偏差-方差权衡是机器学习中一个重要的概念,它涉及到模型的泛化能力。高偏差意味着模型欠拟合,高方差意味着模型过拟合。在Python中,我们可以通过绘制学习曲线来诊断偏差-方差问题。 学习曲线是一种可视化工具,用于评估模型的表现。它显示了模型在训练集和验证集上的表现随着训练样本数量的增加而变化的情况。通过观察学习曲线,我们可以判断模型是否存在偏差方差问题。 下面是一个简单的例子,演示如何使用Python绘制学习曲线: ```python from sklearn.model_selection import learning_curve from sklearn.linear_model import LinearRegression import numpy as np import matplotlib.pyplot as plt # 生成随机数据 X = np.random.rand(100, 1) y = 2 + 5 * X + np.random.randn(100, 1) # 定义模型 model = LinearRegression() # 绘制学习曲线 train_sizes, train_scores, test_scores = learning_curve(model, X, y, cv=10) train_mean = np.mean(train_scores, axis=1) train_std = np.std(train_scores, axis=1) test_mean = np.mean(test_scores, axis=1) test_std = np.std(test_scores, axis=1) plt.plot(train_sizes, train_mean, 'o-', color="r", label="Training score") plt.plot(train_sizes, test_mean, 'o-', color="g", label="Cross-validation score") plt.fill_between(train_sizes, train_mean - train_std, train_mean + train_std, alpha=0.1, color="r") plt.fill_between(train_sizes, test_mean - test_std, test_mean + test_std, alpha=0.1, color="g") plt.xlabel("Training examples") plt.ylabel("Score") plt.legend(loc="best") plt.show() ``` 上述代码中,我们使用`sklearn`库中的`learning_curve`函数生成学习曲线。该函数需要传入模型、训练数据、目标数据和交叉验证的折数。最后,我们使用`matplotlib`库绘制学习曲线。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值