背景
本章通过简单的实例来完成正常情况下我们需要完成一个机器学习项目需要进行哪些步骤。
一般情况下,一个完整的机器学习项目分为以下步骤:
- 获取数据集
- 数据清洗
- 特征工程(简单来说就是选择合适的特征)
- 选择模型训练
- 选择度量模型性能的指标并评估模型
- 模型调参优化。
在这些步骤中,我们大部分的时间都是在花在数据清洗上,但是本章的目的是为了了解机器学习的步骤,所以采用了干净的数据集——波士顿房价。
构建流程
由上一篇文章,我们已经知道波士顿房价的预测问题是回归问题,因此我们此次选择线性模型进行拟合。
获取数据集
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
回归的评价指标
- MSE均方误差: MSE ( y , y ^ ) = 1 n samples ∑ i = 0 n samples − 1 ( y i − y ^ i ) 2 . \text{MSE}(y, \hat{y}) = \frac{1}{n_\text{samples}} \sum_{i=0}^{n_\text{samples} - 1} (y_i - \hat{y}_i)^2. MSE(y,y^)=nsamples1∑i=0nsamples−1(yi−y^i)2.
- MAE平均绝对误差: MAE ( y , y ^ ) = 1 n samples ∑ i = 0 n samples − 1 ∣ y i − y ^ i ∣ \text{MAE}(y, \hat{y}) = \frac{1}{n_{\text{samples}}} \sum_{i=0}^{n_{\text{samples}}-1} \left| y_i - \hat{y}_i \right| MAE(y,y^)=nsamples1∑i=0nsamples−1∣yi−y^i∣
- R 2 R^2 R2决定系数: R 2 ( y , y ^ ) = 1 − ∑ i = 1 n ( y i − y ^ i ) 2 ∑ i = 1 n ( y i − y ˉ ) 2 R^2(y, \hat{y}) = 1 - \frac{\sum_{i=1}^{n} (y_i - \hat{y}_i)^2}{\sum_{i=1}^{n} (y_i - \bar{y})^2} R2(y,y^)=1−∑i=1n(yi−yˉ)2∑i=1n(yi−y^i)2
- 解释方差得分:
e
x
p
l
a
i
n
e
d
_
v
a
r
i
a
n
c
e
(
y
,
y
^
)
=
1
−
V
a
r
{
y
−
y
^
}
V
a
r
{
y
}
explained\_{}variance(y, \hat{y}) = 1 - \frac{Var\{ y - \hat{y}\}}{Var\{y\}}
explained_variance(y,y^)=1−Var{y}Var{y−y^}
对于回归问题,我们最常使用的是MSE这个指标。
模型的选择
线性回归
我们采用最简单的线性回归模型进行训练。
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
## 0.74
可以从代码看出短短几行,就构建一个线性回归模型,相同的,如果需要更换其他的模型,只需要更换模型的函数名字。
下面我们从最小二乘法的角度、矩阵的视角理解线性回归(由于编写公式有点耗时,故采用手写的方法进行编辑):
上面的假设是从只有一个特征引用到矩阵表示的,这样相对而言会更加地清晰。
线性回归的进一步优化推广
在线性回归中,我们假设因变量与特征之间的关系是线性关系,这样的假设使得模型很简单,但是缺点也是显然的,那就是当数据存在非线性关系时,我们使用线性回归模型进行预测会导致预测性能极其低下,因为模型的形式本身是线性的,无法表达数据中的非线性关系。我们一个很自然的想法就是去推广线性回归模型,使得推广后的模型更能表达非线性的关系。
多项式回归:
为了体现因变量和特征的非线性关系,一个很自然而然的想法就是将标准的线性回归模型
广义可加模型(GAM):
广义可加模型GAM实际上是线性模型推广至非线性模型的一个框架,在这个框架中,每一个变量都用一个非线性函数来代替,但是模型本身保持整体可加性。GAM模型不仅仅可以用在线性回归的推广,还可以将线性分类模型进行推广。
广义可加模型的致命缺点在于只有可加性,这样就会忽略交互项的影响,所以模型精度想要进一步的提升,需要加入交互项。
回归树
决策树模型的介绍可以详细看这篇文章——用python和matlab实现决策树。
下面我们采用回归树对房价进行预测:
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.94
总结
本章的目的是为了了解完整机器学习的项目需要进行哪些步骤,并且对两个算法进行了简单的解释。