1. 什么是机器学习
1.1 机器学习的概念
“机器学习”这一概念是由Arthur Samuel (被誉为“机器学习之父”)在1959年提出的:
Field of study that gives computers the ability to learn without being explicitly programmed.
译为:不需要确定性编程就可以赋予机器某项技能的研究领域。
机器学习(Machine Learning, ML)是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能。 它是人工智能核心,是使计算机具有智能的根本途径。其应用遍及人工智能的各个领域,它主要使用归纳、综合而不是演绎。> ——引用自360百科
机器学习的一个重要的目标就是利用数学模型来理解数据,发现数据中的规律,用作数据的分析和预测。
机器学习中的数据通常由一组向量组成,这组向量中的每个向量都是一个样本,我们用 来表示一个样本,其中
,共N个样本,每个样本
共p+1个维度,前p个维度的每个维度我们称为一个特征(即一共有p个特征),最后一个维度
我们称为因变量(响应变量,机器学习中也叫标签)。特征用来描述影响因变量的因素,如:我们要探寻身高是否会影响体重的关系的时候,身高就是一个特征,体重就是一个因变量。通常在一个数据表dataframe里面,一行表示一个样本
,一列表示一个特征。
1.2 机器学习的分类
根据数据是否有因变量,机器学习的任务可分为:有监督学习和无监督学习。
- 监督式学习根据已知的输入和输出训练模型,让模型能够预测未来输出。如:我们使用房间面积,房屋所在地区,环境等级等因素去预测某个地区的房价。;
- 无监督学习从输入数据中找出隐藏模式或内在结构。如:我们给定某电商用户的基本信息和消费记录,通过观察数据中的哪些类型的用户彼此间的行为和属性类似,形成一个客群。注意,我们本身并不知道哪个用户属于哪个客群,即没有给定因变量。
根据因变量的是否连续,有监督学习又分为回归和分类:
- 回归:因变量是连续型变量,如:房价,体重等。
- 分类:因变量是离散型变量,如:是否患癌症,西瓜是好瓜还是坏瓜等。
图片引用自 https://ww2.mathworks.cn/discovery/machine-learning.html
1.3 机器学习中常见的约定:
为了更好地叙述后面的内容,我们对数据的形式作出如下约定:
- 第i个样本:
- 因变量
- 第k个特征:
- 特征矩阵
2. 使用Python编程语言进行机器学习建模
为什么使用Python?**
①Python语言容易上手。
②Python有丰富且成熟的第三方数据科学库。
Python中常用于探索机器学习项目的库:
在学习机器学习中,我们经常使用scikit-learn简称sklearn工具库来探索机器学习项目,下面我们开始使用sklearn来演示这几个具体的概念:
# 引入相关科学计算包
import numpy as np # 科学计算库
import pandas as pd # 数据处理库
import matplotlib.pyplot as plt # 数据可视化库
%matplotlib inline # jupyter和ipython独有的魔法方法,帮助jupyter notebook快速出图
plt.style.use("ggplot") # 指定要调用的做图控件
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()
| | CRIM | ZN | INDUS | CHAS | NOX | RM | AGE | DIS | RAD | TAX | PTRATIO | B | LSTAT | Price |
| :---: | :---: | :---: | :---: | :---: | :---: | :---: | :---: | :---: | :---: | :---: | :---: | :---: | :---: | :---: |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
各个特征的相关解释:
- 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:房价
这里我们随便取其中一个特征和房价,画出散点图,来观察数据的分布情况。
```python
sns.scatterplot(boston_data['NOX'],boston_data['Price'],color="r",alpha=0.6)
plt.title("Price~NOX")
plt.show()
我们可以看到,数据给定任务所需要的因变量,因变量为波士顿房价Price是一个连续型变量,所以这是一个回归的例子。
2.2 分类
说到机器学习分类的例子,应该祭出机器学习中大名鼎鼎的iris(鸢尾花卉)数据集:
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()
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个特征和标签,来画带有三维信息的散点图
marker = ['s','x','o'] # 这里用3种不同标记来表示3种不同花的类别
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()
2.3 无监督学习
我们可以使用sklearn生成符合自身需求的数据集,下面我们用其中几个函数例子来生成无因变量的数据集:
https://scikit-learn.org/stable/modules/classes.html?highlight=datasets#module-sklearn.datasets
# 生成月牙型非凸集
from sklearn import datasets
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()
# 生成符合正态分布的聚类数据
from sklearn import datasets
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个数据集可以用于聚类算法。但图像并不是聚类算法模型的拟合效果。
本笔记基于Datawhale开源内容整理 https://github.com/datawhalechina/team-learning-data-mining/tree/master/EnsembleLearning