sklearn中的交叉验证与参数选择

news/2024/7/9 8:30:52 标签: sklearn, 交叉验证, 参数选择

大家可能看到交叉验证想到最多的就是sklearn里面数据集的划分方法train_test_split,实际上这只是数据交叉验证的数据方法,对模型的进行评分。这里我们将对仔细讲解sklearn交叉验证如何判断模型是否过拟合并进行参数选择主要涉及一下方法:
这里写图片描述
其中方法中的得分参数如下,部分下面会解释:
这里写图片描述

一、cross_validate评估模型的表现:
1,对模型训练一次,然后评估:这样还是会存在过拟合的问题。具体如下:

#直接训练
X_train,X_test,y_train,y_test=train_test_split(iris_X,iris_y,random_state=4)    #把数据集分为训练集和测试集两个部分一部分是训练集,一部分是测试集,其中测试集占了30%
knn=KNeighborsClassifier(n_neighbors=5)
knn.fit(X_train,y_train)
print(knn.score(X_test,y_test)) 

解决办法就是把数据分成(训练,验证,测试),但是这样的问题就是会导致数据的浪费。接下来我们用交叉验证的方法评估。

2,cross_val_score方法:
(1)这个方法是对数据进行多次分割,然后训练多个模型并评分,每次分割不一样。之后我们用评分的均值来代表这个模型的得分。方法重要参数是:cv代表计算多少次,分割次数;scoring代表方法。

#交叉验证
from sklearn.model_selection import cross_val_score
knn = KNeighborsClassifier(n_neighbors=5)
score = cross_val_score(knn,iris_X,iris_y,cv=5,scoring='accuracy')
print(score)
print(score.mean())

(2)我们可以用这个方法,改变超参数n_neighbors的值,对不同模型进行准确评分,进行参数选择。(代码比较简单,看注释应该可以理解)

from sklearn.datasets import load_iris
from sklearn.neighbors import KNeighborsClassifier

iris=load_iris()
iris_X=iris.data
iris_y=iris.target

#交叉验证
from sklearn.model_selection import cross_val_score
knn = KNeighborsClassifier(n_neighbors=5)
score = cross_val_score(knn,iris_X,iris_y,cv=5,scoring='accuracy')
print(score)
print(score.mean())

#交叉验证对参数进行选择
import matplotlib.pyplot as plt
k_range = range(1,31)
k_loss = []
k_accuracy = []
for k in k_range:#对参数进行控制,选择参数表现好的,可视化展示
    knn = KNeighborsClassifier(n_neighbors=k)
    accuracy = cross_val_score(knn,iris_X,iris_y,cv=10,scoring='accuracy')#for classification   精度
    loss = -cross_val_score(knn,iris_X,iris_y,cv=10,scoring='neg_mean_squared_error')#for regression    损失函数
    k_accuracy.append(accuracy.mean())#计算均值得分
    k_loss.append(loss.mean())
#绘图
plt.subplot(1,2,1)
plt.plot(k_range,k_accuracy)
plt.xlabel("Value of K for KNN")
plt.ylabel("Cross-validates Accuracy")
plt.subplot(1,2,2)
plt.plot(k_range,k_loss)
plt.xlabel("Value of K for KNN")
plt.ylabel("Cross-validates Loss")
plt.show()

(3)cv可以传入数据的分割方法:分割方法用ShuffleSplit(还有其他的类)类来定义

from sklearn.model_selection import ShuffleSplit
n_samples = iris.data.shape[0]
cv = ShuffleSplit(n_splits=3, test_size=0.3, random_state=0)
cross_val_score(clf, iris.data, iris.target, cv=cv)

3,cross_validate方法:这个就是可以设置多个评分输出,其他一样

from sklearn.model_selection import cross_validate
from sklearn.metrics import recall_score
scoring = ['precision_macro', 'recall_macro']#设置评分项
clf = svm.SVC(kernel='linear', C=1, random_state=0)
scores = cross_validate(clf, iris.data, iris.target, scoring=scoring, cv=5, return_train_score=False)
sorted(scores.keys())
scores['test_recall_macro']                       

4,cross_val_predict方法:这个是对计算预测值,然后我们可以根据预测值计算得分。

from sklearn import metrics
from sklearn.datasets import load_iris
from sklearn.model_selection import cross_val_predict
from sklearn.neighbors import KNeighborsClassifier

iris = load_iris()
clf = KNeighborsClassifier(n_neighbors=5)
predicted = cross_val_predict(clf, iris.data, iris.target, cv=10)
score = metrics.accuracy_score(iris.target, predicted)#计算得分
print(score)

二、Validation curves验证曲线:前面主要讲的是模型的评估,主要思想就是采用多次数据分割的思想进行交叉验证,用每次分割的得分均值评估模型。这里主要讲通过可视化了解模型的训练过程,判断模型是否过拟合,并进行参数选择

1,validation_curve验证曲线方法:这个方法是用来测试模型不同参数(不同模型)的得分情况。重要参数为:param_name代表要控制的参数;param_range代表参数的取值列表。其他参数都一样。返回训练和测试集上的得分。
(根据模型在训练集合测试集上,不同参数取值的结果,判断模型是否过拟合,并进行参数选择;每次针对一个参数)

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

digits=load_digits()
X=digits.data
y=digits.target
gamma_range=np.logspace(-6,-2.3,5)#从-6到-2.3取5个点
train_loss,test_loss=validation_curve(
    SVC(),X,y,param_name="gamma",param_range=gamma_range,cv=10,scoring="neg_mean_squared_error")
train_loss_mean= (-1)*np.mean(train_loss,axis=1)
test_loss_mean= (-1)*np.mean(test_loss,axis=1)

plt.plot(gamma_range,train_loss_mean,"o-",color="r",label="Training")
plt.plot(gamma_range,test_loss_mean,"o-",color="g",label="Cross-validation")

plt.xlabel("gamma")
plt.ylabel("Loss")
plt.legend(loc="best")
plt.show()

2,learning_curve学习曲线方法:这个方法显示了对于不同数量的训练样本的模型的验证和训练评分。 这是一个工具,可以找出我们从添加更多的训练数据中受益多少,以及估计器是否因方差错误或偏差错误而受到更多的影响。 如果验证分数和训练分数都随着训练集规模的增加而收敛到一个太低的值,那么我们就不会从更多的训练数据中受益。 在下面的情节中,你可以看到一个例子:朴素贝叶斯大致收敛到一个低分。
方法重要参数:train_sizes代表每次选择进行训练的数据大小。
方法返回:训练数据大小列表,训练集,测试集上的得分列表

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

digits=load_digits()
X=digits.data
y=digits.target

#交叉验证测试
train_sizes,train_loss,test_loss = learning_curve(SVC(gamma=0.1),X,y,cv=10,scoring='neg_mean_squared_error',train_sizes=[0.1,0.25,0.5,0.75,1])   #记录的点是学习过程中的10%,25%等等的点
train_loss_mean = -1 * np.mean(train_loss,axis=1)
test_loss_mean = -1 * np.mean(test_loss,axis=1)

#可视化展示
plt.subplot(1,2,1)
plt.plot(train_sizes,train_loss_mean,'o-',color='r',label='train')
plt.plot(train_sizes,test_loss_mean,'o-',color='g',label='cross_validation')

plt.xlabel("Training examples")
plt.ylabel("Loss")
plt.legend(loc="best")

#交叉验证测试
train_sizes,train_loss,test_loss = learning_curve(SVC(gamma=0.001),X,y,cv=10,scoring='neg_mean_squared_error',train_sizes=[0.1,0.25,0.5,0.75,1])   #记录的点是学习过程中的10%,25%等等的点
train_loss_mean = 1 * np.mean(train_loss,axis=1)
test_loss_mean = 1 * np.mean(test_loss,axis=1)

#可视化展示
plt.subplot(1,2,2)
plt.plot(train_sizes,train_loss_mean,'o-',color='r',label='train')
plt.plot(train_sizes,test_loss_mean,'o-',color='g',label='cross_validation')

plt.xlabel("Training examples")
plt.ylabel("Loss")
plt.legend(loc="best")
plt.show()

http://www.niftyadmin.cn/n/1435102.html

相关文章

sklearn超参数选择

本篇文章主要介绍在sklearn中采用GridSearchCV和RandomizedSearchCV进行超参数选择。 一、超参数介绍: 1,超参数:在模型训练中,有些参数不能通过对数据进行学习得到,这种参数叫做超参数。比如,神经网络的…

统计学习方法-李航(第5章 决策树笔记)

这篇文章从思想的角度上看李航所表述的决策树,用简单易理解的方向去解释决策树。提出常见的三种决策树方法ID3,C4.5,同时分析他们的不同。(具体的理论部分参考原文) 一、决策树的认识: 这本书中提出的机器学习的三要素…

统计学习方法-李航(第8章 提升方法笔记)

这一章主要讲boosting提升方法,代表方法是AdaBoost算法,我会从算法的本质去解释算法,尽量用简单的语言其描述,具体推导过程参考原文。 提升方法就是从弱学习算法出发,反复学习,得到一系列弱分类器(又称为基…

RF,GBDT,XGBoost,lightGBM的对比

RF,GBDT,XGBoost,lightGBM都属于集成学习(Ensemble Learning),集成学习的目的是通过结合多个基学习器的预测结果来改善基本学习器的泛化能力和鲁棒性。 根据基本学习器的生成方式,目前的集成学习方法大致分为两大类:即…

进化策略

进化策略和遗传算法统称为进化算法,二者的思想很类似,但步骤和应用方向有所差别。 对遗传算法感兴趣的可以参考博客:遗传算法讲解 这篇文章主要讲解进化策略,从以下三个方面入手: 进化策略的思想进化策略与遗传算法…

python数据内存形式-引用与对象的认识

这篇文章主要是对python中的数据进行认识,对于很多初学者来讲,其实数据的认识是最重要的,也是最容易出错的。本文结合数据与内存形态讲解python中的数据,内容包括: 引用与对象可变数据类型与不可变数据类型引用传递与…

摩尔投票算法( Boyer-Moore Voting Algorithm)

摩尔投票算法也可以叫做多数投票算法,是我在看到 leetcode 169(Majority Element)题目时看到的算法。这篇文章从 leetcode 169(Majority Element)出发讲解摩尔投票算法的原理和优势,同时从 leetcode 229&am…

数组的子集集合

这篇文章是寻找数组的所有子集的集合,例如nums[1,2],子集集合为[[],[1],[2],[1,2]]。这个题目来自于leetcode78. Subsets。 一,动态规划思想: 状态:前面i个数的子集集合res1状态转移方程:前面i1个数的子集集合res2 …