sklearn中的交叉验证和数据划分

本文介绍了在sklearn中如何进行数据划分和交叉验证以避免过拟合问题,包括train_test_split、k折交叉验证(KFold、StratifiedKFold)、交叉验证的评价指标以及LOO、ShuffleSplit等其他数据划分方法。通过实例展示了如何使用SVM模型,并讨论了数据标准化和Pipeline的重要性。
摘要由CSDN通过智能技术生成
给定一个训练数据集合,寻找一个模型去fit这个训练数据,如果在全部的训练数据上训练获得模型并且在全部的训练数据上测试模型,则测试结果会很好;
但是对于未知的数据泛化效果会很不好,即过拟合。所以需要在不同的数据集上训练和测试。


import numpy as np
from sklearn.model_selection import train_test_split
from sklearn import datasets
from sklearn import svm
iris = datasets.load_iris()
X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.4, random_state=0)


#train_test_split将数据划分成训练集合和测试集合,random_state参数设置使得能够固定随机划分。test_size即为测试集占比


#先前基础上加入以下代码
clf = svm.SVC(kernel='linear', C=1).fit(X_train, y_train)
print clf.score(X_test, y_test) #输出0.966666666667


针对SVM模型而言,如果只将原有的训练数据划分为训练集和测试集,必须人工设定参数C,模型在测试集合上依然存在过拟合的风险。
因为这个参数会不断优化使得其在测试集上取得最佳的性能,这时候测试集的内容就会被泄露到模型中,由测试集得到的评价指标不再能够反映出泛化的性能。
为了解决这个问题,可以将原有的训练数据划分为训练集、验证集和测试集三个部分,在训练集上训练,再在验证集上评估,最后在测试集上进行评价。
这样泄露的只是验证集上的数据,而测试集的数据不会泄漏,能够得到无干扰的泛化性能指标。
但是针对数据量较小的训练数据这样划分数据集会使得训练集的量不够,无法得到有效的训练,同时随机划分这三个集合也会造成最终结果一定的随机性。


可以用交叉验证的方式解决这个问题。基本的方法称为k折交叉验证,下面介绍sklearn中的交叉验证
#先前基础上加入以下代码
from sklearn.model_selection import cross_val_score
clf = svm.SVC(kernel='linear', C=1)
scores = cross_val_score(clf, iris.data, iris.target, cv=5)  #线性SVM连续5次采用不同方法划分数据拟合并评分
print scores  #输出[ 0.96666667  1.          0.96666667  0.96666667  1.        ]
print scores.mean()  #输出平均分数0.98



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值