机器学习中的回归问题
本文从机器学习的基本概念引出解决回归问题的算法及具体流程,主要介绍包含线性回归、回归树和支持向量回归这三种算法。
1 机器学习的基本概念
1.1 回归案例
sklearn.datasets
封装有许多内置数据集,可用 load_datasetname()
方法加载一些小型机器学习数据集,而 fetch_datasetname()
方法可下载并载入一些大型数据集,另外若 return_X_y
参数设置为 True
则可返回分离的特征向量与因变量数据。
加载数据集后,sklearn
返回类似于字典的 Bunch 数据类型,包含的键值有:
-
data:特征 X X X 矩阵
-
target:因变量 y y y 向量
-
feature_names:特征名称
下面以 sklearn
内置数据集 Boston 房价数据集为例进行回归问题的分析:
# 引入相关科学计算包
import numpy as np
import pandas as pd
from sklearn import datasets
import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline
plt.style.use("ggplot")
# 加载数据
boston = datasets.load_boston()
X = boston.data # 特征向量
y = boston.target # 因变量
features = boston.feature_names # 特征名
# 组合为dataframe
boston_data = pd.DataFrame(X,columns=features)
boston_data["Price"] = y
boston_data.head()
Boston 房价数据集的各特征含义如下:
-
CRIM:各城镇的人均犯罪率
-
ZN:规划地段超过25,000平方英尺的住宅用地比例
-
INDUS:城镇非零售商业用地比例
-
CHAS:是否在查尔斯河边(=1是)
-
NOX:一氧化氮浓度(/千万分之一)
-
RM:每个住宅的平均房间数
-
AGE:1940年以前建造的自住房屋的比例
-
DIS:到波士顿五个就业中心的加权距离
-
RAD:放射状公路的可达性指数
-
TAX:全部价值的房产税率(/万美元)
-
PTRATIO:按城镇分配的学生与教师比例
-
B: 1000 ( B k − 0.63 ) 2 1000(B_k - 0.63)^2 1000(Bk−0.63)2 其中 B k B_k Bk 是每个城镇的黑人比例
-
LSTAT:较低地位人口
-
Price:房价
在进一步建立模型前,对该数据集进行探索性分析,观察因变量 y y y 与特征 NOX 间的关系:
# 绘制Price对NOX的散点图
sns.scatterplot(boston_data['NOX'],boston_data['Price'],color="r",alpha=0.6)
plt.title("Price~NOX")
plt.show()
由上图可知,因变量是连续的,属于回归问题,且 NOX 越低的位置,房价通常越高,这在一定程度上揭示了贫富差距的现实状况。
1.2 分类案例
以著名的 iris 数据集作为分类问题的研究案例,数据集各特征含义如下:
-
sepal length (cm):花萼长度(厘米)
-
sepal width (cm):花萼宽度(厘米)
-
petal length (cm):花瓣长度(厘米)
-
petal width (cm):花瓣宽度(厘米)
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()
下面对数据集进行可视化,可以看到每种不同的颜色和点的样式为一种类型的鸢尾花,共有三种不同类型的鸢尾花:
# 可视化特征
marker = ['s', 'x', 'o']
for index, c in enumerate(np.unique(y)):
plt.scatter(x=iris_data.loc[y==c, "sepal length (cm)"],
y=iris_data.loc[y==c, "sepal width (cm)"], alpha=0.8, label=c, marker=marker[c])
plt.xlabel("sepal length (cm)")
plt.ylabel("sepal width (cm)")
plt.legend()
plt.show()
由上图可知,其因变量是一个类别变量,因此通过特征预测鸢尾花类别的问题是一个分类问题。
1.3 无监督学习
sklearn
拥有一系列用于聚类的,生成特定数据结构数据的函数,主要包括四类,具体信息可参见官方文档中对 数据集加载工具 的介绍:
-
分类和聚类生成器
-
回归生成器
-
流形学习生成器
-
生成器分解
下面具体介绍两种用于聚类的生成器,make_moons
用于生成月牙型非凸集,make_blobs
用于生成符合各向同性的高斯分布的聚类数据,相较于 make_classification
对于中心和各簇的标准偏差提供了更好的控制。
make_moons
各参数含义为:
-
n_samples:为整数时代表生成的数据点总数,为二元元组时,分别代表两个月牙的数据点数
-
shuffle:是否打乱数据集
-
noise:添加的高斯噪声的标准差
-
random_state:随机种子值
# 生成包含2000个点的月牙型非凸集
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()
make_blobs
各参数含义为:
-
n_samples:为整数时代表生成的数据点总数(每个聚类平均分配),为数组时,分别代表每个聚类的数据点数
-
n_features:每个样本点的特征数
-
centers:生成的中心数或固定的中心位置,当n_features为整数,centers为None时,生成3个中心;当n_features为数组,centers必须为None或对应的中心位置数组
-
cluster_std:每个聚类的标准差
-
center_box:聚类随机生成时每个聚类的边界
-
shuffle:是否打乱数据集
-
random_state:随机种子值
-
return_centers:是否返回每个聚类的中心点
# 生成符合正态分布的聚类数据
x, y = datasets.make_blobs(n_samples=5000, n_features=2, centers=3)
for index,c in enumerate(np.unique(y)):
plt.scatter(x[y==c, 0], x[y==c, 1], s=7)
plt.show()
本系列主要介绍集成学习,无监督学习的具体算法不再介绍,后面仅考虑回归和分类问题。
2 使用sklearn构建完整的机器学习项目流程
一般来说,一个完整的机器学习项目分为以下步骤:
-
明确项目任务:回归/分类。
-
收集数据集并选择合适的特征。
-
选择度量模型性能的指标。
-
选择具体的模型并进行训练。
-
评估模型性能并优化模型。
-
对模型超参数进行调优。
前两个步骤可参见 1.1 1.1 1.1 和 1.2 1.2 1.2 的示例,下面主要介绍回归和分类问题的机器学习构建流程中建模所必需的第 3 3 3 步和第 4 4 4 步。
2.1 衡量模型性能的指标
sklearn中大部分评估指标是在 sklearn.metrics
模块 中实现的,详细介绍可参见官方文档中 模型评估 一节。
其中常用于衡量回归模型性能的指标有:
-
MSE均方误差: MSE ( y , y ^ ) = 1 n ∑ i = 0 n − 1 ( y i − y ^ i ) 2 . \text{MSE}(y, \hat{y}) = \dfrac{1}{n} \sum\limits_{i=0}^{n- 1} (y_i - \hat{y}_i)^2. MSE(y,y^)=n1i=0∑n−1(yi−y^i)2.
-
MAE平均绝对误差: MAE ( y , y ^ ) = 1 n ∑ i = 0 n − 1 ∣ y i − y ^ i ∣ \text{MAE}(y, \hat{y}) = \dfrac{1}{n} \sum\limits_{i=0}^{n-1} \left| y_i - \hat{y}_i \right| MAE(y,y^)=n1i=0∑n−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 - \dfrac{\sum\limits_{i=1}^{n} (y_i - \hat{y}_i)^2}{\sum\limits_{i=1}^{n} (y_i - \bar{y})^2} R2(y,y^)=1−i=1∑n(yi−yˉ)2i=1∑n(yi−y^i)2
-
解释方差得分: evs ( y , y ^ ) = 1 − Var ( y − y ^ ) Var ( y ) \text{evs}(y, \hat{y}) = 1 - \dfrac{\text{Var}( y - \hat{y})}{\text{Var}(y)} evs(y,y^)=1−Var(y)Var(y−</