学习目标:
- 学习机器学习理论知识、简单模型建模方法
学习内容:
概念
机器学习的一个重要的目标就是利用数学模型来理解数据,发现数据中的规律,用作数据的分析和预测。
分类:机器学习的任务可分为:有监督学习和无监督学习。
根据因变量的是否连续,有监督学习又分为回归和分类:
回归
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()
分类
from sklearn import datasets
iris = datasets.load_iris()
X = iris.data
y = iris.target
features = iris.feature_names
iris_data = pd.DataFrame(X,columns=features)
iris_data['target'] = y
iris_data.head()
无监督学习
# 生成月牙型非凸集
from sklearn import datasets
x, y = datasets.make_moons(n_samples=2000, shuffle=True,
noise=0.05, random_state=None)
for index,c in enumerate(np.unique(y)):
plt.scatter(x[y==c,0],x[y==c,1],s=7)
plt.show()
使用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()
- 选择度量模型性能的指标。
MSE均方误差: MSE(𝑦,𝑦̂ )=1𝑛samples∑𝑛samples−1𝑖=0(𝑦𝑖−𝑦̂ 𝑖)2.
MAE平均绝对误差: MAE(𝑦,𝑦̂ )=1𝑛samples∑𝑛samples−1𝑖=0||𝑦𝑖−𝑦̂ 𝑖||
𝑅2 决定系数: 𝑅2(𝑦,𝑦̂ )=1−∑𝑛𝑖=1(𝑦𝑖−𝑦̂ 𝑖)2∑𝑛𝑖=1(𝑦𝑖−𝑦¯)2
解释方差得分: 𝑒𝑥𝑝𝑙𝑎𝑖𝑛𝑒𝑑_𝑣𝑎𝑟𝑖𝑎𝑛𝑐𝑒(𝑦,𝑦̂ )=1−𝑉𝑎𝑟{𝑦−𝑦̂ }𝑉𝑎𝑟{𝑦}
- 选择具体的模型并进行训练以优化模型。
线性回归模型
回归这个概念是19世纪80年代由英国统计学家郎西斯.高尔顿在研究父子身高关系提出来的,他发现:在同一族群中,子代的平均身高介于父代的身高以及族群的平均身高之间。具体而言,高个子父亲的儿子的身高有低于其父亲身高的趋势,而矮个子父亲的儿子身高则有高于父亲的身高的趋势。也就是说,子代的身高有向族群平均身高"平均"的趋势,这就是统计学上"回归"的最初含义。回归分析是一种预测性的建模技术,它研究的是因变量(目标)和自变量(特征)之间的关系。这种技术通常用于预测分析,时间序列模型以及发现变量之间的因果关系。通常使用曲线/线来拟合数据点,目标是使曲线到数据点的距离差异最小。而线性回归就是回归问题中的一种,线性回归假设目标值与特征之间线性相关,即满足一个多元一次方程。通过构建损失函数,来求解损失函数最小时的参数w :
假设:数据集 𝐷={(𝑥1,𝑦1),…,(𝑥𝑁,𝑦𝑁)} , 𝑥𝑖∈𝑅𝑝,𝑦𝑖∈𝑅,𝑖=1,2,…,𝑁 , 𝑋=(𝑥1,𝑥2,…,𝑥𝑁)𝑇,𝑌=(𝑦1,𝑦2,…,𝑦𝑁)𝑇
假设X和Y之间存在线性关系,模型的具体形式为 𝑦̂ =𝑓(𝑤)=𝑤𝑇𝑥
jupyter
(a) 最小二乘估计:
我们需要衡量真实值 𝑦𝑖 与线性回归模型的预测值 𝑤𝑇𝑥𝑖 之间的差距,在这里我们和使用二范数的平方和L(w)来描述这种差距,即:
𝐿(𝑤)=∑𝑖=1𝑁||𝑤𝑇𝑥𝑖−𝑦𝑖||22=∑𝑖=1𝑁(𝑤𝑇𝑥𝑖−𝑦𝑖)2=(𝑤𝑇𝑋𝑇−𝑌𝑇)(𝑤𝑇𝑋𝑇−𝑌𝑇)𝑇=𝑤𝑇𝑋𝑇𝑋𝑤−2𝑤𝑇𝑋𝑇𝑌+𝑌𝑌𝑇因此,我们需要找到使得𝐿(𝑤)最小时对应的参数𝑤,即:𝑤̂ =𝑎𝑟𝑔𝑚𝑖𝑛𝐿(𝑤)为了达到求解最小化𝐿(𝑤)问题,我们应用高等数学的知识,使用求导来解决这个问题:∂𝐿(𝑤)∂𝑤=2𝑋𝑇𝑋𝑤−2𝑋𝑇𝑌=0,因此:𝑤̂ =(𝑋𝑇𝑋)−1𝑋𝑇𝑌
(b) 几何解释:
在线性代数中,我们知道两个向量a和b相互垂直可以得出: <𝑎,𝑏>=𝑎.𝑏=𝑎𝑇𝑏=0 ,而平面X的法向量为Y-Xw,与平面X互相垂直,因此: 𝑋𝑇(𝑌−𝑋𝑤)=0 ,即: 𝑤=(𝑋𝑇𝑋)−1𝑋𝑇𝑌
jupyter
© 概率视角:
假设噪声 𝜖∽𝑁(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阶多项式拟合曲线的置信区间(虚线表示置信区间)明显增大,预测效果的稳定性下降。)
jupyterjupyter
(b) 广义可加模型(GAM):
广义可加模型GAM实际上是线性模型推广至非线性模型的一个框架,在这个框架中,每一个变量都用一个非线性函数来代替,但是模型本身保持整体可加性。GAM模型不仅仅可以用在线性回归的推广,还可以将线性分类模型进行推广。具体的推广形式是:
标准的线性回归模型:
𝑦𝑖=𝑤0+𝑤1𝑥𝑖1+…+𝑤𝑝𝑥𝑖𝑝+𝜖𝑖
GAM模型框架:
𝑦𝑖=𝑤0+∑𝑗=1𝑝𝑓𝑗(𝑥𝑖𝑗)+𝜖𝑖
GAM模型的优点与不足:
优点:简单容易操作,能够很自然地推广线性回归模型至非线性模型,使得模型的预测精度有所上升;由于模型本身是可加的,因此GAM还是能像线性回归模型一样把其他因素控制不变的情况下单独对某个变量进行推断,极大地保留了线性回归的易于推断的性质。
缺点:GAM模型会经常忽略一些有意义的交互作用,比如某两个特征共同影响因变量,不过GAM还是能像线性回归一样加入交互项 𝑥(𝑖)×𝑥(𝑗) 的形式进行建模;但是GAM模型本质上还是一个可加模型,如果我们能摆脱可加性模型形式,可能还会提升模型预测精度,详情请看后面的算法。
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))
回归树:
基于树的回归方法主要是依据分层和分割的方式将特征空间划分为一系列简单的区域。对某个给定的待预测的自变量,用他所属区域中训练集的平均数或者众数对其进行预测。由于划分特征空间的分裂规则可以用树的形式进行概括,因此这类方法称为决策树方法。决策树由结点(node)和有向边(diredcted edge)组成。结点有两种类型:内部结点(internal node)和叶结点(leaf node)。内部结点表示一个特征或属性,叶结点表示一个类别或者某个值。区域 𝑅1,𝑅2 等称为叶节点,将特征空间分开的点为内部节点。
jupyter
建立回归树的过程大致可以分为以下两步:
将自变量的特征空间(即 𝑥(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𝐽𝑐̂ 𝑚𝐼(𝑥∈𝑅𝑚)
如以下生成的关于运动员在棒球大联