测试数据可以让你评估你的分类器或回归在独立数据集上的性能,还能帮助你避免过度拟合
在sklearn中训练/测试分离
sklearn链接:http://scikit-learn.org/stable/modules/cross_validation.html
加载数据集以适应线性SVM:
from sklearn import datasets
from sklearn.svm import SVC
iris = datasets.load_iris()
features = iris.data
labels = iris.target
快速地采样一个训练集,同时支持40%的数据来测试(评估)我们的分类器:
#将数据集拆分为训练和测试集
from sklearn.model_selection import train_test_split
features_train, features_test, labels_train, labels_test = cross_validation.train_test_split(iris.data,iris.target,test_size = 0.4,random_state=0)
clf = SVC(kernel="linear", C=1.)
clf.fit(features_train, labels_train)
print clf.score(features_test, labels_test)
何处使用训练数据,何处使用测试数据
流程:首先将全部数据分为训练数据集和测试数据集,接下来使用PCA一种特征转换选出一些主成分,将其放入支持向量机一种分类方法svc
1. pca.fit(training_features)在训练特征中找到主成分
2. pca.transform(training_features)使用发现的fit将数据实际转化为新的主成分表示
3. svc.train(training_features) 训练支持向量机分类器
4. pca.transform(test_features)
因为没有再次调用pca.fit,因此将使用在训练数据中发现的主成分表示我的测试特征,如果此时使用测试特征重新拟合PCA,是不正确的
5. svc.predict(test_features)
支持向量机对测试数据集进行预测
练习:K折交叉验证
两个集合最大化——尽可能多的训练集数据点以获得最佳学习效果,尽可能多的测试集数据项来获得最佳验证,此时为了寻找折中点涉及到交叉验证
基本要点:将训练数据评分到相同大小的k个容器内,例如200个训练数据点,10个容器,则每个容器20个训练数据点,在k折交叉验证中,你将运行k此单独的学习试验,在每次实验中,你将从这k个子集中挑选一个作为验证集,剩下k-1个容器放在一起作为训练集,然后训练你的机器学习算法,再再验证集上验证性能,交叉验证中的要点是这个操作会运行k次,然后将k次试验的测试结果取平均值
>>> import numpy as np
>>> from sklearn.model_selection import KFold
>>> X = ["a", "b", "c", "d"]
>>> kf = KFold(n_splits=2)
>>> for train, test in kf.split(X):
... print("%s %s" % (train, test))
[2 3] [0 1]
[0 1] [2 3]
train=训练集中使用的所有数据点的索引值的集合,test=测试集使用的所有索引值
sklearn中的K折CV
#!/usr/bin/python
import sys
from time import time
from sklearn.cross_validation import KFold
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.feature_selection import SelectPercentile,f_classif
from sklearn.naive_bayes import Gaussian