2021-07-18

DataWhale集成学习Task03 模型优化基础

偏差与方差

在机器学习中,我们用训练数据集去训练(学习)一个model(模型),通常的做法是定义一个Loss function(误差函数),通过将这个Loss(或者叫error)的最小化过程,来提高模型的性能(performance)。然而我们学习一个模型的目的是为了解决实际的问题(或者说是训练数据集这个领域(field)中的一般化问题),单纯地将训练数据集的loss最小化,并不能保证在解决更一般的问题时模型仍然是最优,甚至不能保证模型是可用的。这个训练数据集的loss与一般化的数据集的loss之间的差异就叫做generalization error。
Bias是 “用所有可能的训练数据集训练出的所有模型的输出的平均值” 与 “真实模型”的输出值之间的差异;
Variance则是“不同的训练数据集训练出的模型”的输出值之间的差异。
偏差度量了学习算法的期望预测与真实结果的偏离程度,即刻画了算法本身的拟合能力。
方差度量了同样大小训练集的变动所导致的学习性能变化,刻画了数据扰动所造成的影响。
噪声则表达了在当前任务上任何学习算法所能达到的期望泛化误差的下界,即刻画了学习问题本身的难度。

过拟合与欠拟合

过拟合是指训练误差和测试误差之间的差距太大。换句换说,就是模型复杂度高于实际问题,模型在训练集上表现很好,但在测试集上却表现很差。模型对训练集"死记硬背"(记住了不适用于测试集的训练集性质或特点),没有理解数据背后的规律,泛化能力差。
欠拟合是指模型不能在训练集上获得足够低的误差。换句换说,就是模型复杂度低,模型在训练集上就表现很差,没法学习到数据背后的规律。

解决方法

解决过拟合

1.获取和使用更多的数据(数据集增强)–解决过拟合的根本性方法
2.采用合适的模型(控制模型的复杂度)
3.降低特征的数量
4.正则化
5.Dropout
6.Early stopping(提前终止)

解决欠拟合

1.添加其他特征项
2.采用更加复杂的模型,比如随机森林
3.减少正则化参数

代码参考

Enguanei https://blog.csdn.net/weixin_44790239/article/details/118863905

import numpy as np
import pandas as pd
from sklearn.datasets import load_boston
import statsmodels.api as sm
from statsmodels.formula.api import ols

# 载入数据集
data = load_boston()

# 设定随机种子(后面用于生成随机参数)
np.random.seed(2021)
np.set_printoptions(suppress=True)

# 选取变量
x = data['data']
y = data['target']
d_x = pd.DataFrame(x, columns=data['feature_names'])
d_y = pd.DataFrame(y, columns=['PRICE'])
d_set = pd.concat([d_x, d_y], axis=1)

# 定义向前逐步回归(加入截距项)
def forward_reg2(x_, y_, cons=False):
    md_scores = list()
    choose = list()
    train_x = x_
    if cons:
        train_x = sm.add_constant(x_, prepend=True)
        choose.append('const')
    feature = list(x_.keys())
    md_scores.append(sm.OLS(y_, np.ones(len(y))).fit().aic)     # 模型不含特征变量时
    loop = 0
    while feature:
        best_score = float('inf')   # 初始化为无穷大
        choose_idx = 0   # 初始化单轮选择的变量名
        for i in range(len(feature)):
            score = sm.OLS(y_, train_x[choose+[feature[i]]]).fit().aic
            if score < best_score:
                best_score = score
                choose_idx = i
        choose.append(feature.pop(choose_idx))
        md_scores.append(best_score)
        loop += 1
        print('第{}轮,加入变量{},AIC为:{}'.format(loop, choose[-1], best_score))
    best_score = float('inf')
    best_idx = 0
    for idx, md_score in enumerate(md_scores):
        if md_score < best_score:
            best_idx = idx
            best_score = md_score
    print('最终选取特征变量为:{}'.format(choose[1:best_idx +1]))
    return choose[1:best_idx + 1]


ols_feature = forward_reg2(d_x, d_y, True)

在这里插入图片描述
特征工程:
1.计算特征与预测变量的相关性,选取相关性高的变量作为特征;
2.使用LDA或者PCA降维算法,选取最大特征;
3.使用线性模型根据权重选择特征,或根据决策树模型选取重要特征。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值