机器学习笔记-模型的改善与泛化

1.基本概念

(1)机器学习

 (2)特征标准化

等高线:

 

 梯度与等高线:

 (3)特征组合与映射

所谓特征映射是指将原来的特征属性通过某种方式,将其映射到高维空间的过程。当原有的特征被映射到高维空间后,就可能存在一个线性的超平面能够对数据进行很好的拟合

非线性回归:首先需要构造一个模拟的数据集;然后再将整个特征维度映射为二次多项式;最后再进行回归即可拟合。

非线性分类:首先同样需要构造一个模拟的数据集;然后再将整个特征维度映射为二次多项式;最后再进行拟合。

2.过拟合

 笔者首次引入了梯度下降算法来最小化线性回归中的目标函数,并且在经过多次迭代后便可以求得到模型中对应的参数。此时可以发现,模型的参数是一步一步根据梯度下降算法更新而来直至目标函数收敛,也就是说这是一个循序渐进的过程。因此,这一过程也被称作是拟合(Fitting)模型参数的过程,当这个过程执行结束后就会产生多种拟合后的状态,例如过拟合(Overfitting)和欠拟合(Underfitting)等。

将测试时所使用的数据集叫做测试集(Testing Dataset)。同时把模型在训练集上产生的误差叫训练误差(Training Error);把模型在测试集上产生的误差叫泛化误差(Generalization Error);最后也将整个拟合模型的过程称作是训练(Training)

进一步,degree=10时所产生的现象叫做过拟合(Overfitting),即模型在训练集上的误差很小,但在测试集上的误差很大,也就是泛化能力弱;相反,将其对立面degree=1时所产生的现象叫做欠拟合(Underfitting),即模型训练集和测试集上的误差都很大;同时,将degree=5时的现象叫做恰拟合(Good Fitting),即模型在训练集和测试集上都有着不错的效果。

 

如何解决欠拟合:

 所谓欠拟合就是训练出来的模型根本不能较好的拟合现有的训练数据。

  • 设计新的特征;收集或设计更多的特征维度作为模型的输入,即根据已有特征数据组合设计得到更多新的特征,这有点类似于上一点。

  • 减小正则化系数;当模型出现欠拟合现象时,可以通过减小正则化中的惩罚系数来减缓欠拟合现象。 

 如何解决过拟合:

  • 收集更多数据;这是一个最为有效但实际操作起来又是最为困难的一个方法。训练数据越多,在训练过程中也就越能够纠正噪音数据对模型所造成的影响,使得模型不易过拟合。但是对于新数据的收集往往具有较大的困难。

  • 降低模型复杂度;当训练数据过少时,使用较为复杂的模型极易产生过拟合现象,因此可以通过适当减少模型的复杂度来达到缓解模型过拟合的现象。

  • 正则化方法;在出现过拟合现象的模型中加入正则化约束项,以此来降低模型过拟合的程度。

  • 集成方法;将多个模型集成在一起,以此来达到缓解模型过拟合的目的。

 如何避免过拟合:
为了避免训练出来的模型产生过拟合现象,在模型训练之前一般会将拿到的数据集划分成两个部分,即训练集与测试集,且两者一般为7:3的比例。其中训练集用来训练模型(降低模型在训练集上的误差),然后用测试集来测试模型在未知数据上的泛化误差,观察是否产生了过拟合现象。

但是由于一个完整的模型训练过程通常会是先用训练集训练模型,再用测试集测试模型。而绝大多数情况下不可能第一次就选择了合适的模型,所以又会重新设计模型(如调整多项式次数等)进行训练,然后再用测试集进行测试。因此在不知不觉中,测试集也被当成了训练集在使用。所以这里还有另外一种数据的划分方式,即训练集、验证集(Validation data)和测试集,且一般为7:2:1的比例,此时的测试集一般是通过训练集和验证集选定模型后做最后测试所用。

 3.正则化

模型产生过拟合的现象表现为在训练集上误差较小,而在测试集上误差较大。并且笔者还说到,之所以产生过拟合现象是由于训练数据中可能存在一定的噪音,而我们在训练模型时为了尽可能的做到拟合每一个样本点(包括噪音),往往就会使用复杂的模型。最终使得训练出来的模型在很大程度上受到了噪音数据的影响,例如真实的样本数据可能更符合一条直线,但是由于个别噪音的影响使得训练出来的是一条弯曲的曲线,从而使得模型在测试集上表现糟糕。因此,可以将这一过程看作是由糟糕的训练集导致了糟糕的泛化误差。但仅仅从过拟合的表现形式来看糟糕的测试集(噪音多)也可能能导致糟糕的泛化误差。

(1) 测试集导致糟糕的泛化误差是指训练集本身没有多少噪音,但由于测试集含有大量噪音,使得训练出来的模型在测试集上没有足够的泛化能力,而产生了较大的误差。

 

 由此便可以知道,通过在原始目标函数中加入正则化项,便能够使得训练得到的参数趋于平滑,进而能够使得模型对噪音数据不再那么敏感,缓解了模型过拟合的现象。

(2)训练集导致糟糕的泛化误差

4.手写数字实例

载入数据集

def load_data():
     data = load_digits()
     x, y = data.data, data.target
     return x,y

划分数据集:

 from sklearn.model_selection import train_test_split
 def load_data():
    #此处接“1.载入数据集”中代码
   x_train, x_test, y_train, y_test = \
   train_test_split(x, y, test_size=0.3, random_state=20)

对训练集标准化:

from sklearn.preprocessing import StandardScaler
 def load_data():
   #此处接“2.划分数据集”中代码
   ss = StandardScaler()
   x_train = ss.fit_transform(x_train)
 def load_data():
     #此处接“2.划分数据集”中代码
      ss = StandardScaler()
      ss.fit(x_train) #先计算每3个维度需要用到的均值和方差 
      x_train = ss.transform(x_train)#再对每个维度进行标准化

对测试集进行标准化

def load_data():
     #此处接“3.对训练集标准化”中代码
     x_test = ss.transform(x_test)

模型的选择:

#列出学习率和惩罚系数的可能取值
learning_rates = [0.001, 0.03, 0.01, 0.03, 0.1, 0.3, 1, 3]
penalties = [0, 0.01, 0.03, 0.1, 0.3, 1, 3]


#定义模型--列举出所有参数的可能取值后,就需要遍历所有的参数组合

from sklearn.linear_model import SGDClassifier
 for learning_rate in learning_rates:
     for penalty in penalties:
       print(f"训练模型:learning_rate={learning_rate}, penalty={penalty}")
       model = SGDClassifier(loss='log', penalty='l2', learning_rate = 'constant', 
               eta0=learning_rate, alpha=penalty)

 交叉验证:

from sklearn.model_selection import KFold
 model = ……此处接“2.定义模型”中代码
 kf = KFold(n_splits=k, shuffle=True, random_state=10)
 for train_index, dev_index in kf.split(X):
   X_train, X_dev = X[train_index], X[dev_index]
   y_train, y_dev = y[train_index], y[dev_index]
   model.fit(X_train, y_train)
   s = model.score(X_dev, y_dev)

 模型测试:

 model = SGDClassifier(loss='log', penalty='l2', learning_rate='constant',                            
       eta0=0.03, alpha=0.0)
 model.fit(x_train, y_train)
 y_pred = model.predict(x_test)
 print(classification_report(y_test, y_pred))

 以上信息均来源于月来客栈,个人学习笔记,如有侵权,请联系删除!!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 机器学习模型评估、选择和验证是指评估模型的性能、从多个模型中选择最佳模型,并验证模型泛化能力。常用的评估方法包括准确率、精确率、召回率、F1 分数、ROC 曲线和 AUC 等。常用的选择方法包括交叉验证、超参数调优、学习曲线分析等。 ### 回答2: 机器学习的目标是通过训练来构建模型,以便能够高效地预测未知数据。但是,模型的准确性不仅取决于所使用的算法,还取决于其它因素,例如数据和参数设置。 模型评估能够帮助我们了解模型性能的好坏。评估算法的过程通常涉及到数据划分、交叉验证和各种评估指标。一般来说,数据划分的过程将数据集拆分成训练集和测试集。用训练集来构建模型并进行参数调整,然后使用测试集来衡量模型的性能。交叉验证是在数据集合上的一个更安全和更可靠的方法,它将原始数据集划分成K个互斥的子集,并使用K-1个子集来训练模型,用剩余的子集来评估模型的性能。 选择正确的模型非常关键,因为模型的性能可以直接影响结果的准确性。选择模型的一个重要因素是如何表示数据集。数据可以使用多种方式表示,而不同的数据表示方式有不同的优劣。选择适当的模型是当然的,但是我们还应该使用技术来优化模型,并防止模型过度拟合或欠拟合。 模型验证是评估模型如何执行任务的最终步骤。验证后,我们可以使用模型进行预测并将其应用于新数据。如果模型的性能不符合要求,可以通过重新评估、更改数据集或改变模型参数来尝试改善模型验证是机器学习流程中非常重要的一部分,可以确保我们的模型效果良好,从而为我们提供可靠的预测结果。 总之,机器学习是一种建立复杂模型的方法,不同的算法、数据表示方式和参数会影响其性能。为了找到最佳模型,我们需要进行模型评估、选择和验证等工作。这些步骤是机器学习流程的关键组成部分,可以帮助我们构建高效且准确的模型,从而应对各种实际应用场景。 ### 回答3: 机器学习是一种人工智能领域的重要技术,它允许计算机从历史数据中学习,建立预测模型,并用于未来的数据预测和决策。模型评估、选择与验证是机器学习过程中的重要一环,以保证模型的准确性、稳定性和泛化能力。 模型评估的目的是检验模型的表现,并度量其优劣。常用的评估指标包括精确度、召回率、F1值等,这些指标可以用于比较不同模型之间的性能表现。评估模型时,通常需要将数据集划分为训练集和测试集,训练集用于训练模型,而测试集用于评估模型性能。评估模型的结果可以指导我们调整模型的参数,提高模型的预测精度。 模型选择是在多个模型中选择最合适的模型。常用的模型选择方法包括交叉验证、留一法等。交叉验证是将数据集分成k个子集,每个子集轮流作为测试集进行模型评估,其余部分用于训练模型,最后将测试集误差取平均值作为综合误差来评估模型的性能。 模型验证是对模型泛化能力的验证。泛化能力是指模型对未知数据的预测精度,即模型是否能够对新数据进行较好的预测。在模型验证中,需要将数据集划分为训练集、验证集和测试集。在训练集中训练模型,在验证集上调整模型参数,并在测试集上验证模型泛化能力。常用的验证方法包括留存法、k折交叉验证等。 综上所述,模型评估、选择与验证对于机器学习中的预测模型非常重要。这些技术可以保证模型的准确性和稳定性,并提高模型泛化能力,为数据分析和预测提供可靠依据。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值