机器学习-前期知识储备
1.什么是机器学习?机器学习:利用数学模型来理解数据,发现数据中的规律,用作数据的分析和预测。数据通常由一组向量组成,这组向量中的每个向量都是一个样本,我们用xix_ixi来表示一个样本,其中i=1,2,3,...,Ni=1,2,3,...,Ni=1,2,3,...,N,共N个样本,每个样本xi=(xi1,xi2,...,xip,yi)x_i=(x_{i1},x_{i2},...,x_{ip},
1. 什么是机器学习?
机器学习:利用数学模型来理解数据,发现数据中的规律,用作数据的分析和预测。
数据通常由一组向量组成,这组向量中的每个向量都是一个样本,我们用xix_ixi来表示一个样本,其中i=1,2,3,...,Ni=1,2,3,...,Ni=1,2,3,...,N,共N个样本,每个样本xi=(xi1,xi2,...,xip,yi)x_i=(x_{i1},x_{i2},...,x_{ip},y_i)xi=(xi1,xi2,...,xip,yi)共p+1个维度,前p个维度的每个维度我们称为一个特征,最后一个维度yiy_iyi我们称为因变量(响应变量)。
特征用来描述影响因变量的因素,如:我们要探寻身高是否会影响体重的关系的时候,身高就是一个特征,体重就是一个因变量。通常在一个数据表dataframe里面,一行表示一个样本xix_ixi,一列表示一个特征。
根据数据是否有因变量,机器学习的任务可分为:
- 有监督学习:给定因变量,在训练模型时明确标记每个数据点的正确结果,以便找它们之间的关系,确保在引入未分配的数据点时,可以正确的做出预测或分类。
(如:我们使用房间面积,房屋所在地区,环境等级等因素去预测某个地区的房价。)
- 无监督学习:没有给定因变量,算法在训练模型时期不对结果进行标记,而直接在数据点之间找有意义的关系,它的价值在于发现模式以及相关性。
(如:我们给定某电商用户的基本信息和消费记录,通过观察数据中的哪些类型的用户彼此间的行为和属性类似,形成一个客群。注意,我们本身并不知道哪个用户属于哪个客群,即没有给定因变量。)
总结:
有监督:有因变量、有特征向量、预测结果
无监督:没有因变量、有特征向量、寻找数据结构/规律
根据因变量的是否连续,有监督学习又分为:
- 回归:因变量是连续型变量,如:房价,体重等。
- 分类:因变量是离散型变量,如:是否患癌症,产品是合格还是不合格等。
为了更好地叙述后面的内容,我们对数据的形式作出如下约定:
第i个样本:xi=(xi1,xi2,...,xip,yi)T,i=1,2,...,Nx_i=(x_{i1},x_{i2},...,x_{ip},y_i)^T,i=1,2,...,Nxi=(xi1,xi2,...,xip,yi)T,i=1,2,...,N
因变量y=(y1,y2,...,yN)Ty=(y_1,y_2,...,y_N)^Ty=(y1,y2,...,yN)T
第k个特征:x(k)=(x1k,x2k,...,xNk)Tx^{(k)}=(x_{1k},x_{2k},...,x_{Nk})^Tx(k)=(x1k,x2k,...,xNk)T
特征矩阵X=(x1,x2,...,xN)TX=(x_1,x_2,...,x_N)^TX=(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包,提供了一种高度交互式界面
# 导入 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)

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()

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()

增加一个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()

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

更多推荐




所有评论(0)