人工分类
重要点:
- 分类的意义,什么样的业务属于分类,分类的意义是什么?
- 如何绘制分类均线?
特征1 | 特征2 | 输出 |
---|---|---|
3 | 1 | 0 |
2 | 5 | 1 |
1 | 8 | 1 |
6 | 4 | 0 |
5 | 2 | 0 |
3 | 5 | 1 |
4 | 7 | 1 |
4 | -1 | 0 |
… | … | … |
6 | 8 | 1 |
5 | 1 | 0 |
分类均线的绘制:
将空间分为很多个小格子,然后通过样本去预测每个格子应该属于哪一类,然后去绘制分类局限,比如在上面的表格中可以发现,当x>y时为0,当x<y时为1
再在相应的格子化为不同的颜色,这样分类均线就可以自然而言的出现,效果如下图
案例:
"""
人工分类
"""
import numpy as np
import matplotlib.pyplot as mp
x = np.array([
[3, 1],
[2, 5],
[1, 8],
[6, 4],
[5, 2],
[3, 5],
[4, 7],
[4, -1]])
y = np.array([0, 1, 1, 0, 0, 1, 1, 0])
# 绘制分类边界
l, r = x[:, 0].min() - 1, x[:, 0].max() + 1
b, t = x[:, 1].min() - 1, x[:, 1].max() + 1
# 把可视区间划分为 500 * 500,
n = 500
grid_x,grid_y = np.meshgrid(np.linspace(l,r,n),
np.linspace(b,t,n))
# 模拟使用模型,使用点阵中的每个坐标的类别
grid_z = np.piecewise(grid_x,[grid_x>grid_y,grid_x<grid_y],
[0,1])
# 画图
mp.figure('Simple classification', facecolor='lightgray')
mp.title('Simeple Classification', fontsize=16)
# 调用mp.pcolormesh() 绘制分类边界线
# 根据参数,把可视区间拆分为坐标网格,由于每个网格
# 都有相应类别,可以使用cmap为每个网格填充颜色
mp.pcolormesh(grid_x,grid_y,grid_z,cmap='rainbow')
mp.scatter(x[:, 0], x[:, 1], s=70, label='Sample Points', c=y, cmap='jet')
mp.show()
逻辑分类
通过输入的样本数据,基于多元线性回归模型求出线性预测方程
y = w0+w1x1+w2x2
通过带入样本的数据来求解参数,也就是一个训练模型的过程。
比如就可以去预测上述的样本点是属于样本1 还是样本2 ,但是我们知道在通过训练数据得到的表达式得到的结果就一定是1 或者0 吗?这是不一定的,所以我们还要对得到的结果进行一次处理,通过线型回归方程返回的是连续值,不可以直接用于分类业务模型,所以急需一种方式使得把连续的预测值->离散的预测值。 [-oo, +oo]->{0, 1}
逻
辑
函
数
s
i
g
m
o
i
d
:
y
=
1
1
+
e
−
x
逻辑函数 sigmoid:y = \frac{1}{1+e^{-x}}
逻辑函数sigmoid:y=1+e−x1
它的图像是这样的:
该逻辑函数当x>0,y>0.5;当x<0, y<0.5; 可以把样本数据经过线性预测模型求得的值带入逻辑函数的x,即将预测函数的输出看做输入被划分为1类的概率,择概率大的类别作为预测结果,可以根据函数值确定两个分类。这是线性函数非线性化的一种方式。
逻辑回归相关的API
import sklearn.linear_model as lm
# 构建逻辑回归器
# solver:逻辑函数中指数的函数关系(liblinear为线型函数关系)
# C:参数代表正则强度,为了防止过拟合。正则越大拟合效果越小。
model = lm.LogisticRegression(solver='liblinear', C=正则强度)
model.fit(训练输入集,训练输出集)
result = model.predict(带预测输入集)
现在将上述的案例用逻辑回归器来绘制
import numpy as np
import sklearn.linear_model as lm
import matplotlib.pyplot as mp
x = np.array([
[3, 1],
[2, 5],
[1, 8],
[6, 4],
[5, 2],
[3, 5],
[4, 7],
[4, -1]])
y = np.array([0, 1, 1, 0, 0, 1, 1, 0])
# 逻辑分类器
model = lm.LogisticRegression(solver='liblinear',C=1)
model.fit(x,y)
l, r = x[:, 0].min() - 1, x[:, 0].max() + 1
b, t = x[:, 1].min() - 1, x[:, 1].max() + 1
n = 500
grid_x,grid_y = np.meshgrid(np.linspace(l,r,n),np.linspace(b,t,n))
samples =np.column_stack((grid_x.ravel(),grid_y.ravel()))
grid_z = model.predict(samples)
grid_z = grid_z.reshape(grid_x.shape)
mp.figure('Logistic Classification', facecolor='lightgray')
mp.title('Logistic Classification', fontsize=20)
mp.xlabel('x', fontsize=14)
mp.ylabel('y', fontsize=14)
mp.tick_params(labelsize=10)
mp.pcolormesh(grid_x, grid_y, grid_z, cmap='rainbow')
mp.scatter(x[:, 0], x[:, 1], c=y, cmap='brg', s=80)
mp.show()
多元分类
通过多个二元分类器解决多元分类问题,主要思路就是将复杂问题简单化。但是当调用api的时候方法和普通的逻辑分类没有任何的不同,就是训练样本不同
特征1 | 特征2 | ==> | 所属类别 | 属于A概率 | 属于B概率 | 属于C概率 |
---|---|---|---|---|---|---|
4 | 7 | ==> | A | 0.7 | 0.1 | 0.2 |
3.5 | 8 | ==> | A | 0.6 | 0.2 | 0.2 |
1.2 | 1.9 | ==> | B | 0.1 | 0.8 | 0.1 |
5.4 | 2.2 | ==> | C | 0.2 | 0.1 | 0.7 |
若拿到一组新的样本,可以基于二元逻辑分类训练出一个模型判断属于A类别的概率。再使用同样的方法训练出两个模型分别判断属于B、C类型的概率,最终选择概率最高的类别作为新样本的分类结果。
案例:基于逻辑分类模型的多元分类。
import numpy as np
import sklearn.linear_model as lm
import matplotlib.pyplot as mp
x = np.array([
[4, 7],
[3.5, 8],
[3.1, 6.2],
[0.5, 1],
[1, 2],
[1.2, 1.9],
[6, 2],
[5.7, 1.5],
[5.4, 2.2]])
y = np.array([0, 0, 0, 1, 1, 1, 2, 2, 2])
# 逻辑分类器
model = lm.LogisticRegression(solver='liblinear', C=1000)
model.fit(x, y)
l, r = x[:, 0].min() - 1, x[:, 0].max() + 1
b, t = x[:, 1].min() - 1, x[:, 1].max() + 1
n = 500
# 从制定范围内拆除500个点
grid_x, grid_y = np.meshgrid(np.linspace(l, r, n), np.linspace(b, t, n))
samples = np.column_stack((grid_x.ravel(), grid_y.ravel()))
grid_z = model.predict(samples)
grid_z = grid_z.reshape(grid_x.shape)
mp.figure('Logistic Classification', facecolor='lightgray')
mp.title('Logistic Classification', fontsize=20)
mp.xlabel('x', fontsize=14)
mp.ylabel('y', fontsize=14)
mp.tick_params(labelsize=10)
mp.pcolormesh(grid_x, grid_y, grid_z, cmap='jet')
mp.scatter(x[:, 0], x[:, 1], c=y, cmap='brg', s=80)
mp.show()