scikit-learn(sklearn)学习笔记五

本文介绍了交叉验证在样本量较少时的重要性,使用了sklearn库的cross_val_score进行KNN模型的交叉验证,展示了不同n_neighbors参数对模型准确性的影响。同时,通过learning_curve和validation_curve探讨了过拟合问题,展示如何观察训练损失与验证损失,以及如何通过调整模型参数(如SVM的gamma)来避免过拟合。
摘要由CSDN通过智能技术生成

此次笔记的内容:cross validation交叉验证
我们先沿用第一次笔记的代码

import numpy as np
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split#切割训练集与测试集
from sklearn.neighbors import KNeighborsClassifier#K临近学习

iris=load_iris()
X=iris.data
y=iris.target

X_train,X_test,y_train,y_test=train_test_split(X,y,random_state=4)
knn=KNeighborsClassifier(n_neighbors=5)
knn.fit(X_train,y_train)
print(knn.score(X_test,y_test))
0.9736842105263158

但是我们这么做,如果总样本太少,测试集与验证集就不能像上述的去划分。

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)
[0.96666667 1.         0.93333333 0.96666667 1.        ]
print(scores.mean())
0.9733333333333334

然后我们开始讨论如何选择n_neighbors的参数

from sklearn.model_selection import cross_val_score
import matplotlib.pyplot as plt 
k_range=range(1,31)
k_scores=[]
for k in k_range:
	knn=KNeighborsClassifier(n_neighbors=k)
	scores=cross_val_score(knn,X,y,cv=10,scoring='accuracy')#分成了10个data,用于分类

	k_scores.append(scores.mean()) 
	
plt.plot(k_range,k_scores)
plt.xlabel('Value of K forKNN')
plt.ylabel('Cross-Validataed Accuracy')
plt.show()

效果如下
在这里插入图片描述
此外如果我们像用于线性回归
只需把scores=cross_val_score(knn,X,y,cv=10,scoring=‘accuracy’)更改为loss=-cross_val_score(knn,X,y,cv=10,scoring=‘neg_mean_squared_error’)效果如下在这里插入图片描述
然后我们就开始讨论过拟合
我们先举例看怎么去观查过拟合

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.001),X,y,cv=10,scoring='neg_mean_squared_error',train_sizes=[0.1,0.25,0.5,0.75,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')

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

在这里插入图片描述

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
param_range=np.logspace(-6,-2.3,5)
train_loss,test_loss=validation_curve(SVC(1),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='Cross-validation')

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

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值