1. 逻辑回归多分类softMax
Softmax 回归是另一种做多分类的算法。
我们知道,对于伯努利分布,我们采用 Logistic 回归建模。那么我们应该如何处理多分类问题?对于这种多项分布我们使用 softmax 回归建模。
![](https://i-blog.csdnimg.cn/direct/7482cd2b6f2946fe988a2edd781f21b9.png)
![](https://i-blog.csdnimg.cn/direct/53caa4e843e34fdfbdc9432f94c464d7.png)
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也可以打分
![](https://i-blog.csdnimg.cn/direct/dee05b4f97a348faa3ced8f4d70847ff.png)
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)