机器学习---模型选择

我们运用手里有的数据,选择机器学习方法,建造好了模型,除了评估指标外,我们还可以判断模型的是否错误:

有两种常见的错误类型:

  1. 欠拟合和过拟合
  • 欠拟合,模型过于简单,拟合的不够好,经常发生错误(高偏差)。
    相当于一个学生没有认真学习,很多题都没做对。
  • 过拟合,模型过于复杂。倾向于记住了训练集数据(高方差),而不是学习数据的特点。
    相当于一个学生把所有书本背下来了,会学过的知识,新题就不会了。
  1. 模型复杂度图表
    根据前面学的知识,我们把数据分为训练集和测试集两部分,我们通过模型可以得出:训练集的错误数量和测试集的错误数量。我们使用不同的模型把这些错误都标记出来,如下图模型复杂度图表所示:
    在这里插入图片描述
    从模型复杂度图表上我们可以看出左侧是一个欠拟合模型,具有较高的训练误差和测试误差。右边是过拟合模型,它具有较低的训练误差和较高的测试误差。中间的模型刚刚好,它具有相对较低的训练误差和测试误差。这就是我们应该选择的模型。
    我们虽然通过模型复杂度图表选择了最佳模型,但是我们犯了一个致命错误,就是使用了测试集。除了最后一步,任何时候我们都不应该使用测试集。

  2. 交叉验证
    为了达到以上相同的效果并且不动用测试集,我们把训练集再划分,分为:训练集和交叉验证集。测试集照样不动它。
    我们更为一般话的模型复杂度图表为:
    在这里插入图片描述
    我们力求在误差和学习能力之间找到一个最佳位置。

  3. K-FOLD交叉验证
    数据被分为训练集和测试集,那么总是会有些对训练模型有用的数据被浪费了,为了充分利用数据,我们学习K-FOLD交叉验证。
    把所有数据分成K份,
    每次留出一份作为测试集,其余数据作为训练集,
    这样循环K次,求结果的平均值,最终得到模型。
    使用sklearn中实现

    from sklearn.model_selection import KFold
    kf = KFold(12,3,shuffle = True) #数据集和测试集大小,第三个参数是随机化数据集
    
    for train_indices,test_indices in kf:
    	print train_indices,test_indices
    
  4. 学习曲线(判断模型欠拟合过拟合的标准)
    前面四个知识点把是为了获得更好的模型对数据的准备,数据准备好了,就可以机器学习了,那么我们如何得知这个模型是欠拟合还是过拟合呢?
    例:
    我们第一次取4个点,然后分为训练集和交叉验证集,得到训练集的错误数和验证集的错误数。
    我们第二次取8个点,然后分为训练集和交叉验证集,得到训练集的错误数和验证集的错误数。
    我们第三次取12个点,然后分为训练集和交叉验证集,得到训练集的错误数和验证集的错误数。
    把点数作为横坐标,错误数作为纵坐标,画出曲线图。

    黄色是验证集的错误曲线,绿色是训练集的错误曲线。
    第一幅图是一次函数,第二幅图是二次函数,第三幅图是六次函数。
    特点:
    第一幅:欠拟合的黄绿曲线接近,但是错误点较高,意思是错误较多。
    第二幅:黄绿曲线接近,错误点较低。
    第三幅:过拟合的黄绿曲线相隔较远,明显的训练集表现好,交叉验证集表现很差,非常符合过拟合的特点。
    这些曲线叫学习曲线,可以用学习曲线来判断欠拟合过拟合,并选出合适的模型。


机器学习过程:
首先使用数据训练一推模型,(训练集)
然后使用交叉验证调蓄那最佳模型,(交叉验证集)得到F1得分,
最后对F1得分较高的模型使用测试集测试模型是否很好。(测试集)
例:逻辑回归

模型训练集训练后的曲线斜率和系数交叉验证后的F1得分
第一个逻辑回顾模型:一次模型0.5
第二个逻辑回顾模型:二次模型0.8
第三个逻辑回顾模型:三次模型0.4
第四个逻辑回顾模型:四次模型0.2

在这里插入图片描述
逻辑回归中F1得分最高的是0.8,所以我们会使用测试集来验证二次函数的逻辑回顾模型是否很好。总体来看,这些算法参数是多项式的系数。我们先称它为超参数。
例:决策树
我们决定决策树的超参数是深度。意思是根据超参数的值调整模型,现在,我们的超参数是深度,我们就改变决策树的深度值,形成各个模型。

模型训练集训练后的曲线斜率和系数交叉验证后的F1得分
深度为一的模型0.4
深度为二的模型0.5
深度为三的模型0.9
深度为四的模型0.2

在这里插入图片描述
决策树中F1得分最高的是0.9,所以我们会使用测试集来验证深度为2的决策树模型是否很好。
逻辑回归和决策树的超参数个数都是1,是否有超参数个数为多个的情况呢?答案是有的。
例:支持向量机
超参数有:
内核:可以理解为一次线性,多次多项式
γ \gamma γ参数:相当于调整曲线的斜率
如下图所示:
在这里插入图片描述
此时超参数就是两个了,我们训练模型的时候就得组合起来看。如何组合?运用网格搜索法。

  1. 网格搜索
    对于存在多个超参数的模型,我们制作一个表格列出所有可能的组合,然后选择最佳组合。
    对于上面的支持向量机来说:列是不同的 γ \gamma γ值,行是不同的内核值。用训练集训练数据,用交叉验证集求得F1得分,取最高得分,使用测试集判断模型好坏。
    在这里插入图片描述
    在sklearn中实现网格搜索(更多数据处理部分可参照上几篇博客)
    #导入 GridSearchCV
    from sklearn.model_selection import GridSearchCV
    
    #选择参数,使用字典,键 (keys) 将是参数的名称,值 (values) 将是每个参数可能值的列表
    parameters = {'kernel':['poly', 'rbf'],'C':[0.1, 1, 10]}
    
    #创建一个评分机制 (scorer),也就是F1得分
    from sklearn.metrics import make_scorer
    from sklearn.metrics import f1_score
    scorer = make_scorer(f1_score)
    
    #使用参数 (parameter) 和评分机制 (scorer) 创建一个 GridSearch 对象。
    # 使用此对象与数据保持一致 (fit the data)
    # Create the object.
    grid_obj = GridSearchCV(clf, parameters, scoring=scorer)
    # Fit the data
    grid_fit = grid_obj.fit(X, y)
    
    #获得最佳估算器 (estimator)
    best_clf = grid_fit.best_estimator_
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值