K折交叉验证
过程:
- 选择K的值(一般是10),将数据集分成不重叠的K等份 。
- 使用其中的K-1份数据作为训练数据,另外一份数据作为测试数据,进行模型的训练
- 使用一种度量测度来衡量模型的预测性能
优点:
- 可通过降低模型在一次数据分割中性能表现上的方差来保证模型性能的稳定性
- 可用于进行参数调节、模型性能比较、特征选择等
缺点:
交叉验证带来一定的计算代价, 是当数据集很大的时候,计算过程会变得很慢
训练集用来训练我们的模型;测试集用来评估我们训练好的模型表现如何,在进行测试前要绝对保密不能提前被模型看到的。
在K折交叉验证中,我们用到的数据是训练集中的所有数据。我们将训练集的所有数据平均划分成K份(通常选择K=10),取第K份作为验证集,余下的K-1份作为交叉验证的训练集。
网格搜索算法
网格搜索算法是一种一种调参手段,通过遍历给定参数组合来优化模型表现的方法。其原理就像是在数组里找最大值。
以决策树为例,当确定了要使用决策树算法的时候,为了能够更好地拟合和预测,需要调整它的参数。在决策树算法中,我们通常选择的参数是决策树的最大深度。
于是我们会给出一系列的最大深度的值,比如 {‘max_depth’: [1,2,3,4,5,6]},我们会尽可能包含最优最大深度。
为了知道哪一个最大深度的模型是最好的,需要一种可靠的评分方法,对每个最大深度的决策树模型都进行评分,这其中非常经典的一种方法就是上述所述的交叉验证。
准备数据(鸢尾花数据集)及导入相关python库
from sklearn.datasets import load_iris
from sklearn.svm import SVC
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.model_selection import cross_val_score
iris = load_iris()
X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, random_state=0)
print("Size of training set:{} size of testing set:{}".format(X_train.shape[0], X_test.shape[0]))
简单的网格搜索,使用for循环遍历
def simpleGridSearch(X_train, X_test, y_train, y_test):
'''
使用for循环实现网格搜索
:param X_train:
:param X_test:
:param y_train:
:param y_test:
:return:
'''
# grid search start
best_score = 0
for gam