sklearn中的cross-valiation

部署运行你感兴趣的模型镜像

在机器学习中,常常遇到过拟合的现象。这时,选择各种模型的参数就显得十分重要。如何选择最合适的参数呢?
sklearn中提供了一些cross-validation的方法,下面来逐一介绍。

cross_val_score

from sklearn.datasets import load_iris
from sklearn.neighbors import KNeighborsClassifier
#得到花的数据集,其中有四个特征,一个标签
iris = load_iris()
X = iris.data
y = iris.target
#使用cross_val_score中的'accuracy'方法,对模型进行打分
from sklearn.model_selection import cross_val_score
knn = KNeighborsClassifier(n_neighbors=5)
scores = cross_val_score(knn, X, y, cv=5, scoring='accuracy')#分五组
print(scores)#每组都有相应的分数

#利用cross_val_score找到最佳参数,并用matplotlib可视化
import matplotlib.pyplot as plt
k_range = range(1, 31)
k_scores = []
for k in k_range:
    knn = KNeighborsClassifier(n_neighbors=k)
    #loss = -cross_val_score(knn, X, y, cv=10, scoring='neg_mean_squared_error') #对于回归问题可以使用这个打分方法
    scores = cross_val_score(knn, X, y, cv=20, scoring='accuracy') #对于分类问题可以使用这个打分方法
    k_scores.append(scores.mean())#每组分数求平均

plt.plot(k_range, k_scores)
plt.xlabel('Value of K for KNN')
plt.ylabel('Cross-Validated Accuracy')
plt.show()

对于KNN算法来说,选择模型参数n_neighbors对结果有较大影响。
在这里插入图片描述
从图中我们可以看出,当n_neighbors选择为20左右时,针对iris数据集的训练效果是最好的。

learning_curve

from sklearn.model_selection import learning_curve
from sklearn.datasets import load_digits
from sklearn.svm import SVC
import matplotlib.pyplot as plt
import numpy as np
#得到数图像的训练集,每一个图像有64个特征,一个标签
digits = load_digits()
X = digits.data
y = digits.target
print(X.shape, y.shape)
#learning_curve函数返回三个narray,分别是训练集大小,训练集上的误差和测试集上的误差
#打分方法选择neg_mean_squared_error
#可以提供训练数据集大小的列表,来测试当训练集变多,会不会出现过拟合现象。
#如果出现过拟合现象,模型在训练集规模变大的情况下,正确率会变低,loss会变大
train_sizes, train_loss, test_loss= learning_curve(
        SVC(gamma=0.01), X, y, cv=5, scoring='neg_mean_squared_error',
        train_sizes=[0.1, 0.25, 0.5, 0.75, 1])
#对于每一种训练规模,都会有一组长度为5的列表(因为cv=5)来表示loss
#对于每一组loss,取其平均代表最终loss
#由于是每一组loss要求平均,所以需要axis=1,axis=1表示行内求平均
train_loss_mean = -np.mean(train_loss, axis=1)
test_loss_mean = -np.mean(test_loss, axis=1)

plt.plot(train_sizes, train_loss_mean, 'o-', color="r",
             label="Training")
plt.plot(train_sizes, test_loss_mean, 'o-', color="g",
             label="Cross-validation")
print(train_sizes, type(train_sizes))
plt.xlabel("Training examples")
plt.ylabel("Loss")
plt.legend(loc="best")
plt.show()

在这里插入图片描述
从图像中可以看到,测试集的loss逐步减小,模型拟合的较为合适,参数选择对于这个数据集没有问题。

validation_curve

from sklearn.model_selection import validation_curve
from sklearn.datasets import load_digits
from sklearn.svm import SVC
import matplotlib.pyplot as plt
import numpy as np

data = load_digits()
X = data.data
Y = data.target

#创建个数为5的等比数列
param_range = np.logspace(-6, -2.3, 5)
train_loss, test_loss = validation_curve(
    SVC(), X, Y, param_name='gamma', param_range = param_range,
    cv = 10, scoring = 'neg_mean_squared_error'
)
train_loss_mean = -np.mean(train_loss, axis=1)
test_loss_mean = -np.mean(test_loss, axis=1)

plt.plot(param_range, train_loss_mean, 'o-', color = 'r',
         label = 'training')
plt.plot(param_range, test_loss_mean, 'o-', color = 'g',
         label = 'test')
plt.xlabel('gamma')
plt.ylabel('loss')
plt.legend(loc='best')
plt.show()

在这里插入图片描述
右图中可以看出,模型参数gamma选择0.005左右时最佳,再大就会出现过拟合现象

总结

三个方法都是针对一个模型和数据集进行打分,返回打分结果
其中cross_val_score函数最弱,只有最基本的交叉验证功能。learning_curve函数可以传入一个代表训练集占比的列表,validation_curve函数可以传入模型的参数列表。通过这三个函数,可以找到适合模型和数据集的参数,减小loss。

您可能感兴趣的与本文相关的镜像

GPT-oss:20b

GPT-oss:20b

图文对话
Gpt-oss

GPT OSS 是OpenAI 推出的重量级开放模型,面向强推理、智能体任务以及多样化开发场景

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值