1. 什么是机器学习

1.1 机器学习的概念

“机器学习”这一概念是由Arthur Samuel (被誉为“机器学习之父”)在1959年提出的:
Field of study that gives computers the ability to learn without being explicitly programmed.
译为:不需要确定性编程就可以赋予机器某项技能的研究领域。


机器学习(Machine Learning, ML)是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能。 它是人工智能核心,是使计算机具有智能的根本途径。其应用遍及人工智能的各个领域,它主要使用归纳、综合而不是演绎。> ——引用自360百科

机器学习的一个重要的目标就是利用数学模型来理解数据,发现数据中的规律,用作数据的分析和预测。

机器学习中的数据通常由一组向量组成,这组向量中的每个向量都是一个样本,我们用 机器学习基础模型01——导论 - 图1 来表示一个样本,其中机器学习基础模型01——导论 - 图2,共N个样本,每个样本机器学习基础模型01——导论 - 图3共p+1个维度,前p个维度的每个维度我们称为一个特征(即一共有p个特征),最后一个维度 机器学习基础模型01——导论 - 图4 我们称为因变量(响应变量,机器学习中也叫标签)。特征用来描述影响因变量的因素,如:我们要探寻身高是否会影响体重的关系的时候,身高就是一个特征,体重就是一个因变量。通常在一个数据表dataframe里面,一行表示一个样本 机器学习基础模型01——导论 - 图5,一列表示一个特征。

1.2 机器学习的分类

根据数据是否有因变量,机器学习的任务可分为:有监督学习无监督学习

  • 监督式学习根据已知的输入和输出训练模型,让模型能够预测未来输出。如:我们使用房间面积,房屋所在地区,环境等级等因素去预测某个地区的房价。;
  • 无监督学习从输入数据中找出隐藏模式或内在结构。如:我们给定某电商用户的基本信息和消费记录,通过观察数据中的哪些类型的用户彼此间的行为和属性类似,形成一个客群。注意,我们本身并不知道哪个用户属于哪个客群,即没有给定因变量。

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

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


机器学习基础模型01——导论 - 图6

图片引用自 https://ww2.mathworks.cn/discovery/machine-learning.html

1.3 机器学习中常见的约定:

为了更好地叙述后面的内容,我们对数据的形式作出如下约定:

  • 第i个样本:机器学习基础模型01——导论 - 图7
  • 因变量机器学习基础模型01——导论 - 图8
  • 第k个特征:机器学习基础模型01——导论 - 图9
  • 特征矩阵机器学习基础模型01——导论 - 图10

2. 使用Python编程语言进行机器学习建模


为什么使用Python?**
①Python语言容易上手。
②Python有丰富且成熟的第三方数据科学库。

Python中常用于探索机器学习项目的库:
在学习机器学习中,我们经常使用scikit-learn简称sklearn工具库来探索机器学习项目,下面我们开始使用sklearn来演示这几个具体的概念:

  1. # 引入相关科学计算包
  2. import numpy as np # 科学计算库
  3. import pandas as pd # 数据处理库
  4. import matplotlib.pyplot as plt # 数据可视化库
  5. %matplotlib inline # jupyter和ipython独有的魔法方法,帮助jupyter notebook快速出图
  6. plt.style.use("ggplot") # 指定要调用的做图控件
  7. import seaborn as sns # 可以做出更美观图形的可视化模块

2.1 回归

首先,我们先来看看有监督学习中回归的例子,我们使用sklearn内置数据集Boston房价数据集。sklearn中所有内置数据集都封装在datasets对象内: 返回的对象有:

  • data:特征X的矩阵(ndarray)
  • target:因变量的向量(ndarray)
  • feature_names:特征名称(ndarray) ```python 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()

  1. | | CRIM | ZN | INDUS | CHAS | NOX | RM | AGE | DIS | RAD | TAX | PTRATIO | B | LSTAT | Price |
  2. | :---: | :---: | :---: | :---: | :---: | :---: | :---: | :---: | :---: | :---: | :---: | :---: | :---: | :---: | :---: |
  3. | 0 | 0.00632 | 18.0 | 2.31 | 0.0 | 0.538 | 6.575 | 65.2 | 4.0900 | 1.0 | 296.0 | 15.3 | 396.90 | 4.98 | 24.0 |
  4. | 1 | 0.02731 | 0.0 | 7.07 | 0.0 | 0.469 | 6.421 | 78.9 | 4.9671 | 2.0 | 242.0 | 17.8 | 396.90 | 9.14 | 21.6 |
  5. | 2 | 0.02729 | 0.0 | 7.07 | 0.0 | 0.469 | 7.185 | 61.1 | 4.9671 | 2.0 | 242.0 | 17.8 | 392.83 | 4.03 | 34.7 |
  6. | 3 | 0.03237 | 0.0 | 2.18 | 0.0 | 0.458 | 6.998 | 45.8 | 6.0622 | 3.0 | 222.0 | 18.7 | 394.63 | 2.94 | 33.4 |
  7. | 4 | 0.06905 | 0.0 | 2.18 | 0.0 | 0.458 | 7.147 | 54.2 | 6.0622 | 3.0 | 222.0 | 18.7 | 396.90 | 5.33 | 36.2 |
  8. 各个特征的相关解释:
  9. - CRIM:各城镇的人均犯罪率
  10. - ZN:规划地段超过25,000平方英尺的住宅用地比例
  11. - INDUS:城镇非零售商业用地比例
  12. - CHAS:是否在查尔斯河边(=1是)
  13. - NOX:一氧化氮浓度(/千万分之一)
  14. - RM:每个住宅的平均房间数
  15. - AGE1940年以前建造的自住房屋的比例
  16. - DIS:到波士顿五个就业中心的加权距离
  17. - RAD:放射状公路的可达性指数
  18. - TAX:全部价值的房产税率(每1万美元)
  19. - PTRATIO:按城镇分配的学生与教师比例
  20. - B1000(Bk - 0.63)^2其中Bk是每个城镇的黑人比例
  21. - LSTAT:较低地位人口
  22. - Price:房价
  23. 这里我们随便取其中一个特征和房价,画出散点图,来观察数据的分布情况。
  24. ```python
  25. sns.scatterplot(boston_data['NOX'],boston_data['Price'],color="r",alpha=0.6)
  26. plt.title("Price~NOX")
  27. plt.show()

image.png
我们可以看到,数据给定任务所需要的因变量,因变量为波士顿房价Price是一个连续型变量,所以这是一个回归的例子。

2.2 分类

说到机器学习分类的例子,应该祭出机器学习中大名鼎鼎的iris(鸢尾花卉)数据集:

  1. from sklearn import datasets
  2. iris = datasets.load_iris()
  3. X = iris.data
  4. y = iris.target
  5. features = iris.feature_names
  6. iris_data = pd.DataFrame(X,columns=features)
  7. iris_data['target'] = y
  8. iris_data.head()
sepal length (cm) sepal width (cm) petal length (cm) petal width (cm) target
0 5.1 3.5 1.4 0.2 0
1 4.9 3.0 1.4 0.2 0
2 4.7 3.2 1.3 0.2 0
3 4.6 3.1 1.5 0.2 0
4 5.0 3.6 1.4 0.2 0

各个特征的相关解释:

  • sepal length (cm):花萼长度(厘米)
  • sepal width (cm):花萼宽度(厘米)
  • petal length (cm):花瓣长度(厘米)
  • petal width (cm):花瓣宽度(厘米)


这里我们取2个特征和标签,来画带有三维信息的散点图

  1. marker = ['s','x','o'] # 这里用3种不同标记来表示3种不同花的类别
  2. for index,c in enumerate(np.unique(y)):
  3. 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])
  4. plt.xlabel("sepal length (cm)")
  5. plt.ylabel("sepal width (cm)")
  6. plt.legend()
  7. plt.show()

image.png

2.3 无监督学习

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

  1. # 生成月牙型非凸集
  2. from sklearn import datasets
  3. x, y = datasets.make_moons(n_samples=2000, shuffle=True,
  4. noise=0.05, random_state=None)
  5. for index,c in enumerate(np.unique(y)):
  6. plt.scatter(x[y==c,0],x[y==c,1],s=7)
  7. plt.show()

image.png

  1. # 生成符合正态分布的聚类数据
  2. from sklearn import datasets
  3. x, y = datasets.make_blobs(n_samples=5000, n_features=2, centers=3)
  4. for index,c in enumerate(np.unique(y)):
  5. plt.scatter(x[y==c, 0], x[y==c, 1],s=7)
  6. plt.show()

image.png

以上这2个数据集可以用于聚类算法。但图像并不是聚类算法模型的拟合效果。

本笔记基于Datawhale开源内容整理 https://github.com/datawhalechina/team-learning-data-mining/tree/master/EnsembleLearning