要求:掌握机器学习回归的原理,并使用sklearn进行回归应用。
使用sklearn构建机器学习项目流程:
一般来说,一个完整的机器学习项目分为以下步骤:
- 明确项目任务:回归/分类
- 收集数据集并选择合适的特征。
- 选择度量模型性能的指标。
- 选择具体的模型并进行训练以优化模型。
- 评估模型的性能并调参。
回归模型:
1.线性回归模型
(a) 最小二乘估计:
损失函数:
可直接求权重:
注:为什么误差函数不用|y-yreal|? 首先,消除误差值的正负号影响,可以使用绝对值或平方解决;其次,使用绝对值不方便对误差函数求导。
(b) 几何解释:
为求y到平面x距离最近(误差最小)的参数,让y作垂直平面x的法向量,从而能得到最近似的y'值。
平面X的法向量为Y-Xw,与平面X互相垂直,所以
(Xw也位于x平面上)
(c) 概率解释:
线性回归的最小二乘估计<==>噪声𝜖∽𝑁(0,𝜎2)的极大似然估计
2.线性回归的推广
(a) 多项式回归:将模型换成一个多项式函数
(b) 广义可加模型(GAM):在这个框架中,每一个变量都用一个非线性函数来代替,但是模型本身保持整体可加性。
- 优点:自然地推广线性回归模型至非线性模型,提升模型的预测精度;由于模型本身是可加的,GAM还能像线性回归模型对某个变量进行推断,保留了线性回归的易于推断的性质。
- 缺点:GAM模型会经常忽略一些有意义的交互作用,比如某两个特征共同影响因变量,不过GAM还是能像线性回归一样加入交互项𝑥(𝑖)×𝑥(𝑗)的形式进行建模;但是GAM模型本质上还是一个可加模型。
(c)回归树模型:
基于树的回归方法主要是依据分层和分割的方式将特征空间划分为一系列简单的区域。对某个给定的待预测的自变量,用他所属区域中训练集的平均数或者众数对其进行预测。由于划分特征空间的分裂规则可以用树的形式进行概括,因此这类方法称为决策树方法。
决策树由结点(node)和有向边(diredcted edge)组成。结点有两种类型:内部结点(internal node)和叶结点(leaf node)。内部结点表示一个特征或属性,叶结点表示一个类别或者某个值。区域𝑅1,𝑅2等称为叶节点,将特征空间分开的点为内部节点。
与线性模型的比较:
线性模型的模型形式与树模型的模型形式有着本质的区别,线性回归对模型形式做了如下假定:
那么,哪种模型更优呢?
如果特征变量与因变量的关系能很好的用线性关系来表达,那么线性回归通常有着不错的预测效果。反之,如果特征变量与因变量的关系呈现高度复杂的非线性,那么树方法比传统方法更优。
(d)支持向量回归SVR:
在线性回归的理论中,每个样本点都要计算平方损失,但是SVR却是不一样的。SVR认为:落在𝑓(𝑥)的𝜖邻域空间中的样本点不需要计算损失,这些都是预测正确的,其余的落在𝜖邻域空间以外的样本才需要计算损失。
作业:
(1)请详细阐述线性回归模型的最小二乘法表达。
(2)在线性回归模型中,极大似然估计与最小二乘估计有什么联系与区别?
(3)为什么多项式回归在实际问题中的表现经常不是很好?
(4)决策树模型与线性模型之间的联系与差别?
(5)什么是KKT条件?
(6)为什么要引入原问题的对偶问题?
(7)使用CH1机器学习数学基础所学的内容,找到一个具体的数据集,使用线性回归模型拟合模型,要求不能使用sklearn,只能使用python与numpy.(必做)
解答:
(1)最小二乘法:建立MSE损失函数,通过求L对X的导数,导数为0时得到最佳参数值。
损失函数:
参数:
(2)线性回归的最小二乘估计<==>噪声𝜖∽𝑁(0,𝜎2)的极大似然估计;区别是最小二乘法的角度是最小化预测与真实的偏差,极大似然估计是最大化事件发生概率。
(3)多项式回归可以处理相当一类非线性问题,任一函数都可以分段用多项式来逼近。但是,多项式回归的阶数太高后,边缘处置信区间会过大。此外,多项式回归容易过拟合,产生的模型往往与实际分布不符。
(4)决策树将特征空间划分为一系列简单的区域,用所属区域中训练集的平均数或者众数对其进行预测。所以每个小区域仍然可看作线性模型,但组合起来的整个向量空间就不是线性模型了。
(5)KKT条件(最优解的一阶必要条件):看不太懂,先把资料放在这。
(6)因为原问题与对偶问题就像是一个问题两个角度去看,如利润最大与成本最低等。有时侯原问题上难以解决,但是在对偶问题上就会变得很简单。再者,任何一个原问题在变成对偶问题后都会变成一个凸优化的问题。
(7)代码:
from sklearn import datasets # 调用sklearn的数据集
import numpy as np
boston = datasets.load_boston()
X = boston.data
Y = boston.target
x = np.matrix(X)
y = np.matrix(Y).T
w = (x.T*x).I * (x.T*y)
ypre = np.dot(x, w)
n = x.shape[0]
loss = np.dot((ypre - y).T, (ypre - y)) / n
print("参数w值为:", w)
print("最小二乘法误差为:", loss)
结果: