机器学习三大基本任务_Task01

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,一列表示一个特征。
根据数据是否有因变量,机器学习的任务可分为:有监督学习无监督学习

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(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

1.1 回归

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

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

机器学习三大基本任务_Task01_第1张图片

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

各个特征的相关解释:

  • 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:房价

1.2 分类

我们来看看一个分类的例子,我们来看看大名鼎鼎的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()

机器学习三大基本任务_Task01_第2张图片

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

各个特征的相关解释:

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

1.3 无监督学习

我们可以使用sklearn生成符合自身需求的数据集,下面我们用其中几个函数例子来生成无因变量的数据集:
https://scikit-learn.org/stable/modules/classes.html?highlight=datasets#module-sklearn.datasets
机器学习三大基本任务_Task01_第3张图片

datasets.make_moons参数:

  • n_samples : int or tuple of shape (2,) 默认=100
    • int: 总共生成的点的个数
    • two-element tuple:每个月亮的点的个数
  • shuffle : 是否要打乱生成的样本 默认=True
  • noise : 默认=None。Standard deviation of Gaussian noise added to the data.
# 生成呈现月牙型非凸集的样本点
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()

机器学习三大基本任务_Task01_第4张图片

# 生成符合正态分布的聚类数据
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()

机器学习三大基本任务_Task01_第5张图片

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

以上内容大框架来源于:datawhale开源学习https://github.com/datawhalechina/team-learning-data-mining/tree/master/EnsembleLearning

你可能感兴趣的:(机器学习)