1.什么是机器学习?
机器学习的一个重要的目标就是利用数学模型来理解数据,发现数据中的规律,用作数据的分析和预测。
数据通常由一组向量组成,这组向量中的每个向量都是一个样本,我们用 x i x_i xi来表示一个样本,其中 i = 1 , 2 , 3 , . . . , N i=1,2,3,...,N i=1,2,3,...,N,共N个样本,每个样本 x i = ( x i 1 , x i 2 , . . . , x i p , y i ) x_i=(x_{i1},x_{i2},...,x_{ip},y_i) xi=(xi1,xi2,...,xip,yi)共p+1个维度,前p个维度的每个维度我们称为一个特征,最后一个维度 y i y_i yi我们称为因变量(响应变量)。
特征用来描述影响因变量的因素,如:我们要探寻身高是否会影响体重的关系的时候,身高就是一个特征,体重就是一个因变量。通常在一个数据表dataframe里面,一行表示一个样本 x i x_i xi,一列表示一个特征。
2.机器学习任务
-
有监督学习:给定某些特征去估计因变量,即因变量存在的时候,我们称这个机器学习任务为有监督学习。如:我们使用房间面积,房屋所在地区,环境等级等因素去预测某个地区的房价。
-
无监督学习:给定某些特征但不给定因变量,建模的目的是学习数据本身的结构和关系。如:我们给定某电商用户的基本信息和消费记录,通过观察数据中的哪些类型的用户彼此间的行为和属性类似,形成一个客群。注意,我们本身并不知道哪个用户属于哪个客群,即没有给定因变量。
根据因变量的是否连续,有监督学习又分为回归和分类:
- 回归:因变量是连续型变量,如:房价,体重等。
- 分类:因变量是离散型变量,如:是否患癌症,西瓜是好瓜还是坏瓜等。
为了更好地叙述后面的内容,我们对数据的形式作出如下约定:
第i个样本:
x
i
=
(
x
i
1
,
x
i
2
,
.
.
.
,
x
i
p
,
y
i
)
T
,
i
=
1
,
2
,
.
.
.
,
N
x_i=(x_{i1},x_{i2},...,x_{ip},y_i)^T,i=1,2,...,N
xi=(xi1,xi2,...,xip,yi)T,i=1,2,...,N
因变量:
y
=
(
y
1
,
y
2
,
.
.
.
,
y
N
)
T
y=(y_1,y_2,...,y_N)^T
y=(y1,y2,...,yN)T
第k个特征:
x
(
k
)
=
(
x
1
k
,
x
2
k
,
.
.
.
,
x
N
k
)
T
x^{(k)}=(x_{1k},x_{2k},...,x_{Nk})^T
x(k)=(x1k,x2k,...,xNk)T
特征矩阵:
X
=
(
x
1
,
x
2
,
.
.
.
,
x
N
)
T
X=(x_1,x_2,...,x_N)^T
X=(x1,x2,...,xN)T
下面对机器学习三大主要任务进行演示
2.1有监督学习
先导入基本的包
# 引入相关科学计算包
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
plt.style.use("ggplot")
import seaborn as sns
2.1.1回归
使用sklearn内置的Boston房价数据集,sklearn中所有内置数据集都封装在datasets对象内:
返回的对象有:
- data:特征X的矩阵(ndarray)
- target:因变量的向量(ndarray)
- feature_names:特征名称(ndarray)
先看下数据,共有506条,每条12个特征,相关特征如下
特征 | 含义 |
---|---|
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 | 房价 |
from sklearn import datasets
boston=datasets.load_boston() #返回一个类似字典的类
X=boston.data
y=boston.target
print(X.shape,y.shape)
features=boston.feature_names
boston_data=pd.DataFrame(X,columns=features)
boston_data['Price']=y
boston_data
绘制下 NOX
一氧化氮浓度(/千万分之一)和Price房价的散点图,因为波士顿房价Price是一个连续型变量,所以这是一个回归的例子
2.1.2分类
这里用iris数据集来展示下,鸢尾花数据集有四个特征和三类鸢尾花,各特征含义
特征 | 含义 |
---|---|
- sepal length (cm) | 花萼长度(厘米) |
- sepal width (cm) | 花萼宽度(厘米) |
- petal length (cm) | 花瓣长度(厘米) |
- petal width (cm) | 花瓣宽度(厘米) |
from sklearn import datasets
iris=datasets.load_iris()
X=iris.data
y=iris.target
print(X.shape,y.shape)
features=iris.feature_names
iris_data=pd.DataFrame(X,columns=features)
iris_data['target']=y
print('鸢尾花共有{}类'.format(iris_data['target'].nunique()))
iris_data
可视化sepal length (cm) sepal width (cm)两个特征与类别关系,可以看到每种不同的颜色和点的样式为一种类型的鸢尾花,数据集有三种不同类型的鸢尾花。因此因变量是一个类别变量,因此通过特征预测鸢尾花类别的问题是一个分类问题。
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()
2.2无监督学习
我们可以使用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()