有关LR模型的完整理论知识参考http://blog.csdn.net/cymy001/article/details/78153036

 

首先,LR将线性模型利用sigmoid函数进一步做了非线性映射。

将分类超平面两侧的正负样本点,通过压缩函数转化成了以0.5为分解的两类:类别0和类别1。

这个转化过程见下图:

 

上图给出的是线性边界与LR分布函数(即sigmoid函数)的映射对应关系;同样,对于非线性判定边界sigmoid函数也使用,如下图:

 

然后,再考虑如何去获得模型参数,就是判定边界的参数怎么获得,这里是利用MLE进行求解的,具体求解过程参考本文最初给的理论链接地址。

 

import numpy as np
import matplotlib.pyplot as plt
def sigmoid(z):
    return 1.0 / (1.0 + np.exp(-z))
z = np.arange(-7, 7, 0.1)
phi_z = sigmoid(z)
def cost_1(z):
    return - np.log(sigmoid(z))
def cost_0(z):
    return - np.log(1 - sigmoid(z)) #这里cost_1(z)和cost_0(z)对应上述公式
z = np.arange(-10, 10, 0.1)
phi_z = sigmoid(z)

c1 = [cost_1(x) for x in z]
plt.plot(phi_z, c1, label='J(w) if y=1')

c0 = [cost_0(x) for x in z]
plt.plot(phi_z, c0, linestyle='--', label='J(w) if y=0')

plt.ylim(0.0, 5.1)
plt.xlim([0, 1])
plt.xlabel('$\phi$(z)')
plt.ylabel('J(w)')
plt.legend(loc='best')
plt.tight_layout()
# plt.savefig('./figures/log_cost.png', dpi=300)
plt.show()

 


 

最后,考虑LR进行三分类(多分类)时,是特征的线性组合和sigmoid函数复合的函数进行概率计算和分类的。

 

from IPython.display import Image
%matplotlib inline
# Added version check for recent scikit-learn 0.18 checks
from distutils.version import LooseVersion as Version
from sklearn import __version__ as sklearn_version

from sklearn import datasets
import numpy as np
iris = datasets.load_iris() #http://scikit-learn.org/stable/auto_examples/datasets/plot_iris_dataset.html
X = iris.data[:, [2, 3]]
y = iris.target  #取species列,类别

if Version(sklearn_version) < '0.18':
    from sklearn.cross_validation import train_test_split
else:
    from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.3, random_state=0)  #train_test_split方法分割数据集

from sklearn.preprocessing import StandardScaler
sc = StandardScaler()   #初始化一个对象sc去对数据集作变换
sc.fit(X_train)   #用对象去拟合数据集X_train,并且存下来拟合参数
X_train_std = sc.transform(X_train)
X_test_std = sc.transform(X_test)

from sklearn.linear_model import LogisticRegression
def sigmoid(z):  
    return 1.0 / (1.0 + np.exp(-z)) 
lr = LogisticRegression(C=1000.0, random_state=0)
#http://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html#sklearn.linear_model.LogisticRegression
lr.fit(X_train_std, y_train)

lr.predict_proba(X_test_std[0, :].reshape(1, -1))   #计算该预测实例点属于各类的概率
#Output:array([[  2.05743774e-11,   6.31620264e-02,   9.36837974e-01]])

#验证predict_proba的作用
c=lr.predict_proba(X_test_std[0, :].reshape(1, -1))
c[0,0]+c[0,1]+c[0,2]
#Output:0.99999999999999989

#查看lr模型的特征系数
lr = LogisticRegression(C=1000.0, random_state=0)
#http://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html#sklearn.linear_model.LogisticRegression
lr.fit(X_train_std, y_train)
print(lr.coef_)
#Output:[[-7.34015187 -6.64685581]
#        [ 2.54373335 -2.3421979 ]
#        [ 9.46617627  6.44380858]]

#验证predict_proba工作原理
Zz=np.dot(lr.coef_,X_test_std[0, :].T)+lr.intercept_
np.array(sigmoid(Zz))/sum(np.array(sigmoid(Zz)))
#Output:array([  2.05743774e-11,   6.31620264e-02,   9.36837974e-01])
#此结果就是预测实例点各类的概率

 

 

 

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐