"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]