python实现决策边界详解

第一部分:基本含义

决策边界(Decision Boundary)是在分类问题中,用来将不同类别的样本分隔开的分界线。简单来说,它是在特征空间中,根据机器学习模型(如支持向量机、逻辑回归等)对数据的分类结果绘制出的边界。这条边界决定了新样本会被分类到哪个类别。

第二部分:二分类问题的决策边界

回顾一下多元线性回归公式:

因此我们可以得到:

进行分类的依据:决策函数:

决策边界的条件:

曲线表达式改造:

绘制决策边界的代码:

#第五部分:开始绘制决策边界
x1=np.linspace(-4,4,1000)
x2=(-clif.coef_[0][0]*x1-clif.intercept_)/clif.coef_[0][1]
#这里的clif.coef_[0][0]代表w1,clif.intercept_代表w0,clif.coef_[0][1]代表w2
#绘制图像,分类点以及决策边界
plt.scatter(x_train[:,0],x_train[:,1],c=y_train)
plt.plot(x1,x2)#这条直线
plt.show()

完整代码:

#第一部分:导包
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.datasets import make_classification
#第二部分:生成数据集
x,y=make_classification(
    n_samples=200,
    n_features=2,
    n_redundant=0,#冗余特征数为0
    n_classes=2,

    n_clusters_per_class=1,#簇设置为1,生成的数据集会在每个类别内形成一个紧凑的簇,类内的样本分布相对较为集中,不会有多个分散的区域。
    random_state=1024
)
#第三部分:划分数据集
x_train,x_test,y_train,y_test=train_test_split(x,y,train_size=0.7,random_state=233,stratify=y)
plt.scatter(x_train[:,0],x_train[:,1],c=y_train)
plt.show()
#开始使用逻辑回归
from sklearn.linear_model import LogisticRegression

clif=LogisticRegression()
clif.fit(x_train,y_train)
score=clif.score(x_train,y_train)
print(score)



#第五部分:开始绘制决策边界

x1=np.linspace(-4,4,1000)
x2=(-clif.coef_[0][0]*x1-clif.intercept_)/clif.coef_[0][1]
#这里的clif.coef_[0][0]代表w1,clif.intercept_代表w0,clif.coef_[0][1]代表w2
#绘制图像,分类点以及决策边界
plt.scatter(x_train[:,0],x_train[:,1],c=y_train)
plt.plot(x1,x2)#这条直线
plt.show()

上述的这条蓝线就是我们的决策边界!

更新版本:

我们可以使用专门绘制决策边界的函数:
 

#第五部分:开始绘制决策边界
#5.1定义一个绘图函数
def decision_boundary_plot(X, y, clf):
    axis_x1_min, axis_x1_max = X[:, 0].min() - 1, X[:, 0].max() + 1
    axis_x2_min, axis_x2_max = X[:, 1].min() - 1, X[:, 1].max() + 1

    x1, x2 = np.meshgrid(np.arange(axis_x1_min, axis_x1_max, 0.01),
                         np.arange(axis_x2_min, axis_x2_max, 0.01))

    z = clf.predict(np.c_[x1.ravel(), x2.ravel()])
    z = z.reshape(x1.shape)

    from matplotlib.colors import ListedColormap
    # 适合二分类的颜色映射
    custom_cmap = ListedColormap(['#F5B9EF', '#F9F9CB'])

    plt.contourf(x1, x2, z, cmap=custom_cmap, alpha=0.8)
    plt.scatter(X[:, 0], X[:, 1], c=y, edgecolors='k', marker='o')
    plt.xlim(axis_x1_min, axis_x1_max)
    plt.ylim(axis_x2_min, axis_x2_max)
    plt.show()

decision_boundary_plot(x, y, clif)

完整代码汇总:

#第一部分:导包
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.datasets import make_classification
#第二部分:生成数据集
x,y=make_classification(
    n_samples=200,
    n_features=2,
    n_redundant=0,#冗余特征数为0
    n_classes=2,

    n_clusters_per_class=1,#簇设置为1,生成的数据集会在每个类别内形成一个紧凑的簇,类内的样本分布相对较为集中,不会有多个分散的区域。
    random_state=1024
)
#第三部分:划分数据集
x_train,x_test,y_train,y_test=train_test_split(x,y,train_size=0.7,random_state=233,stratify=y)
plt.scatter(x_train[:,0],x_train[:,1],c=y_train)
plt.show()
#开始使用逻辑回归
from sklearn.linear_model import LogisticRegression

clif=LogisticRegression()
clif.fit(x_train,y_train)
score=clif.score(x_train,y_train)
print(score)



#第五部分:开始绘制决策边界
#5.1定义一个绘图函数
def decision_boundary_plot(X, y, clf):
    axis_x1_min, axis_x1_max = X[:, 0].min() - 1, X[:, 0].max() + 1
    axis_x2_min, axis_x2_max = X[:, 1].min() - 1, X[:, 1].max() + 1

    x1, x2 = np.meshgrid(np.arange(axis_x1_min, axis_x1_max, 0.01),
                         np.arange(axis_x2_min, axis_x2_max, 0.01))

    z = clf.predict(np.c_[x1.ravel(), x2.ravel()])
    z = z.reshape(x1.shape)

    from matplotlib.colors import ListedColormap
    # 适合二分类的颜色映射
    custom_cmap = ListedColormap(['#F5B9EF', '#F9F9CB'])

    plt.contourf(x1, x2, z, cmap=custom_cmap, alpha=0.8)
    plt.scatter(X[:, 0], X[:, 1], c=y, edgecolors='k', marker='o')
    plt.xlim(axis_x1_min, axis_x1_max)
    plt.ylim(axis_x2_min, axis_x2_max)
    plt.show()

decision_boundary_plot(x, y, clif)

效果更加明显。

第三部分:多分类问题的决策边界

下面先以三分类为例:

新的绘图函数代码:


#第四部分:开始绘制决策边界
#4.1定义一个绘图函数
def decision_boundary_plot(X, y, clf):
    axis_x1_min, axis_x1_max = X[:, 0].min() - 1, X[:, 0].max() + 1
    axis_x2_min, axis_x2_max = X[:, 1].min() - 1, X[:, 1].max() + 1

    x1, x2 = np.meshgrid(np.arange(axis_x1_min, axis_x1_max, 0.01),
                         np.arange(axis_x2_min, axis_x2_max, 0.01))

    z = clf.predict(np.c_[x1.ravel(), x2.ravel()])
    z = z.reshape(x1.shape)

    from matplotlib.colors import ListedColormap
    custom_cmap = ListedColormap(['#F5B9EF', '#8B0000', '#F9F9CB'])  # 修改为深红色

    plt.contourf(x1, x2, z, cmap=custom_cmap, alpha=0.8)
    plt.scatter(X[:, 0], X[:, 1], c=y, edgecolors='k', marker='o')
    plt.xlim(axis_x1_min, axis_x1_max)
    plt.ylim(axis_x2_min, axis_x2_max)
    plt.show()  # 确保最终显示图像


完整代码:

# 第一部分:导包
from matplotlib import pyplot as plt
from sklearn import datasets
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
import numpy as np
# 第二部分:获取数据集
iris = datasets.load_iris()
x = iris.data[:, :2]#只用前两个特征来训练
y = iris.target
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=666)

# 画散点图
plt.scatter(x_train[:, 0], x_train[:, 1], c=y_train)
#plt.show()

# 第三部分:使用 One-vs-One 策略
from sklearn.multiclass import OneVsOneClassifier
clf = OneVsOneClassifier(RandomForestClassifier())
clf.fit(x_train, y_train)



#第四部分:开始绘制决策边界
#4.1定义一个绘图函数
def decision_boundary_plot(X, y, clf):
    axis_x1_min, axis_x1_max = X[:, 0].min() - 1, X[:, 0].max() + 1
    axis_x2_min, axis_x2_max = X[:, 1].min() - 1, X[:, 1].max() + 1

    x1, x2 = np.meshgrid(np.arange(axis_x1_min, axis_x1_max, 0.01),
                         np.arange(axis_x2_min, axis_x2_max, 0.01))

    z = clf.predict(np.c_[x1.ravel(), x2.ravel()])
    z = z.reshape(x1.shape)

    from matplotlib.colors import ListedColormap
    custom_cmap = ListedColormap(['#F5B9EF', '#8B0000', '#F9F9CB'])  # 修改为深红色

    plt.contourf(x1, x2, z, cmap=custom_cmap, alpha=0.8)
    plt.scatter(X[:, 0], X[:, 1], c=y, edgecolors='k', marker='o')
    plt.xlim(axis_x1_min, axis_x1_max)
    plt.ylim(axis_x2_min, axis_x2_max)
    plt.show()  # 确保最终显示图像

# 调用绘图函数
decision_boundary_plot(x, y, clf)

注意:我们可以看到这个图并不像上面的那个图那样平滑,这就是因为出现了“过拟合”现象。

第四部分:多项式逻辑回归的决策边界

完整代码:

#第一部分:导包
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.datasets import make_classification
#第二部分:生成数据集
np.random.seed(0)
x=np.random.normal(0,1,size=(200,2))
y=np.array((x[:,0]**2)+(x[:,1]**2)<2,dtype='int')#圆形区域的判断
#第三部分:划分数据集
x_train,x_test,y_train,y_test=train_test_split(x,y,train_size=0.7,random_state=233,stratify=y)
plt.scatter(x_train[:,0],x_train[:,1],c=y_train)
plt.show()
#开始使用逻辑回归
from sklearn.linear_model import LogisticRegression
'''
clif=LogisticRegression()
clif.fit(x_train,y_train)
score=clif.score(x_train,y_train)
print(score)
'''
#第四部分:开始使用多项式回归
from sklearn.preprocessing import PolynomialFeatures
poly=PolynomialFeatures(degree=2)
poly.fit(x_train,y_train)
x_train_poly=poly.transform(x_train)
x_test_poly=poly.transform(x_test)
clif=LogisticRegression()
clif.fit(x_train_poly,y_train)
#训练集的评分
score=clif.score(x_train_poly,y_train)
print("训练集的评分=",score)
#测试集的评分
score=clif.score(x_test_poly,y_test)
print("测试集的评分=",score)


from sklearn.pipeline import Pipeline
from sklearn.preprocessing import PolynomialFeatures
from sklearn.preprocessing import StandardScaler
clf_pipe = Pipeline([
    ('poly', PolynomialFeatures(degree=2)),#多项式提取模块
    ('scaler', StandardScaler()),#多项式提取模块
    ('LogisticRegression', LogisticRegression())#逻辑回归分类器
])
#训练
clf_pipe.fit(x_train, y_train)


#第五部分:开始绘制决策边界
#5.1定义一个绘图函数
def decision_boundary_plot(X, y, clf):
    axis_x1_min, axis_x1_max = X[:, 0].min() - 1, X[:, 0].max() + 1
    axis_x2_min, axis_x2_max = X[:, 1].min() - 1, X[:, 1].max() + 1

    x1, x2 = np.meshgrid(np.arange(axis_x1_min, axis_x1_max, 0.01),
                         np.arange(axis_x2_min, axis_x2_max, 0.01))

    z = clf.predict(np.c_[x1.ravel(), x2.ravel()])
    z = z.reshape(x1.shape)

    from matplotlib.colors import ListedColormap
    custom_cmap = ListedColormap(['#F5B9EF', '#8B0000', '#F9F9CB'])  # 修改为深红色

    plt.contourf(x1, x2, z, cmap=custom_cmap, alpha=0.8)
    plt.scatter(X[:, 0], X[:, 1], c=y, edgecolors='k', marker='o')
    plt.xlim(axis_x1_min, axis_x1_max)
    plt.ylim(axis_x2_min, axis_x2_max)
    plt.show()  # 确保最终显示图像
decision_boundary_plot(x, y, clf_pipe)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

还不秃顶的计科生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值