模型选择- Validation Curve

模型选择- Validation Curve

我们业务中遇到的适用机器学习的场景,大部分都是监督学习,监督学习的算法非常多,每个模型需要调的超参也各不相同。当我们试用不同的模型,试图找到最优模型的过程,其实就是找出偏差和方差平衡点的过程。

模型的偏差与方差

在这里插入图片描述

我们用上述两幅图来说明下模型的方差和偏差的概念。上述两幅图是基于同一个数据集的两个回归模型的结果,左图表示的是高偏差,也就是欠拟合(underfitting).右图描述的是高方差,即过拟合(overfitting).

  • 高偏差(underfitting):
    高偏差的模型,一般training score 和 validation score结果都较差,模型过于简单,并不能很好的利用数据集的信息来预测因变量。一般处理这种情况,就往两个方向努力:
    • 增加模型复杂度
      • 增加特征,利用训练集的数据,加工出更多的高阶特征
      • 增加模型结构的复杂度,例如在随机森林中,可以增加数的数量
    • 降低模型的正则惩罚力度。例如在逻辑回归中, λ \lambda λ的取值可以相对降低一些。
  • 高方差(overfitting):
    高方差的模型,一般模型在训练集上表现都很好,但是在测试集上,一般都比较差。training score 和 validation score之间存在较大gap。遇到这种情况时,相应的也是往两个方向努力:
    • 增加更多的数据量。但是如果训练集本身数据量就已经够多了,比如customer churn的预测,相应的records一般都是数十万量级,增加数据量,可能对模型效果提升作用也不大。
    • 降低模型的复杂度。

由上述可知,可以利用调节模型的结构复杂度来调节模型的方差和偏差,我们之前非线性模型中讲过polynomialRegression,这里我们以多项式回归为例,介绍下如何用validation curve来决定degree。

Validation Curve

from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression
import numpy as np
import pandas as pd
from sklearn.pipeline import make_pipeline
from sklearn.model_selection import validation_curve 
pipeline =  make_pipeline(PolynomialFeatures(),LinearRegression())
from sklearn.datasets import load_boston
data = load_boston()
df = pd.DataFrame(data=data.data,columns = data.feature_names)
df.describe()
CRIMZNINDUSCHASNOXRMAGEDISRADTAXPTRATIOBLSTAT
count506.000000506.000000506.000000506.000000506.000000506.000000506.000000506.000000506.000000506.000000506.000000506.000000506.000000
mean3.61352411.36363611.1367790.0691700.5546956.28463468.5749013.7950439.549407408.23715418.455534356.67403212.653063
std8.60154523.3224536.8603530.2539940.1158780.70261728.1488612.1057108.707259168.5371162.16494691.2948647.141062
min0.0063200.0000000.4600000.0000000.3850003.5610002.9000001.1296001.000000187.00000012.6000000.3200001.730000
25%0.0820450.0000005.1900000.0000000.4490005.88550045.0250002.1001754.000000279.00000017.400000375.3775006.950000
50%0.2565100.0000009.6900000.0000000.5380006.20850077.5000003.2074505.000000330.00000019.050000391.44000011.360000
75%3.67708312.50000018.1000000.0000000.6240006.62350094.0750005.18842524.000000666.00000020.200000396.22500016.955000
max88.976200100.00000027.7400001.0000000.8710008.780000100.00000012.12650024.000000711.00000022.000000396.90000037.970000
degree = np.arange(0,21)
X = df.iloc[:,3:6]
y = data.target
train_score,val_score = validation_curve(estimator = pipeline,X=X,y=y,param_name = 'polynomialfeatures__degree',param_range = degree,cv=7)

plt.figure(figsize=(16,8))
plt.plot(degree,np.median(train_score,1),color='blue',label='training_score')
plt.plot(degree,np.median(val_score,1),color='red',label='validation score')
plt.legend(loc='best')
plt.ylim(0,1)
plt.xlabel('degree')
plt.ylabel('score')

在这里插入图片描述

模型没有加数据预处理,不过依然可以看出,偏差与方差平衡最好的是三次多项。加上数据预处理和特征加工后,可以利用本文介绍的方法来最终进行模型结构的确定

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值