赞
踩
《老饼讲解机器学习》https://www.bbbdata.com/ml/text/52
目录
sklearn逻辑回归多分类有两种模式:ovr与multinomial。
在multi_class设为auto的时候,如果二分类或者求解器为liblinear时,则为OVR,否则为multinomial,
多分类时ovr与multinomial的区别请参考:《sklearn逻辑回归多分类ovr与multinomial》
本文讲解sklearn逻辑回归以multinomial模式做多分类的一个简单例子,并提取最后的模型表达式
现已采集150组 鸢尾花数据:鸢尾花类别(山鸢尾,杂色鸢尾,弗吉尼亚鸢尾)与四个特征(花萼长度sepal length (cm) 、花萼宽度sepal width (cm)、花瓣长度petal length (cm)、花瓣宽度petal width (cm))。
则我们可以通过采集的数据训练一个决策模型,之后就可以用该模型进行预测鸢尾花类别
数据如下(即sk-learn中的iris数据):
花萼长度 | 花萼宽度 | 花瓣长度 | 花瓣宽度 | 花类别 |
5.1 | 3.5 | 1.4 | 0.2 | 0 |
4.9 | 3.0 | 1.4 | 0.2 | 0 |
4.7 | 3.2 | 1.3 | 0.2 | 0 |
... | ... | ... | ... | ... |
5.0 | 3.3 | 1.4 | 0.2 | 0 |
7.0 | 3.2 | 4.7 | 1.4 | 1 |
6.4 | 3.2 | 4.5 | 1.5 | 1 |
6.9 | 3.1 | 4.9 | 1.5 | 1 |
... | ... | ... | ... | ... |
5.7 | 2.8 | 4.1 | 1.3 | 1 |
6.3 | 3.3 | 6.0 | 2.5 | 2 |
5.8 | 2.7 | 5.1 | 1.9 | 2 |
7.1 | 3.0 | 5.9 | 2.1 | 2 |
... | ... | ... | ... | ... |
5.9 | 3.0 | 5.1 | 1.8 | 2 |
1.数据归一化(用sklearn的逻辑回归一般要作数据归一化)
2.用归一化数据训练逻辑回归模型
3.用训练好的逻辑回归模型预测。
4.模型参数提取
- # -*- coding: utf-8 -*-
- """
- sklearn逻辑回归多分类例子(带模型公式提取)
- """
- from sklearn.linear_model import LogisticRegression
- import numpy as np
- from sklearn.datasets import load_iris
- #----数据加载------
-
- iris = load_iris()
- X = iris.data
- y = iris.target
- #----数据归一化------
- xmin = X.min(axis=0)
- xmax = X.max(axis=0)
- X_norm = (X-xmin)/(xmax-xmin)
-
- #-----训练模型--------------------
- clf = LogisticRegression(random_state=0,multi_class='multinomial')
- clf.fit(X_norm,y)
-
- #------模型预测-------------------------------
- pred_y = clf.predict(X_norm)
- pred_prob_y = clf.predict_proba(X_norm)
-
- #------------提取系数w与阈值b-----------------------
- w_norm = clf.coef_ # 模型系数(对应归一化数据)
- b_norm = clf.intercept_ # 模型阈值(对应归一化数据)
- w = w_norm/(xmax-xmin) # 模型系数(对应原始数据)
- b = b_norm - (w_norm/(xmax - xmin)).dot(xmin) # 模型阈值(对应原始数据)
- # ------------用公式预测------------------------------
- wxb = X.dot(w.T)+ b
- wxb = wxb - wxb.sum(axis=1).reshape((-1, 1)) # 由于担心数值过大会溢出,对wxb作调整
- self_prob_y = np.exp(wxb)/np.exp(wxb).sum(axis=1).reshape((-1, 1))
- self_pred_y = self_prob_y.argmax(axis=1)
-
-
- #------------打印信息--------------------------
- print("\n------模型参数-------")
- print( "模型系数:",w)
- print( "模型阈值:",b)
- print("\n-----验证准确性-------")
- print("提取公式计算的概率与sklearn自带预测概率的最大误差", abs(pred_prob_y-self_prob_y).max())
运行结果:
- ------模型参数-------
- 模型系数: [[-0.3902573 0.65000868 -0.48485313 -1.16130665]
- [ 0.07259933 -0.59884596 0.0709145 -0.19934931]
- [ 0.31765797 -0.05116272 0.41393863 1.36065596]]
- 模型阈值: [ 3.18277053 2.06368594 -5.24645647]
-
-
- -----验证准确性-------
- 提取公式计算的概率与sklearn自带预测概率的最大误差 3.3306690738754696e-16
由模型系数,得到最后的模式表达式为:
P=
类别预测:哪个的值大,就是哪一类。
概率预测: P归一化后即类别。
备注: sklearn担心e的指数部分太大,产生数值溢出,会再做一些处理。详细见代码里的处理。
相关文章
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。