sklearn-交叉验证

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
"""
@author:v_zduosun
@file:sklearn_5_cross_validation.py
@time:2021/9/27
"""
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier

iris=datasets.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)#考虑点附近的5个附近点
# knn.fit(x_train,y_train)
# y_pred=knn.predict(x_test)
# print(knn.score(x_test,y_test))#0.9736842105263158

#交叉验证的得分
# from sklearn.model_selection import cross_val_score
# #循环下数据判断下哪个n_neighbors得到的结果比较精确  取1到30
# k_ranges=range(1,31)
# k_scores=[]
# for i in k_ranges:
#     knn = KNeighborsClassifier(n_neighbors=i)
#     # scores=cross_val_score(knn,x,y,cv=10,scoring='accuracy')#准确率实验 分类 10折交叉验证  cv的意思是cross validation的多少组 分成10组,每组的test_data是不同的
#     loss=-cross_val_score(knn,x,y,cv=10,scoring='neg_mean_squared_error')#均方误差实验 应用于回归模型 这个是在线性回归时使用,判断误差,注意前面有个负号  最终的结果值越小越好(像这里的分类算法也可以用,也是结果值越小越好)
#     k_scores.append(loss.mean())#取平均值放到数组里
# plt.plot(k_ranges,k_scores)
# plt.xlabel('value of key for KNN')
# plt.ylabel('cross-validation accuracy')
# plt.show()#loss值越小越好,通过图形可以看出,选择12-20的i值最好,当超过20时,会因为过度拟合导致准确率下降

#使用validation_curve确定用哪个超参数比较合适 这里应该验证的是SVC中的gamma参数取什么值合适
# from sklearn.model_selection import validation_curve
# from sklearn.svm import SVC#用的model是support vector classification 支持向量机用于分类
# import numpy as np
# digits=datasets.load_digits()#用的数据是数字,就是1 2 3 4 5等
# x=digits.data
# y=digits.target
# param_range=np.logspace(-6,-2.3,5)#从-6到-2.3取5个值 默认的底是10,即log10,可以通过base来设置底数  得到的结果应该是10e-6到10e-2.3之间取5个数 实际得到的5个数为:0.000001 0.00000841395142 0.0000707945784 0.000595662144 0.00501187234
# train_loss,test_loss = validation_curve(SVC(), x, y, cv=10,param_name='gamma',param_range=param_range, scoring='neg_mean_squared_error',)#改变model中的某个参数的取值,改变的某个参数使用param_name,取值范围用param_range
# train_loss_mean=-np.mean(train_loss,axis=1)#输出的train_loss应该是shape=(5,10),axis=1代表把一组的10个数求平均值
# test_loss_mean=-np.mean(test_loss,axis=1)
# plt.plot(param_range,train_loss_mean,'o-',color='r',label='Training')#o-的意思是绘制圈散点且连线
# 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()#通过图像可以看出,当gamma=0.01附近时,Loss值比较低

#使用学习曲线来判断模型的状态:过拟合还是欠拟合
from sklearn.model_selection import learning_curve #用curve去可视化整个学习的过程
from sklearn.svm import SVC#support vector classification 支持向量机
import numpy as np
digits=datasets.load_digits()#用的数据是数字,就是1 2 3 4 5等
x=digits.data
y=digits.target
train_sizes,train_loss,test_loss = learning_curve(SVC(gamma=0.01), x, y, cv=10, scoring='neg_mean_squared_error',
                       train_sizes=[0.1, 0.25, 0.5, 0.75, 1])#train_sizes代表训练集的数据占所有数据的占比
train_loss_mean=-np.mean(train_loss,axis=1)#输出的train_loss应该是shape=(5,10),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()# 可以看出来在gamma=0.01的时候,test_loss_mean的变化趋势随着train_size的占比增多有了一些升高
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值