我们讲到的曲线,具体指的是学习曲线(learning curve)和验证曲线(validation curve)。
模型准确率(Accuracy)
模型准确率反馈了模型的效果,大家看下图:
1)左上角子的模型偏差很高。它的训练集和验证集准确率都很低,很可能是欠拟合。解决欠拟合的方法就是增加模型参数,比如,构建更多的特征,减小正则项。
2)右上角子的模型方差很高,表现就是训练集和验证集准确率相差太多。解决过拟合的方法有增大训练集或者降低模型复杂度,比如增大正则项,或者通过特征选择减少特征数。
3)右下角的模型就很好。
绘制学习曲线得到样本数与准确率的关系
直接上代码:
1import matplotlib.pyplot as plt
2from sklearn.model_selection import learning_curve
3pipe_lr = Pipeline([('scl', StandardScaler()),
4 ('clf', LogisticRegression(penalty='l2', random_state=0))])
5train_sizes, train_scores, test_scores =\
6 learning_curve(estimator=pipe_lr,
7 X=X_train,
8 y=y_train,
9 train_sizes=np.linspace(0.1, 1.0, 10), #在0.1和1间线性的取10个值
10 cv=10,
11 n_jobs=1)
12train_mean = np.mean(train_scores, axis=1)
13train_std = np.std(train_scores, axis=1)
14test_mean = np.mean(test_scores, axis=1)
15test_std = np.std(test_scores, axis=1)
16plt.plot(train_sizes, train_mean,
17 color='blue', marker='o',
18 markersize=5, label='training accuracy')
19plt.fill_between(train_sizes,
20 train_mean + train_std,
21 train_mean - train_std,
22 alpha=0.15, color='blue')
23plt.plot(train_sizes, test_mean,
24 color='green', linestyle='--',
25 marker='s', markersize=5,
26 label='validation accuracy')
27plt.fill_between(train_sizes,
28 test_mean + test_std,
29 test_mean - test_std,
30 alpha=0.15, color='green')
31plt.grid()
32plt.xlabel('Number of training samples')
33plt.ylabel('Accuracy')
34plt.legend(loc='lower right')
35plt.ylim([0.8, 1.0])
36plt.tight_layout()
37plt.show()
Learning_curve中的train_sizes参数控制产生学习曲线的训练样本的绝对/相对数量,此处,我们设置的train_sizes=np.linspace(0.1, 1.0, 10),将训练集大小划分为10个相等的区间,在0.1和1之间线性的取10个值。learning_curve默认使用分层k折交叉验证计算交叉验证的准确率,我们通过cv设置k。
下图可以看到,模型在测试集表现很好,不过训练集和测试集的准确率还是有一段小间隔,可能是模型有点过拟合。
绘制验证曲线得到超参和准确率关系
验证曲线是用来提高模型的性能,验证曲线和学习曲线很相近,不同的是这里画出的是不同参数下模型的准确率而不是不同训练集大小下的准确率:
1from sklearn.model_selection import validation_curve
2param_range = [0.001, 0.01, 0.1, 1.0, 10.0, 100.0]
3train_scores, test_scores = validation_curve(
4 estimator=pipe_lr,
5 X=X_train,
6 y=y_train,
7 param_name='clf__C',
8 param_range=param_range,
9 cv=10)
10train_mean = np.mean(train_scores, axis=1)
11train_std = np.std(train_scores, axis=1)
12test_mean = np.mean(test_scores, axis=1)
13test_std = np.std(test_scores, axis=1)
14plt.plot(param_range, train_mean,
15 color='blue', marker='o',
16 markersize=5, label='training accuracy')
17plt.fill_between(param_range, train_mean + train_std,
18 train_mean - train_std, alpha=0.15,
19 color='blue')
20plt.plot(param_range, test_mean,
21 color='green', linestyle='--',
22 marker='s', markersize=5,
23 label='validation accuracy')
24plt.fill_between(param_range,
25 test_mean + test_std,
26 test_mean - test_std,
27 alpha=0.15, color='green')
28plt.grid()
29plt.xscale('log')
30plt.legend(loc='lower right')
31plt.xlabel('Parameter C')
32plt.ylabel('Accuracy')
33plt.ylim([0.8, 1.0])
34plt.tight_layout()
35plt.show()
我们得到了参数C的验证曲线。和learning_curve方法很像,validation_curve方法使用采样k折交叉验证来评估模型的性能。在validation_curve内部,我们设定了用来评估的参数(这里我们设置C作为观测)。
从下图可以看出,最好的C值是0.1。
—End—