24/8/5算法笔记 One vs Rest和softmax

"One-vs-Rest" (OvR) 是一种常见的多分类问题处理策略,特别是在机器学习领域中。在这种策略中,每个类别都被视为二分类问题,即一个类别与所有其他类别进行区分。例如,如果你有一个包含三个类别的问题,你会创建三个不同的模型,每个模型都试图区分一个特定的类别和所有其他类别的组合。

One VS Rest举例说明

复制代码
import numpy as np
from sklearn.linear_model import LogisticRegression
from sklearn import datasets

from sklearn.model_selection import train_test_split#拆分数据
X,y = datasets.load_iris(return_X_y=True)

X_train,X_test,y_train,y_test = train_test_split(X,y,
                                                 test_size=0.2,#测试比例
                                                random_state=1024)#随机打乱
display(X_train.shape,X_test.shape)
display(y_train.shape,y_test.shape)

display(X_train[:5])
ovr建模
复制代码
from sklearn.metrics import accuracy_score

model = LogisticRegression(multi_class = 'ovr')

model.fit(X_train,y_train)

y_pred = model.predict(X_test)
display(y_test[:10],y_pred[:10])

print('逻辑回归实现方式准确率:',model.score(X_test,y_test))
复制代码
accuracy_score(y_test,y_pred)
复制代码
(y_pred == y_test).mean()
进行概率预测
复制代码
np.set_printoptions(suppress=True)#不用科学计数
proba_ = model.predict_proba(X_test)
#几列,几维
proba_[:10]
概率的手动计算
复制代码
#150个样本
#4表示每个样本特征属性,花瓣长,宽,花萼长款
X.shape
复制代码
#OVR 依然是sigmoid

def sigmoid(z):
    return 1/(1+np.exp(-z))

#截距,
b_ = model.intercept_

#方程系数
#三行表示三个分类器
#四列表示每个方程,4个系数(4个属性,索引对应4个系数)
w_=model.coef_

y_self_pred = X_test.dot(w_.T) + b_

p = sigmoid(y_self_pred)
p = p/p.sum(axis=1).reshape(-1,1)#归一化,和就是1
print('手动计算的概率:\n',p[:5])
print('算法计算的概率:\n',proba_[:5])

softmax软最大(数据-->概率)

Softmax 是一个在机器学习和深度学习中常用的函数,特别是在处理多分类问题时。它将一个向量或一组实数转换成概率分布,使得所有输出值都在0到1之间,并且所有输出值的和为1。

Softmax 函数的定义:

对于一个输入向量 zz,其中包含 KK 个元素 z1,z2,...,zKz1​,z2​,...,zK​,Softmax 函数定义如下:

复制代码
def softmax(x):
    return np.exp(x)/np.exp(z).sum()
z= [3,1,-3]

softmax(z).round(2)
复制代码
import numpy as np
from sklearn import datasets
from sklearn.linear_model import LogisticRegression
#训练数据和测试数据
from sklearn.model_selection import train_test_split

X,y=datasets.load_iris(return_X_y=True)

X_train,X_test,y_train,y_test= train_test_split(X,y,random_state = 1024)

display(X_train.shape,y_train.shape)
display(X_test[:5])
复制代码
model = LogisticRegression(multi_class='multinomial')#多分类,表示softmax进行概率划分

model.fit(X_train,y_train)

print('算法预测的概率:',model.score(X_test,y_test))
print('算法预测测试数据的概率:\n',model.predict_proba(X_test)[:5])
概率手动计算
复制代码
w_ = model.coef_#方程系数

b_ =model.intercept_

def softmax(z):              #计算第一行的和
    return np.exp(z)/np.exp(z).sum(axis=1).reshape(-1,1)

z = X_test.dot(w_.T) + b_
softmax(z)[:5]
相关推荐
wabs6666 小时前
关于贪心算法的思考
算法·贪心算法
社交怪人6 小时前
【判断大小】信息学奥赛一本通C语言解法(题号1043)
算法
lengxuemo7 小时前
ICC2学习笔记之Placement and Optimization
笔记·学习
Snasph7 小时前
GNU Make 用户手册(中文版)
服务器·算法·gnu
江澎涌7 小时前
拆解与 AI 的一次对话
人工智能·算法·程序员
sheeta19987 小时前
LeetCode 每日一题笔记 日期:2026.06.02 题目:3635. 最早完成陆地和水上游乐设施的时间 II
笔记·算法·leetcode
Lsk_Smion8 小时前
力扣实训 _ [102].层序遍历--前序--后续_递归与非递归的实现
数据结构·算法·leetcode
小满Autumn8 小时前
MVVM Light 架构笔记:定位器、命令、消息与 IoC 实践
笔记·学习·架构·c#·上位机·mvvm
小欣加油9 小时前
leetcode3751 范围内总波动值I
java·数据结构·c++·算法·leetcode
kobesdu10 小时前
【ROS2实战笔记-24】ROS2 Launch 实用技巧:条件逻辑与节点动态生成
笔记·ros·slam