一、二元分类
通过输入的样本,多元线性回归模型返回的是连续预测值,需要一种方法将连续值转变为离散预测值,[-∞,+∞]—>[0,1]。
可以利用逻辑函数来实现。(图如下)
import numpy as np import matplotlib.pyplot as mp x = np.linspace(-20,20,10000) #y = np.array(1 / (1 + np.exp(-x))) y=1/(1+np.exp(-x)) y1 = np.array(1 / (1 + np.exp(-x)) ** 0) / 2.0 mp.plot(x,y) mp.plot(x,y1) mp.show()
当 0,y> 0.5;x< 0,y< 0.5" src="https://latex.codecogs.com/gif.latex?x%3E%200%2Cy%3E%200.5%3Bx%3C%200%2Cy%3C%200.5" />,将样本数据经过线性模型求得 的预测值带入逻辑函数的x,可以根据函数值确定两个分类,大于0.5属于1类,小于0.5属于0类(因为是在(0,1)区间,也可以将结果看作一个概率,依概率大小确定0、1分类),这是线性函数非线性化的一种方式。
# -*- coding: utf-8 -*-
"""
Created on Fri May 6 10:49:04 2022
@author: xxxy
"""
import numpy as np
import sklearn.linear_model as lm
x = np.array([[5,1],
[2,5],
[1,8],
[6,4],
[5,2],
[4,5],
[4,7],
[4,-1]])
y = np.array([0,1,1,0,0,1,1,1])
#构建逻辑回归分类器
#solver:逻辑函数中指数的函数关系(liblinear为线性函数关系)
#c:表示正则强度,防止过拟合。正则越大拟合效果越小
model = lm.LogisticRegression(solver='liblinear',C=1)
model.fit(x,y)#底层任然是构建的一个多元线性回归模型
r=model.predict([[3,6],[8,1]])
print(r)
# -*- coding: utf-8 -*-
"""
Created on Fri May 6 22:12:09 2022
@author: xxxy
"""
import numpy as np
import sklearn.linear_model as lm
import matplotlib.pyplot as mp
x = np.array([[5,1],
[2,5],
[1,8],
[6,4],
[5,2],
[4,5],
[4,7],
[4,-1]])
y = np.array([0,1,1,0,0,1,1,0])
#grid_x是500x500,拉平得到两个个250000的一维数组(grid_y也是同样500x500),
#列合并,得到一个250000x2的一个二维数组。
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))
mesh_x = np.column_stack((grid_x.ravel(),
grid_y.ravel()))
mesh_z = model.predict(mesh_x)#250000
grid_z = mesh_z.reshape(grid_x.shape)#grid_z变为grid_x维度500x500
mp.figure('LR Classification', facecolor='lightgray')
mp.title('LR Classification', fontsize=16)
mp.xlabel('X',fontsize=14)
mp.ylabel('Y',fontsize=14)
mp.pcolormesh(grid_x,grid_y,grid_z,cmap='gray')
mp.scatter(x[:,0], x[:,1], c=y, cmap='jet',
label='points',s=70)
mp.legend()
mp.show()
网格化坐标颜色的实现原理是将500x500个网格通过pcolormesh()函数来填色。
二、 多元分类
通过多个二元分类器解决多元分类问题。
例如:
特征1 特征2 类别 属于A的概率 属于B的概率 属于C的概率
5 7 A 0.9 0.2 0.3
2.4 6 A 0.6 0.4 0.2
1.5 1.9 B 0.2 0.6 0.2
5.5 3.2 C 0.3 0.1 0.8
三个分类器得到每行中概率最大最为:0.9、0.6、0.8,所以:
第一行样本是A类别;
第二行样本是A类别;
第三行样本是B类别;
第四行样本是C类别。
下面代码中除修改了样本数据外,其它代码同上面代码一样,模型内部自动实现多元分类。
import numpy as np
import sklearn.linear_model as lm
import matplotlib.pyplot as mp
x = np.array([[1,5],
[2.3,5],
[1,8],
[0.5,1],
[1,2],
[1.2,1.5],
[7,4],
[4,1.5],
[5.6,2.3]])
y = np.array([0,0,0,1,1,1,2,2,2])
model = lm.LogisticRegression(solver='liblinear',C=500)
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))
mesh_x = np.column_stack((grid_x.ravel(),
grid_y.ravel()))
mesh_z = model.predict(mesh_x)#250000
grid_z = mesh_z.reshape(grid_x.shape)#grid_z变为grid_x维度500x500
mp.figure('LR Classification', facecolor='lightgray')
mp.title('LR Classification', fontsize=16)
mp.xlabel('X',fontsize=14)
mp.ylabel('Y',fontsize=14)
mp.pcolormesh(grid_x,grid_y,grid_z,cmap='gray')
mp.scatter(x[:,0], x[:,1], c=y, cmap='jet',
label='points',s=70)
mp.legend()
mp.show()
下面的代码帮助理解画图
import numpy as np
import sklearn.linear_model as lm
import matplotlib.pyplot as mp
grid_x=np.linspace(1,5,5,5)
grid_y=np.linspace(1,6,6,6)
print(grid_x)
print(grid_y)
print('********************************')
grid_x,grid_y=np.meshgrid(grid_x,grid_y)
print(grid_x)#行复制,6x5
print(grid_y)#列复制,6x5,即得到坐标(1,1)、(2,1)、(3,1)...(5,1)
# (1,2)、(2,2)、(3,2)...(5,2)
# .................
# (1,5)、(2,5)、(3,5)...(5,5)
print('********************************')
z=np.random.rand(30,30)
mp.pcolormesh(z,cmap='gray')
mp.legend()
mp.show()



