当前位置:   article > 正文

机器学习-前期知识储备_机器学习知识储备

机器学习知识储备

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 回归

首先,我们先来看看有监督学习中回归的例子,我们使用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包,提供了一种高度交互式界面
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
# 导入 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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
CRIMZNINDUSCHASNOXRMAGEDISRADTAXPTRATIOBLSTATPrice
00.0063218.02.310.00.5386.57565.24.09001.0296.015.3396.904.9824.0
10.027310.07.070.00.4696.42178.94.96712.0242.017.8396.909.1421.6
20.027290.07.070.00.4697.18561.14.96712.0242.017.8392.834.0334.7
30.032370.02.180.00.4586.99845.86.06223.0222.018.7394.632.9433.4
40.069050.02.180.00.4587.14754.26.06223.0222.018.7396.905.3336.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)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

在这里插入图片描述

Wall time: 134 ms
  • 1
用plt画散点图
%%time
plt.figure() #新建子图
plt.scatter(boston_data['NOX'],boston_data['Price'],color="r",alpha=0.6)
plt.title('Dataset')
plt.show()
  • 1
  • 2
  • 3
  • 4
  • 5

在这里插入图片描述

Wall time: 135 ms
  • 1

从上面两种情况来看,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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
sepal length (cm)sepal width (cm)petal length (cm)petal width (cm)target
05.13.51.40.20
14.93.01.40.20
24.73.21.30.20
34.63.11.50.20
45.03.61.40.20

各个特征的相关解释:

  • 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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

在这里插入图片描述

增加一个maker知识点:
  • 1
markertype含义
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”xx
19“D”diamond钻石
20“d”thin_diamond细的钻石
21vline
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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

在这里插入图片描述

# 生成符合正态分布的聚类数据
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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/563028
推荐阅读
相关标签
  

闽ICP备14008679号