使用一批训练数据集进行模型训练,需要将训练数据分为:一份训练数据以及一份测试数据。

image-20200617163328931

这样做的目的,也是为了解决模型过拟合,欠拟合的问题。

欠拟合

算法所训练的模型不能完整表达数据关系:

image-20200617162537017

过拟合

算法所训练的模型过多的表达了数据见的噪音关系:

image-20200617162658081

一个模型需要既不能欠拟合,也不能过拟合,这是一个平衡,模型需要好的泛化能力,而这也是加入测试数据集的作用。

验证数据集和交叉验证

即使划分了测试数据集,也有可能出现,模型针对测试数据出现过拟合的现象,这样,还是无法保证模型的泛化能力。

故引入交叉验证。将训练数据分为K等分,如图所示。

image-20200617163713271

通过计算K等分的组合数据得到的均值,来选择最佳的模型。

交叉验证会带来一定的计算代价,尤其是当数据集很大的时候,导致计算过程会变得很慢。

网格搜索调参

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
   x_train, x_test, y_train, y_test = model_selection.train_test_split(np_data_array, np_array, test_size=0.2, random_state=55)

scaler = preprocessing.StandardScaler().fit(x_train)
linear_svc = svm.LinearSVC(random_state=0, max_iter=30000)

param_grid = [
{
'C': [x for x in np.linspace(0.1, 1.0, num=10)]
}
]

search_cv = GridSearchCV(linear_svc, param_grid, n_jobs=4, verbose=1)
search_cv.fit(scaler.transform(x_train), y_train)

# debug print
# [Parallel(n_jobs=4)]: Using backend LokyBackend with 4 concurrent workers.
# Fitting 5 folds for each of 10 candidates, totalling 50 fits
# [Parallel(n_jobs=4)]: Done 42 tasks | elapsed: 7.0min
# [Parallel(n_jobs=4)]: Done 50 out of 50 | elapsed: 8.3min finished