【Python机器学习】分类器的不确定估计——决策函数

scikit-learn接口的分类器能够给出预测的不确定度估计,一般来说,分类器会预测一个测试点属于哪个类别,还包括它对这个预测的置信程度。

scikit-learn中有两个函数可以用于获取分类器的不确定度估计:decidion_function和predict_proba。

以一个二维数据集为例:

python 复制代码
import mglearn.tools
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.datasets import make_circles
import numpy as np
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt

X,y=make_circles(noise=0.25,factor=0.5,random_state=1)

y_named=np.array(['type0','type1'])[y]
#所有数组的划分方式都是一致的
X_train,X_test,y_train_named,y_test_named,y_train,y_test=train_test_split(
    X,y_named,y,random_state=0
)
#梯度提升模型
gbrt=GradientBoostingClassifier(random_state=0)
gbrt.fit(X_train,y_train_named)

对于二分类的情况,decidion_function返回值的形状是(n_samples,),为每个样本都返回一个浮点数:

python 复制代码
print('X_test形状:{}'.format(X_test.shape))
print('Decision_function 形状:{}'.format(gbrt.decision_function(X_test).shape))

对于类别1来说,值代表模型对数据点属于"正"类的置信程度。正值代表对正类的偏好,负值代表对反类的偏好,还可以通过查看决策值的正负号来展示预测值:

python 复制代码
print('Decision_function:{}'.format(gbrt.decision_function(X_test)[:10]))
print('正负-Decision_function:{}'.format(gbrt.decision_function(X_test)>0))
print('分类:{}'.format(gbrt.predict(X_test)))

对于二分类问题,反类始终是classes_属性的第一个元素,正类是第二个元素,因此,如果想要完全再现predict的输出,需要利用classes_属性:

python 复制代码
greater_zore=(gbrt.decision_function(X_test)>0).astype(int)
pred=gbrt.classes_[greater_zore]
print('索引是否与输出相同:{}'.format(np.all(pred==gbrt.predict(X_test))))

decidion_function可以在任意范围取值,取决于数据和参数模型:

python 复制代码
decision_function=gbrt.decision_function(X_test)
print('decision_function结果的最大值和最小值:{:.3f}、{:.3f}'.format(np.max(decision_function),np.min(decision_function)))

利用颜色编码画出所有点的decidion_function,还有决策边界:

python 复制代码
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False
fig,axes=plt.subplots(1,2,figsize=(13,5))
mglearn.tools.plot_2d_separator(gbrt,X,ax=axes[0],alpha=.4,fill=True,cm=mglearn.cm2)
scores_image=mglearn.tools.plot_2d_scores(gbrt,X,ax=axes[1],alpha=.4,cm=mglearn.ReBl)
for ax in axes:
    mglearn.discrete_scatter(X_test[:, 0], X_test[:, 1], y_test, markers='^', ax=ax)
    mglearn.discrete_scatter(X_train[:, 0], X_train[:, 1], y_train, markers='o', ax=ax)
    ax.set_xlabel('特征0')
    ax.set_ylabel('特征1')
cbar=plt.colorbar(scores_image,ax=axes.tolist())
axes[0].legend(['测试分类0','测试分类1','训练分类0','训练分类1'],ncol=4,loc=(.1,1.1))
plt.show()
相关推荐
灵感__idea3 小时前
Hello 算法:“走一步看一步”的智慧
前端·javascript·算法
Raink老师4 小时前
【AI面试临阵磨枪】Harness 的环境隔离(沙箱)如何设计?文件、网络、命令、权限四层隔离?
人工智能·ai 面试
人工智能AI技术5 小时前
Python 断言 assert 基础用法
人工智能
清水白石0085 小时前
Python 编程实战全景:从基础语法到插件架构、异步性能与工程最佳实践
开发语言·python·架构
我是发哥哈5 小时前
横向评测:五款主流AI培训课程效果与选型分析
人工智能
GetcharZp5 小时前
告别昂贵显卡!llama.cpp 终极指南:在你的电脑上满速运行大模型!
人工智能
AI木马人5 小时前
3.【Prompt工程实战】如何设计一个可复用的Prompt系统?(避免每次手写提示词)
linux·服务器·人工智能·深度学习·prompt
lwf0061645 小时前
导数学习日记
学习·算法·机器学习
Agent产品评测局5 小时前
临床前同源性反应种属筛选:利用AI Agent加速筛选的实操方案 —— 2026企业级智能体选型与技术落地指南
人工智能·ai·chatgpt
yaoxin5211235 小时前
390. Java IO API - WatchDir 示例
java·前端·python