机器学习与集成学习学习记录

集成学习上

第一章:机器学习基础

1 机器学习的三大主要任务

2 回归问题

3 基本的回归模型

4 使用sklearn构建完整的分类项目

5 模型性能评估和调参

第一章:机器学习基础
1 机器学习的三大主要任务
机器学习的一个重要的目标就是利用数学模型来理解数据,发现数据中的规律,用作数据的分析和预测。数据通常由一组向量组成,这组向量中的每个向量都是一个样本,我们用 𝑥𝑖 来表示一个样本,其中 𝑖=1,2,3,…,𝑁i=1,2,3,…,N ,共N个样本,每个样本 𝑥𝑖=(𝑥𝑖1,𝑥𝑖2,…,𝑥𝑖𝑝,𝑦𝑖),共p+1个维度,前p个维度的每个维度我们称为一个特征,最后一个维度 𝑦𝑖yi 我们称为因变量(响应变量)。特征用来描述影响因变量的因素,如:我们要探寻身高是否会影响体重的关系的时候,身高就是一个特征,体重就是一个因变量。通常在一个数据表dataframe里面,一行表示一个样本 𝑥𝑖,一列表示一个特征。
根据数据是否有因变量,机器学习的任务可分为:有监督学习和无监督学习

有监督学习:给定某些特征去估计因变量,即因变量存在的时候,我们称这个机器学习任务为有监督学习。如:我们使用房间面积,房屋所在地区,环境等级等因素去预测某个地区的房价。
无监督学习:给定某些特征但不给定因变量,建模的目的是学习数据本身的结构和关系。如:我们给定某电商用户的基本信息和消费记录,通过观察数据中的哪些类型的用户彼此间的行为和属性类似,形成一个客群。

而根据因变量的是否连续,有监督学习又分为回归和分类

回归:因变量是连续型变量,如:房价,体重等。
分类:因变量是离散型变量,如:是否患癌症,西瓜是好瓜还是坏瓜等。

2 回归问题
2.1 线性回归模型
线性回归就是回归问题中的一种,线性回归假设目标值与特征之间线性相关,即满足一个多元一次方程。通过构建损失函数,来求解损失函数最小时的参数w :
假设:数据集 𝐷={(𝑥1,𝑦1),…,(𝑥𝑁,𝑦𝑁)} 𝑥𝑖∈𝑅𝑝,𝑦𝑖∈𝑅,𝑖=1,2,…,𝑁
𝑋=(𝑥1,𝑥2,…,𝑥𝑁)^𝑇,
𝑌=(𝑦1,𝑦2,…,𝑦𝑁)^𝑇,
假设X和Y之间存在线性关系,模型的具体形式为 𝑦̂ =f(w)=w^Tx
采用最小二乘估计估计w:
我们需要衡量真实值 𝑦𝑖 与线性回归模型的预测值 𝑤^𝑇𝑥𝑖 之间的差距,在这里我们和使用二范数的平方和L(w)来描述这种差距,即:
在这里插入图片描述
对w求导后得在这里插入图片描述
使用sklearn的线性回归实例

from sklearn import datasets
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
# 载入波士顿房价数据库
bostondata=datasets.load_boston()
X=bostondata.data
Y=bostondata.target

#划分测试集和训练集
x_train,x_test,y_train,y_test=train_test_split(X,Y,test_size=0.2)
LR=LinearRegression()
LR.fit(x_train,y_train)
print ('系数',LR.coef_)
print ('截距',LR.intercept_)
print ('测试集得分',LR.score(x_test,y_test))
print ('训练集得分',LR.score(x_train,y_train))
y_pred=LR.predict(x_test)
plt.scatter(y_test,y_pred,c='r',marker='o')
plt.scatter(y_test,y_test,c='g',marker='+')
plt.show()

2.2 线性回归的推广
在线性回归中,我们假设因变量与特征之间的关系是线性关系,这样的假设使得模型很简单,但是缺点也是显然的,那就是当数据存在非线性关系时,我们使用线性回归模型进行预测会导致预测性能极其低下,因为模型的形式本身是线性的,无法表达数据中的非线性关系。我们一个很自然的想法就是去推广线性回归模型,使得推广后的模型更能表达非线性的关系。
(a) 多项式回归:
为了体现因变量和特征的非线性关系,一个很自然而然的想法就是将标准的线性回归模型换成一个多项式函数:
在这里插入图片描述
对于多项式的阶数d不能取过大,一般不大于3或者4,因为d越大,多项式曲线就会越光滑,在X的边界处有异常的波动。

(b) 广义可加模型(GAM):
广义可加模型GAM实际上是线性模型推广至非线性模型的一个框架,在这个框架中,每一个变量都用一个非线性函数来代替,但是模型本身保持整体可加性。GAM模型不仅仅可以用在线性回归的推广,还可以将线性分类模型进行推广。具体的推广形式是:
在这里插入图片描述
求解回归问题中的GAM:
1 限定fj 为样条基函数时,很容易使用最小二乘法求得解析解。
2 限定 fj 为回归树函数时,使用gradient boost和back-fitting进行迭代求解。

GAM模型实例:

from pygam import LinearGAM
gam = LinearGAM().fit(boston_data[boston.feature_names], y)
gam.summary()

GAM模型的优点与不足:

优点:简单容易操作,能够很自然地推广线性回归模型至非线性模型,使得模型的预测精度有所上升;由于模型本身是可加的,因此GAM还是能像线性回归模型一样把其他因素控制不变的情况下单独对某个变量进行推断,极大地保留了线性回归的易于推断的性质。

缺点:GAM模型会经常忽略一些有意义的交互作用,比如某两个特征共同影响因变量,不过GAM还是能像线性回归一样加入交互项 𝑥(𝑖)×𝑥(𝑗)的形式进行建模;但是GAM模型本质上还是一个可加模型,如果我们能摆脱可加性模型形式,可能还会提升模型预测精度,详情请看后面的算法。
2.3 回归树
基于树的回归方法主要是依据分层和分割的方式将特征空间划分为一系列简单的区域。对某个给定的待预测的自变量,用他所属区域中训练集的平均数或者众数对其进行预测。由于划分特征空间的分裂规则可以用树的形式进行概括,因此这类方法称为决策树方法。决策树由结点(node)和有向边(diredcted edge)组成。结点有两种类型:内部结点(internal node)和叶结点(leaf node)。内部结点表示一个特征或属性,叶结点表示一个类别或者某个值。区域 𝑅1,𝑅2 等称为叶节点,将特征空间分开的点为内部节点

建立回归树的过程大致可以分为以下两步:
1 将自变量的特征空间(即 𝑥(1),𝑥(2),𝑥(3),…,𝑥(𝑝)的可能取值构成的集合分割成J个互不重叠的区域 𝑅1,𝑅2,…,𝑅𝑗 。
2 对落入区域 𝑅𝑗Rj 的每个观测值作相同的预测,预测值等于 𝑅𝑗Rj 上训练集的因变量的简单算术平均。

即采用的是启发式的方法。假如有n个特征,每个特征有 s i (i∈(1,n))个取值,那我们遍历所有特征,尝试该特征所有取值,对空间进行划分,直到取到特征j的取值s,使得损失函数最小,这样就得到了一个划分点。

回归树与线性模型的比较:
线性模型的模型形式与树模型的模型形式有着本质的区别,具体而言,线性回归对模型形式做了如下假定:在这里插入图片描述

而回归树则是
在这里插入图片描述

如果特征变量与因变量的关系能很好的用线性关系来表达,那么线性回归通常有着不错的预测效果,拟合效果则优于不能揭示线性结构的回归树。反之,如果特征变量与因变量的关系呈现高度复杂的非线性,那么树方法比传统方法更优。

树模型的优缺点:
树模型的解释性强,在解释性方面可能比线性回归还要方便。
树模型更接近人的决策方式。
树模型可以用图来表示,非专业人士也可以轻松解读。
树模型可以直接做定性的特征而不需要像线性回归一样哑元化。
树模型能很好处理缺失值和异常值,对异常值不敏感,但是这个对线性模型来说却是致命的。
树模型的预测准确性一般无法达到其他回归模型的水平,但是改进的方法很多。

回归树总体流程类似于分类树,分枝时穷举每一个特征的每一个阈值,来寻找最优切分特征j和最优切分点s,衡量的方法是平方误差最小化。分枝直到达到预设的终止条件(如叶子个数上限)就停止。
在这里插入图片描述

sklearn使用回归树的实例:

import numpy as np
import matplotlib.pyplot as plt
from sklearn.tree import DecisionTreeRegressor
from sklearn import linear_model

# Data set
x = np.array(list(range(1, 11))).reshape(-1, 1)
y = np.array([5.56, 5.70, 5.91, 6.40, 6.80, 7.05, 8.90, 8.70, 9.00, 9.05]).ravel()

# Fit regression model
model1 = DecisionTreeRegressor(max_depth=1)
model2 = DecisionTreeRegressor(max_depth=3)
model3 = linear_model.LinearRegression()
model1.fit(x, y)
model2.fit(x, y)
model3.fit(x, y)

# Predict
X_test = np.arange(0.0, 10.0, 0.01)[:, np.newaxis]
# print(X_test)
y_1 = model1.predict(X_test)
print(y_1.shape)
y_2 = model2.predict(X_test)
y_3 = model3.predict(X_test)

# Plot the results
plt.figure()
plt.scatter(x, y, s=20, edgecolor="black",
            c="darkorange", label="data")
plt.plot(X_test, y_1, color="cornflowerblue",
         label="max_depth=1", linewidth=2)
plt.plot(X_test, y_2, color="yellowgreen", label="max_depth=3", linewidth=2)
plt.plot(X_test, y_3, color='red', label='liner regression', linewidth=2)
plt.xlabel("data")
plt.ylabel("target")
plt.title("Decision Tree Regression")
plt.legend()
plt.show()

2.4支持向量机回归(SVR)
SVM是要使到超平面最近的样本点的“距离”最大;
SVR则是要使到超平面最远的样本点的“距离”最小。
在这里插入图片描述

在线性回归的理论中,每个样本点都要计算平方损失,但是SVR却是不一样的。SVR认为:落在 𝑓(𝑥) 的 𝜖 邻域空间中的样本点不需要计算损失,这些都是预测正确的,其余的落在 𝜖 邻域空间以外的样本才需要计算损失,因此SVR问题可形式化为:
在这里插入图片描述
引入松弛变量 ξ i 和 ( ξ i ),可将式重写为:
在这里插入图片描述
引入拉格朗日乘子 μi 和αi:
在这里插入图片描述
再对w,b, ξ i 和 ( ξ i )求导可得:
w=∑(1,m)(α^-α)x
0=∑(1,m)(α^-α)
C=α+μ
C=α^ +μ^
SVR的解形如:
在这里插入图片描述
若考虑特征映射形式,则:
f(x)=∑(1,m)(α^-α)k(x,x(i))+b
其中k(x,x(i))为核函数

sklearn中使用SVR实例:

from sklearn.svm import SVR
from sklearn.preprocessing import StandardScaler     # 标准化数据
from sklearn.pipeline import make_pipeline   # 使用管道,把预处理和模型形成一个流程

reg_svr = make_pipeline(StandardScaler(), SVR(C=1.0, epsilon=0.2))
reg_svr.fit(X, y)
reg_svr.score(X,y)

2.5 拉格朗日对偶问题
(1)构造拉格朗日函数
1 引入KKT乘子 μj ( μj ≥ 0),把不等式约束条件转化为等式约束条件。
2 引入拉格朗日乘子 λk ,把等式约束转化为无约束优化问题
在这里插入图片描述
(2)定义拉格朗日对偶函数为拉格朗日函数,并把 λ,μ当作常数,关于x取最小值,即:
在这里插入图片描述
(3)求满足原问题约束下的最优解f*
在这里插入图片描述
故g(λ,μ)是原问题最优解的下界,所有通过找到其最大的下界,从而确定拉格朗日对偶问题为:max g(λ,μ ),μ>=0
原问题的关于x的最小化转化为了对偶问题关于λ,μ的最大化。

3 基本的回归模型

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值