一篇文章带你精通逻辑回归多分类softMax

1. 逻辑回归多分类softMax

Softmax 回归是另一种做多分类的算法。
        我们知道,对于伯努利分布,我们采用 Logistic 回归建模。那么我们应该如何处理多分类问题?
        对于这种多项分布我们使用 softmax 回归建模。

        1.1 One Vs Rest 举例说明

        1. 导入依赖

import numpy as np
from sklearn.linear_model import LogisticRegression
from sklearn import datasets

        2. 导入数据

#拆分数据 随机打乱顺序
from sklearn.model_selection import train_test_split
X,y=datasets.load_iris(return_X_y=True) # 150个样本 4类类别
#random_state 随机打乱顺序固定 再次运行不在随机
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.2,random_state=1024)
display(X_train,X_test,y_train,y_test)

        3. ovr建模

#metrics模型评估  accuracy_score准确率分数
from sklearn.metrics import accuracy_score

这里我们需要选择ovr(二分类)

y_pred是模型训练出来的值于测试的y值进行对比

model=LogisticRegression(multi_class ='ovr')
model.fit(X_train,y_train)
y_pred=model.predict(X_test)
display(y_pred[:10],y_test[:10])
print('逻辑回归ovr实现方式准确率:',model.score(X_test,y_test))

使用sklearn下的 accuracy_score也可以打分
        4 . 进行概率预测
y_pred[:10]

展示哪一列的最大
np.set_printoptions(suppress=True)
proba_=model.predict_proba(X_test)
#这里为概率
proba_[:10]

        1.2 One Vs Rest 概率手动计算

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

#截距,bias偏差=截距
b_=model.intercept_
#三行:三个分类器(方程)
#四列:每个方程,有四个系数
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)
display(p[:10])
display(proba_[:10])

2. 多分类SoftMax回归

        2.1 演示softmax函数计算

def softMax(z):
    return np.exp(z)/np.exp(z).sum()
z=[3,1,-3]
softMax(z).round(2)

        2.2  加载数据,鸢尾花

import numpy as np
from sklearn import datasets
from sklearn.linear_model import LogisticRegression
#训练数据和测试数据的对比
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
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,X_test.shape,y_train.shape,y_test.shape)

        2.3 模型的训练和预测

model=LogisticRegression(multi_class="multinomial")#多分类 表示softmax进行概率划分
model.fit(X_train,y_train)
y_prd=model.predict(X_test)
print('sklearn评估准确率',accuracy_score(y_test,y_prd))
print('算法预测的准确率',model.score(X_test,y_test))
print('算法的预测测试数据的概率:',model.predict_proba(X_test[:5]))

        2.4 概率手动计算

#方程系数
w_=model.coef_
#方程截距
b_=model.intercept_
#z表示数组
def softmax(z):
    #这里需要指定轴 因为如果不指定会计算整个数组的和为分母导致值变小  
    return np.exp(z)/np.exp(z).sum(axis=1).reshape(-1,1)

z=X_test.dot(w_.T)+b_
p=softmax(z)
p[:10]

3. 作业

        通过逻辑斯蒂回归实现葡萄酒分类

import numpy as np
from sklearn import datasets
from sklearn.linear_model import LogisticRegression
#训练数据和测试数据的对比
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import scale
X,y = datasets.load_wine(return_X_y=True)
X=scale(X)
X_train, X_test, y_train, y_test =train_test_split(X,y,test_size=0.2)
display(X_train.shape,X_test.shape,y_train.shape,y_test.shape)
model=LogisticRegression(multi_class="multinomial")
model.fit(X_train,y_train)
model.score(X_test,y_test)

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值