什么是机器学习?机器学习的一个重要的目标就是利用数学模型来理解数据,发现数据中的规律,用作数据的分析和预测。数据通常由一组向量组成,这组向量中的每个向量都是一个样本,我们用 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,一列表示一个特征。
根据数据是否有因变量,机器学习的任务可分为:有监督学习和无监督学习。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wSvWemJK-1615821098016)(./1.1.png)]
根据因变量的是否连续,有监督学习又分为回归和分类:
为了更好地叙述后面的内容,我们对数据的形式作出如下约定:
第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
在学习机器学习中,我们经常使用scikit-learn简称sklearn工具库来探索机器学习项目,下面我们开始使用sklearn来演示这几个具体的概念:
# 引入相关科学计算包
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# 魔法函数 在页面显示结果 =plt.show()
%matplotlib inline
plt.style.use("ggplot")
import seaborn as sns
首先,我们先来看看有监督学习中回归的例子,我们使用sklearn内置数据集Boston房价数据集。sklearn中所有内置数据集都封装在datasets对象内:
返回的对象有:
from sklearn import datasets
boston = datasets.load_boston()
# 返回一个类似于字典的类--key有data(X)target(y)feature_names(特征名称)DESCR(数据集的描述)
boston["data"][:3] # X--2D array 这里展示前三个数据的特征
array([[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]])
boston["target"][:3] # y--因变量
array([24. , 21.6, 34.7])
boston["feature_names"]
array(['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD',
'TAX', 'PTRATIO', 'B', 'LSTAT'], dtype='
X = boston.data
y = boston.target
features = boston.feature_names
boston_data = pd.DataFrame(X,columns=features) # 先形成X的DF
boston_data["Price"] = y # 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 |
sns.scatterplot(x=boston_data['NOX'],y=boston_data['Price'],color="r",alpha=0.6) # 颜色=红色,透明度=0.6
plt.title("Price~NOX")
plt.show()
我们可以看到,数据给定任务所需要的因变量,因变量为波士顿房价Price是一个连续型变量,所以这是一个回归的例子。
各个特征的相关解释:
我们来看看一个分类的例子,我们来看看大名鼎鼎的iris数据集:
from sklearn import datasets
iris = datasets.load_iris() #150个数据 4个特征 y有三分类
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 |
pd.Series(iris.target).unique() # 3个类别0 1 2
array([0, 1, 2])
np.unique(iris.target)
# np.unique(1D array) == pd.Series(1d array).unique()
array([0, 1, 2])
# 提取出类别=1的sepal length值--有50个样本
# 布尔掩码索引 只能用loc
iris_data.loc[y==1,"sepal length (cm)"]
# y==1:行索引是T/F的1d array--提取出为T的行&sepal length这一列
# same as:
# iris_data.loc[iris_data["target"]==1,"sepal length (cm)"]
50 7.0
51 6.4
52 6.9
53 5.5
54 6.5
55 5.7
56 6.3
57 4.9
58 6.6
59 5.2
60 5.0
61 5.9
62 6.0
63 6.1
64 5.6
65 6.7
66 5.6
67 5.8
68 6.2
69 5.6
70 5.9
71 6.1
72 6.3
73 6.1
74 6.4
75 6.6
76 6.8
77 6.7
78 6.0
79 5.7
80 5.5
81 5.5
82 5.8
83 6.0
84 5.4
85 6.0
86 6.7
87 6.3
88 5.6
89 5.5
90 5.5
91 6.1
92 5.8
93 5.0
94 5.6
95 5.7
96 5.7
97 6.2
98 5.1
99 5.7
Name: sepal length (cm), dtype: float64
# 可视化特征 3个维度
# x=sepal length VS y=sepal_width for each categ用形状表示
marker = ['s','x','o']
for index,c in enumerate(np.unique(y)): #[(0,0),(1,1),(2,2)]前者为index 后者为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()
我们可以看到:每种不同的颜色和点的样式为一种类型的鸢尾花,数据集有三种不同类型的鸢尾花。因此因变量是一个类别变量,因此通过特征预测鸢尾花类别的问题是一个分类问题。
各个特征的相关解释:
我们可以使用sklearn生成符合自身需求的数据集,下面我们用其中几个函数例子来生成无因变量的数据集:
https://scikit-learn.org/stable/modules/classes.html?highlight=datasets#module-sklearn.datasets
datasets.make_moons参数:
# 生成呈现月牙型非凸集的样本点
from sklearn import datasets
x, y = datasets.make_moons(n_samples=2000, shuffle=True,
noise=0.05, random_state=None)
x,y # 2d array
(array([[ 0.67929742, -0.38135305],
[ 0.77159364, 0.67744584],
[-1.07392672, 0.25625099],
...,
[ 0.03699961, 0.28100703],
[ 2.00398237, 0.17642646],
[ 2.05042179, 0.42299752]]),
array([1, 0, 0, ..., 1, 1, 1], dtype=int64))
x.shape,y.shape # 总共2000个点 二维表示横纵坐标
# y=0/1表示是哪个月亮--每个月亮有1000个数据点
((2000, 2), (2000,))
for index,c in enumerate(np.unique(y)):
plt.scatter(x[y==c,0],x[y==c,1],s=7) # x[y==c,0]--取出y=类别c的数据点(行筛选) 取出索引=0的数值(列筛选);1d array
plt.show()
# 生成符合正态分布的聚类数据
from sklearn import datasets
x, y = datasets.make_blobs(n_samples=5000, n_features=2, centers=3)
x,y
# 总共生成5000个随机样本点 两个特征--2D,聚成3堆--y有3个类别
(array([[ 4.57836989, 8.084275 ],
[-5.70512224, -1.20095488],
[ 1.57673814, 9.4631707 ],
...,
[-5.08527388, -1.66838832],
[-6.24332981, -3.305177 ],
[ 2.46230633, -8.66146071]]),
array([2, 0, 2, ..., 0, 0, 1]))
for index,c in enumerate(np.unique(y)):
plt.scatter(x[y==c, 0], x[y==c, 1],s=7)
plt.show()
在本开源项目的章节中,我们要重点介绍回归和分类的集成学习的问题,因此我们在接下来的章节中不再介绍关于无监督学习的具体算法,后面的内容仅仅涉及回归和分类问题。
以上内容大框架来源于:datawhale开源学习https://github.com/datawhalechina/team-learning-data-mining/tree/master/EnsembleLearning