机器学习基础(二)

**

使用sklearn构建完整的机器学习项目流程

**
一般来说,一个完整的机器学习项目分为以下步骤:

  • 明确项目任务:回归/分类
  • 收集数据集并选择合适的特征
  • 选择度量模型性能的指标
  • 选择具体的模型并进行训练以优化模型
  • 评估模型的性能并调参

使用sklearn构建完整的回归项目
(1) 收集数据集并选择合适的特征:
在数据集上我们使用我们比较熟悉的Boston房价数据集,原因是:

第一个,我们通过这些简单的数据集快速让我们上手sklearn,以及掌握sklearn的相关操作。
第二个,我们用简单的数据集能更加清晰地介绍机器学习的相关模型,避免在处理数据上花费较大的精力。

from sklearn import datasets
boston = datasets.load_boston()     # 返回一个类似于字典的类
X = boston.data
y = boston.target
features = boston.feature_names
boston_data = pd.DataFrame(X,columns=features)
boston_data["Price"] = y
boston_data.head()

(2) 选择度量模型性能的指标:

MSE均方误差:MSE(𝑦,𝑦̂ )=1𝑛samples∑𝑛samples−1𝑖=0(𝑦𝑖−𝑦̂ 𝑖)2.
MAE平均绝对误差:MAE(𝑦,𝑦̂ )=1𝑛samples∑𝑛samples−1𝑖=0||𝑦𝑖−𝑦̂ 𝑖||
𝑅2决定系数:𝑅2(𝑦,𝑦̂ )=1−∑𝑛𝑖=1(𝑦𝑖−𝑦̂ 𝑖)2∑𝑛𝑖=1(𝑦𝑖−𝑦¯)2
解释方差得分:𝑒𝑥𝑝𝑙𝑎𝑖𝑛𝑒𝑑_𝑣𝑎𝑟𝑖𝑎𝑛𝑐𝑒(𝑦,𝑦̂ )=1−𝑉𝑎𝑟{𝑦−𝑦̂ }𝑉𝑎𝑟{𝑦}
(3) 选择具体的模型并进行训练

  • 线性回归模型

回归这个概念是19世纪80年代由英国统计学家郎西斯.高尔顿在研究父子身高关系提出来的,他发现:在同一族群中,子代的平均身高介于父代的身高以及族群的平均身高之间。具体而言,高个子父亲的儿子的身高有低于其父亲身高的趋势,而矮个子父亲的儿子身高则有高于父亲的身高的趋势。也就是说,子代的身高有向族群平均身高"平均"的趋势,这就是统计学上"回归"的最初含义。回归分析是一种预测性的建模技术,它研究的是因变量(目标)和自变量(特征)之间的关系。这种技术通常用于预测分析,时间序列模型以及发现变量之间的因果关系。通常使用曲线/线来拟合数据点,目标是使曲线到数据点的距离差异最小。而线性回归就是回归问题中的一种,线性回归假设目标值与特征之间线性相关,即满足一个多元一次方程。通过构建损失函数,来求解损失函数最小时的参数w :
假设:数据集 𝐷={(𝑥1,𝑦1),…,(𝑥𝑁,𝑦𝑁)} , 𝑥𝑖∈𝑅𝑝,𝑦𝑖∈𝑅,𝑖=1,2,…,𝑁 , 𝑋=(𝑥1,𝑥2,…,𝑥𝑁)𝑇,𝑌=(𝑦1,𝑦2,…,𝑦𝑁)𝑇
假设X和Y之间存在线性关系,模型的具体形式为 𝑦̂ =𝑓(𝑤)=𝑤𝑇𝑥

(a) 最小二乘估计:
我们需要衡量真实值 𝑦𝑖 与线性回归模型的预测值 𝑤𝑇𝑥𝑖 之间的差距,在这里我们和使用二范数的平方和L(w)来描述这种差距,即:
𝐿(𝑤)=∑𝑖=1𝑁||𝑤𝑇𝑥𝑖−𝑦𝑖||22=∑𝑖=1𝑁(𝑤𝑇𝑥𝑖−𝑦𝑖)2=(𝑤𝑇𝑋𝑇−𝑌𝑇)(𝑤𝑇𝑋𝑇−𝑌𝑇)𝑇=𝑤𝑇𝑋𝑇𝑋𝑤−2𝑤𝑇𝑋𝑇𝑌+𝑌𝑌𝑇因此,我们需要找到使得𝐿(𝑤)最小时对应的参数𝑤,即:𝑤̂ =𝑎𝑟𝑔𝑚𝑖𝑛𝐿(𝑤)为了达到求解最小化𝐿(𝑤)问题,我们应用高等数学的知识,使用求导来解决这个问题:∂𝐿(𝑤)∂𝑤=2𝑋𝑇𝑋𝑤−2𝑋𝑇𝑌=0,因此:𝑤̂ =(𝑋𝑇𝑋)−1𝑋𝑇𝑌

(b) 几何解释:
在线性代数中,我们知道两个向量a和b相互垂直可以得出: <𝑎,𝑏>=𝑎.𝑏=𝑎𝑇𝑏=0 ,而平面X的法向量为Y-Xw,与平面X互相垂直,因此: 𝑋𝑇(𝑌−𝑋𝑤)=0 ,即: 𝑤=(𝑋𝑇𝑋)−1𝑋𝑇𝑌
© 概率视角:
假设噪声𝜖∽𝑁(0,𝜎2),𝑦=𝑓(𝑤)+𝜖=𝑤𝑇𝑥+𝜖,因此:𝑦|𝑥𝑖,𝑤 𝑁(𝑤𝑇𝑥,𝜎2)
我们使用极大似然估计MLE对参数w进行估计:
𝐿(𝑤)=𝑙𝑜𝑔𝑃(𝑌|𝑋;𝑤)=𝑙𝑜𝑔∏𝑖=1𝑁𝑃(𝑦𝑖|𝑥𝑖;𝑤)=∑𝑖=1𝑁𝑙𝑜𝑔𝑃(𝑦𝑖|𝑥𝑖;𝑤)=∑𝑖=1𝑁𝑙𝑜𝑔(12𝜋𝜎⎯⎯⎯⎯⎯⎯√𝑒𝑥𝑝(−(𝑦𝑖−𝑤𝑇𝑥𝑖)22𝜎2))=∑𝑖=1𝑁[𝑙𝑜𝑔(12𝜋⎯⎯⎯⎯√𝜎)−12𝜎2(𝑦𝑖−𝑤𝑇𝑥𝑖)2]𝑎𝑟𝑔𝑚𝑎𝑥𝑤𝐿(𝑤)=𝑎𝑟𝑔𝑚𝑖𝑛𝑤[𝑙(𝑤)=∑𝑖=1𝑁(𝑦𝑖−𝑤𝑇𝑥𝑖)2]因此:线性回归的最小二乘估计<==>噪声𝜖∽𝑁(0,𝜎2)的极大似然估计

from sklearn import linear_model      # 引入线性回归方法
lin_reg = linear_model.LinearRegression()       # 创建线性回归的类
lin_reg.fit(X,y)        # 输入特征X和因变量y进行训练
print("模型系数:",lin_reg.coef_)             # 输出模型的系数
print("模型得分:",lin_reg.score(X,y))    # 输出模型的决定系数R^2
  • 线性回归的推广

在线性回归中,我们假设因变量与特征之间的关系是线性关系,这样的假设使得模型很简单,但是缺点也是显然的,那就是当数据存在非线性关系时,我们使用线性回归模型进行预测会导致预测性能极其低下,因为模型的形式本身是线性的,无法表达数据中的非线性关系。我们一个很自然的想法就是去推广线性回归模型,使得推广后的模型更能表达非线性的关系。

(a) 多项式回归:
为了体现因变量和特征的非线性关系,一个很自然而然的想法就是将标准的线性回归模型:
𝑦𝑖=𝑤0+𝑤1𝑥𝑖+𝜖𝑖

换成一个多项式函数:
𝑦𝑖=𝑤0+𝑤1𝑥𝑖+𝑤2𝑥2𝑖+…+𝑤𝑑𝑥𝑑𝑖+𝜖

对于多项式的阶数d不能取过大,一般不大于3或者4,因为d越大,多项式曲线就会越光滑,在X的边界处有异常的波动。(图中的边界处的4阶多项式拟合曲线的置信区间(虚线表示置信区间)明显增大,预测效果的稳定性下降。)

(b) 广义可加模型(GAM):
广义可加模型GAM实际上是线性模型推广至非线性模型的一个框架,在这个框架中,每一个变量都用一个非线性函数来代替,但是模型本身保持整体可加性。GAM模型不仅仅可以用在线性回归的推广,还可以将线性分类模型进行推广。具体的推广形式是:
标准的线性回归模型:
𝑦𝑖=𝑤0+𝑤1𝑥𝑖1+…+𝑤𝑝𝑥𝑖𝑝+𝜖𝑖

GAM模型框架:
𝑦𝑖=𝑤0+∑𝑗=1𝑝𝑓𝑗(𝑥𝑖𝑗)+𝜖𝑖

GAM模型的优点与不足:

优点:简单容易操作,能够很自然地推广线性回归模型至非线性模型,使得模型的预测精度有所上升;由于模型本身是可加的,因此GAM还是能像线性回归模型一样把其他因素控制不变的情况下单独对某个变量进行推断,极大地保留了线性回归的易于推断的性质。
缺点:GAM模型会经常忽略一些有意义的交互作用,比如某两个特征共同影响因变量,不过GAM还是能像线性回归一样加入交互项 𝑥(𝑖)×𝑥(𝑗) 的形式进行建模;但是GAM模型本质上还是一个可加模型,如果我们能摆脱可加性模型形式,可能还会提升模型预测精度,详情请看后面的算法。
(a) 多项式回归实例介绍:

from sklearn.preprocessing import PolynomialFeatures
X_arr = np.arange(6).reshape(3, 2)
print("原始X为:\n",X_arr)

poly = PolynomialFeatures(2)
print("2次转化X:\n",poly.fit_transform(X_arr))

poly = PolynomialFeatures(interaction_only=True)
print("2次转化X:\n",poly.fit_transform(X_arr))

(b) GAM模型实例介绍:
安装pygam:pip install pygam

from pygam import LinearGAM
gam = LinearGAM().fit(boston_data[boston.feature_names], y)
gam.summary()
  • 回归树:

基于树的回归方法主要是依据分层和分割的方式将特征空间划分为一系列简单的区域。对某个给定的待预测的自变量,用他所属区域中训练集的平均数或者众数对其进行预测。由于划分特征空间的分裂规则可以用树的形式进行概括,因此这类方法称为决策树方法。决策树由结点(node)和有向边(diredcted edge)组成。结点有两种类型:内部结点(internal node)和叶结点(leaf node)。内部结点表示一个特征或属性,叶结点表示一个类别或者某个值。区域 𝑅1,𝑅2 等称为叶节点,将特征空间分开的点为内部节点。
建立回归树的过程大致可以分为以下两步:
将自变量的特征空间(即 𝑥(1),𝑥(2),𝑥(3),…,𝑥(𝑝) )的可能取值构成的集合分割成J个互不重叠的区域 𝑅1,𝑅2,…,𝑅𝑗 。
对落入区域 𝑅𝑗 的每个观测值作相同的预测,预测值等于 𝑅𝑗 上训练集的因变量的简单算术平均。
具体来说,就是:
a. 选择最优切分特征j以及该特征上的最优点s:
遍历特征j以及固定j后遍历切分点s,选择使得下式最小的(j,s) 𝑚𝑖𝑛𝑗,𝑠[𝑚𝑖𝑛𝑐1∑𝑥𝑖∈𝑅1(𝑗,𝑠)(𝑦𝑖−𝑐1)2+𝑚𝑖𝑛𝑐2∑𝑥𝑖∈𝑅2(𝑗,𝑠)(𝑦𝑖−𝑐2)2]
b. 按照(j,s)分裂特征空间: 𝑅1(𝑗,𝑠)={𝑥|𝑥𝑗≤𝑠}和𝑅2(𝑗,𝑠)={𝑥|𝑥𝑗>𝑠},𝑐̂ 𝑚=1𝑁𝑚∑𝑥∈𝑅𝑚(𝑗,𝑠)𝑦𝑖,𝑚=1,2
c. 继续调用步骤1,2直到满足停止条件,就是每个区域的样本数小于等于5。
d. 将特征空间划分为J个不同的区域,生成回归树: 𝑓(𝑥)=∑𝑚=1𝐽𝑐̂ 𝑚𝐼(𝑥∈𝑅𝑚)

from sklearn.tree import DecisionTreeRegressor    
reg_tree = DecisionTreeRegressor(criterion = "mse",min_samples_leaf = 5)
reg_tree.fit(X,y)
reg_tree.score(X,y)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值