机器学习-前期知识储备

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,一列表示一个特征。

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

  • 有监督学习:给定因变量,在训练模型时明确标记每个数据点的正确结果,以便找它们之间的关系,确保在引入未分配的数据点时,可以正确的做出预测或分类。

(如:我们使用房间面积,房屋所在地区,环境等级等因素去预测某个地区的房价。)

  • 无监督学习:没有给定因变量,算法在训练模型时期不对结果进行标记,而直接在数据点之间找有意义的关系,它的价值在于发现模式以及相关性。

(如:我们给定某电商用户的基本信息和消费记录,通过观察数据中的哪些类型的用户彼此间的行为和属性类似,形成一个客群。注意,我们本身并不知道哪个用户属于哪个客群,即没有给定因变量。)

总结:

有监督:有因变量、有特征向量、预测结果

无监督:没有因变量、有特征向量、寻找数据结构/规律

根据因变量的是否连续,有监督学习又分为:

  • 回归:因变量是连续型变量,如:房价,体重等。
  • 分类:因变量是离散型变量,如:是否患癌症,产品是合格还是不合格等。

为了更好地叙述后面的内容,我们对数据的形式作出如下约定:
第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

了解了理论知识,再来看看如何在python里使用机器学习(scikit-learn)工具库,简称sklearn。sklearn中所有内置数据集都封装在datasets对象内。

** datasets,有很多可用来学习算法模型的数据库。 **

主要有两种:

  • 封装好的经典数据。eg: boston 房价, 糖尿病, 数字, Iris 花。在代码中以“load”开头。

  • 自己设计参数,然后生成的数据,例如用来训练线性回归模型的数据(强大)。在代码中以“make”开头

返回的对象有:

  • data:特征X的矩阵(ndarray)
  • target:因变量的向量(ndarray)
  • feature_names:特征名称(ndarray)
    机器学习-前期知识储备_第1张图片

1.1 回归

首先,我们先来看看有监督学习中回归的例子,我们使用sklearn内置数据集Boston房价数据集。

# 引入相关科学计算包
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt  # matplotlib作图工具
# %matplotlib inline # 直接在你的cell里生成图像
plt.style.use("ggplot")  # 使用自带的样式进行美化
import seaborn as sns # 基于matplotlib的图形可视化python包,提供了一种高度交互式界面
# 导入 sklearn 中的datasets对象
from sklearn import datasets
boston = datasets.load_boston()     # 导入内置数据集Boston房价,返回一个类似于字典的类
X = boston.data # 特征X的矩阵
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;否则为0 ------【查尔斯河虚拟变量,用于回归分析】)
  • NOX:一氧化氮浓度(/千万分之一) ------【环保指标】
  • RM:每个住宅的平均房间数
  • AGE:1940年以前建造的自住房屋的比例
  • DIS:到波士顿五个就业中心的加权距离
  • RAD:放射状公路的可达性指数 ------【距离高速公路的便利指数】
  • TAX:全部价值的房产税率(每1万美元)
  • PTRATIO:按城镇分配的学生与教师比例
  • B:1000(Bk - 0.63)^2其中Bk是每个城镇的黑人比例
  • LSTAT:较低地位人口 ------【房东属于低等收入阶层比例】
  • Price:房价

查看因变量和自变量的关系,可以用散点图来解决。

用sns 画散点图

%%time
sns.scatterplot(boston_data['NOX'],boston_data['Price'],color="r",alpha=0.6) # alpha,图片的透明度
plt.title("Price~NOX") # 标题
plt.show()

# 这里会有关于futureWarning提示,如何解决呢?添加以下两行代码即可
from warnings import simplefilter
simplefilter(action='ignore', category=FutureWarning)

机器学习-前期知识储备_第2张图片

Wall time: 134 ms

用plt画散点图

%%time
plt.figure() #新建子图
plt.scatter(boston_data['NOX'],boston_data['Price'],color="r",alpha=0.6)
plt.title('Dataset')
plt.show()

机器学习-前期知识储备_第3张图片

Wall time: 135 ms

从上面两种情况来看,plt 和sns 画图,目前除了颜色上,散点大小上有区别外,还包括横纵坐标轴的美化,sns直接就会体现,而plt没有,需要再添代码设置。两者图出来的时间差不多,想要查看,可用%%time语句来验证。

** 另一种查看程序运行时间代码:**

“”"
from time import time

start = time()

“”“运行的代码块”""

end = time()

print(‘running time is :%s seconds’%(end - start))"""

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

1.2 分类

著名的iris鸢尾花数据集作为机器学习的分类鼻祖,必须有被cue到。

# 仍旧是sklearn的内置数据集datasets
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):花瓣宽度(厘米)
# 可视化特征
# Matplotlib 设置参数marker的值
marker = ['s','x','o'] # 正方形、x、圆

# np.unique():去除数组中的重复数字,并进行排序之后输出
for index,c in enumerate(np.unique(y)): # 对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])
# label,图例的名称,marker,形状

plt.xlabel("sepal length (cm)") # 设置横坐标名称
plt.ylabel("sepal width (cm)") # 设置纵坐标名称
plt.legend() # 给图加上图例(0、1、2)
plt.show()

机器学习-前期知识储备_第4张图片

增加一个maker知识点:
marker type 含义
0 “.” point
1 “,” pixel 像素
2 “o” circle
3 “v” triangle_down 下三角
4 “^” triangle_up 上三角
5 “<” triangle_left 左三角
6 “>” triangle_right 右三角
7 “1” tri_down 类似奔驰的标志
8 “2” tri_up 类似奔驰的标志
9 “3” tri_left 类似奔驰的标志
10 “4” tri_right 类似奔驰的标志
11 “8” octagon 八角形
12 “s” square 正方形
13 “p” pentagon 五角星
14 “*” star 星号
15 “h” hexagon1 六边形1
16 “H” hexagon2 六边形2
17 “+” plus 加号
18 “x” x x
19 “D” diamond 钻石
20 “d” thin_diamond 细的钻石
21 vline
22 “-“ hline 水平方向的线
23 “TICKLEFT” octagon 像素

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

1.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)
# 噪声
# shuffle,分割之前是否对数据进行洗牌(默认True)
# random_state:随机种子 当种子固定时,可以实现实验复现,每次可以分割得到同样训练集和测试集,方便调节参数
# 只有当shuffle=True时,random_state才起作用

for index,c in enumerate(np.unique(y)):
    plt.scatter(x[y==c,0],x[y==c,1],s=7)
plt.show()

机器学习-前期知识储备_第5张图片

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

机器学习-前期知识储备_第6张图片

你可能感兴趣的:(机器学习,python,机器学习,人工智能,深度学习,数据挖掘)