给定一个训练数据集合,寻找一个模型去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
但是对于未知的数据泛化效果会很不好,即过拟合。所以需要在不同的数据集上训练和测试。
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