集成学习(1)- 导论

首先明确一下为什么要进行集成学习的系统学习。
我们先从机器学习说起。什么是机器学习?一言以蔽之,即一种算法。何谓算法?即通过有限的步骤解决一个问题的方法。而机器学习是一种什么样的算法呢?与其他算法不同,机器学习是通过数据来解决问题。通过学习数据中暗含的规律来预测或者分类是机器学习要解决的主要问题。
如今,机器学习算法常被人们拿过来解决一些业内知名或者时间长久的老大难问题。一些问题也常被拿来作为一些比赛项目。机器学习内部也分为很多种模型,大家耳熟能详的有KNN、随机森林、支持向量机以及高大上的深度学习等。经常参加数据竞赛的小伙伴可能知道,成绩比较好排名靠前的选手大部分的时候选择的模型都是Xgboost或者LightGBM等。这些就是典型的集成算法。为了能够在比赛中获得好的名次,我们非常有必要对集成学习进行系统的梳理。
准确的来说,boost是一种集成算法框架,而不能将其简单归为一种算法。其目的是对多个算法模型进行融合以提高融合后的模型准确率。但其不足之处就是模型的训练过程可能比较复杂,效率不是很高。
目前比较流行的集成学习主要有2种:基于Boosting的和基于Bagging,前者的代表算法有Adaboost、GBDT、XGBOOST、后者的代表算法主要是随机森林。两者的主要区别是在训练过程中。Bagging在训练时,各个预测函数可以并行生成;而Boosting的各个预测函数只能顺序生成,因为后一个模型参数需要前一轮模型的结果。

本期是一个入门导论学习,主要是熟悉一下机器学习解决的两大类问题:有监督学习和无监督学习

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

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

  • 回归:因变量是连续型变量,如:房价,体重等。
  • 分类:因变量是离散型变量,如:是否患癌症,西瓜是好瓜还是坏瓜等。
    分类回归和聚类,并使用sklearn举例,在Jupyter Notebook中进行演示。

无监督学习主要算法是聚类,聚类目的在于把相似的东西聚在一起,主要通过计算样本间和群体间距离得到,主要算法包括Kmeans、层次聚类、EM算法。

下面我们就使用sklearn工具库来探索机器学习项目,并分别就分类、回归、和聚类来分别演示这几个具体的概念:

首先是导入必要的工具包,并打印版本,确认开发环境:

# 引入相关科学计算包
import numpy as np
import pandas as pd
import matplotlib as mpl
import seaborn as sns
import matplotlib.pyplot as plt

%matplotlib inline 
plt.style.use("ggplot")      

for mod in np,pd,mpl,sns:
    print(mod.__name__, mod.__version__)
>>>
numpy 1.18.5
pandas 1.2.0
matplotlib 3.2.2
seaborn 0.10.1

1. 回归问题

使用sklearn自带的Bosten房价预测数据集。sklearn中所有内置数据集都封装在datasets对象内:
返回的对象有:

  • data:特征X的矩阵(ndarray)
  • target:因变量的向量(ndarray)
  • feature_names:特征名称(ndarray)
    我们导入后打印前五行查看:
from sklearn import datasets
boston = datasets.load_boston()
print('first 5 rows of X:')
print(boston.data[:5])
print('first 5 Y:')
print(boston.target[:5])
print('All features name:')
print(boston.feature_names)
>>>
first 5 rows of X:
[[6.3200e-03 1.8000e+01 2.3100e+00 0.0000e+00 5.3800e-01 6.5750e+00
  6.5200e+01 4.0900e+00 1.0000e+00 2.9600e+02 1.5300e+01 3.9690e+02
  4.9800e+00]
 [2.7310e-02 0.0000e+00 7.0700e+00 0.0000e+00 4.6900e-01 6.4210e+00
  7.8900e+01 4.9671e+00 2.0000e+00 2.4200e+02 1.7800e+01 3.9690e+02
  9.1400e+00]
 [2.7290e-02 0.0000e+00 7.0700e+00 0.0000e+00 4.6900e-01 7.1850e+00
  6.1100e+01 4.9671e+00 2.0000e+00 2.4200e+02 1.7800e+01 3.9283e+02
  4.0300e+00]
 [3.2370e-02 0.0000e+00 2.1800e+00 0.0000e+00 4.5800e-01 6.9980e+00
  4.5800e+01 6.0622e+00 3.0000e+00 2.2200e+02 1.8700e+01 3.9463e+02
  2.9400e+00]
 [6.9050e-02 0.0000e+00 2.1800e+00 0.0000e+00 4.5800e-01 7.1470e+00
  5.4200e+01 6.0622e+00 3.0000e+00 2.2200e+02 1.8700e+01 3.9690e+02
  5.3300e+00]]
first 5 Y:
[24.  21.6 34.7 33.4 36.2]
All features name:
['CRIM' 'ZN' 'INDUS' 'CHAS' 'NOX' 'RM' 'AGE' 'DIS' 'RAD' 'TAX' 'PTRATIO'
 'B' 'LSTAT']

下面将数据X,y,以及feature names合并成DataFrame,以便调用pandas以及matplot的方法

X = boston.data
y = boston.target
features = boston.feature_names
boston_data = pd.DataFrame(X,columns=features)
boston_data["Price"] = y
boston_data.head()
image.png

列明中各个字段的含义如下:

  • CRIM:各城镇的人均犯罪率
  • ZN:规划地段超过25,000平方英尺的住宅用地比例
  • INDUS:城镇非零售商业用地比例
  • CHAS:是否在查尔斯河边(=1是)
  • NOX:一氧化氮浓度(/千万分之一)
  • RM:每个住宅的平均房间数
  • AGE:1940年以前建造的自住房屋的比例
  • DIS:到波士顿五个就业中心的加权距离
  • RAD:放射状公路的可达性指数
  • TAX:全部价值的房产税率(每1万美元)
  • PTRATIO:按城镇分配的学生与教师比例
  • B:1000(Bk - 0.63)^2其中Bk是每个城镇的黑人比例
  • LSTAT:较低地位人口
  • Price:房价

我们选择CRIM/RM/DIS/TAX等特征查看一下和房价的关系:

box_fea = ['CRIM' ,'RM' , 'DIS' , 'TAX' ,'PTRATIO','LSTAT']
f, ax = plt.subplots(2,3, figsize = (15,8))

for i, col in enumerate(box_fea):
    sns.scatterplot(x = col, y = 'Price', data = boston_data, color="b",alpha=0.6,ax = ax[i//3][i%3])
download (1).png

可以看到RM/CRIM/LSTAT和房价的关系相关性较大。在这个任务中,房价是一个连续变量,所以是一个回归模型。

2. 分类问题

我们用鸢尾花这个数据集来演示:

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()
image.png

将特征可视化查看:

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()
image.png

我们可以看到:每种不同的颜色和点的样式为一种类型的鸢尾花,数据集有三种不同类型的鸢尾花。因此因变量是一个类别变量,因此通过特征预测鸢尾花类别的问题是一个分类问题。

3. 聚类问题

要了解聚类问题,首先要明确类的概念。所谓类,一般是指相似元素的集合。即我们常说的“人以类聚、物以群分”。因而聚类分析又称群分析,它是研究(样品或指标)分类问题的一种统计分析方法,同时也是数据挖掘的一个重要算法。(百度百科)

我们可以使用sklearn生成符合自身需求的数据集,下面我们用其中几个函数例子来生成无因变量的数据集:
具体可以参考sklearn官网:
[https://scikit-learn.org/stable/modules/classes.html?highlight=datasets#module-sklearn.datasets]

plt.figure(figsize=(15,6))
plt.subplot(121) 
# 生成月牙型数据
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.subplot(122)
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)
download.png

在本次学习中我们要重点介绍回归和分类的集成学习的问题,因此我们在接下来的章节中不再介绍关于无监督学习的具体算法,后面的内容仅仅涉及回归和分类问题。

你可能感兴趣的:(集成学习(1)- 导论)