1.逻辑回归简介

逻辑回归是一个经典的二分类算法,也是一个简单的比较基础的模型。
因此我们可以在选择模型时先使用该模型作为基准,将自己的模型与该模型的结果进行对比来做实验。
这不是叫回归吗,怎么就分类了。
其实回归和分类可以转化的,比如我们将成绩的区间设为[0,100],定义[0,60]为坏学生,[61,100]为好学生,则我将该回归任务设为了一个分类任务。那么我们在数学上如何表现该信息呢?

1.1sigmoid函数

公式 g(z)=\frac{1}{1+e^{-z}}

该函数可以把任意实数映射到[0,1],
即我可以将一个值转化成一个概率值。

实验

鸢尾花数据集:

总共有三种花,每种花有四个特征。

问题来了,二分类怎么搞成三分类。

一个简单的想法:对于每个类进行二分类,看是否为该类或者其他类。

很明显该方法略显愚蠢。
所以我们要用一个简单地算法:

具体代码:

import matplotlib
import matplotlib.pyplot as plt
from sklearn import datasets
import numpy as np
iris=datasets.load_iris

print(iris)#打印一下数据集的具体内容

X=iris['data'][:,3:] #加载所有样本的某个特征
y=(iris['target']==2).astype(np.int) #第二类花为1,其他类花为0

from sklearn.linear_model import LogisticRegression
log_res=LogisticRegression()
log_res.fit(X,y)#首先得到一个模型

X_new =np.linspace(0,3,1000).reshape(-1,1) #生成一个一维的x数据
y_proba=log_res.predict_proba(X_new) #预测的概率值

#可通过绘图直观展示特征和概率的走势
plt.figure(figsize=(10,5)) #先整个大的画布
decision_boundary=X_new[y_proba[:,1]>=0.5][0] #找到概率大于0.5所在第一个位置设为分界点
plt.plot([decision_boundary,decision_boundary],[-1,2],'k:',linewidth==2)#画出该条分界线
plt.plot(X_new,y_proba[:,1],'g-',label='virginica')
plt.plot(X_new,y_proba[:,0],'b--',label='not virginica')
plt.arrow(decision_boundary,0.08,-0.3,0,head_width=0.05,head_length=0.1,fc='b',ec='b')#箭头绘制
plt.arrow(decision_boundary,0.92,0.3,0,head_width=0.05,head_length=0.1,fc='g',ec='g')
plt.text(decision_boundary+0.02,0.15,'Decision Boundary',fontsize=16,color='k',ha='center')
plt.xlabel('Peta width(cm)',fontsize=16)
plt.ylabel('y_proba')
plt.axis([0,3,-0.02,1.02])#坐标轴范围
plt.legend(loc='center left',fontsize=16)

决策边界绘制

X=iris['data'][:,(2,3)]
y=(iris['target']==2).astype(np.int)
from sklearn.linear_model import LogisticRegression
log_res=LogisticRegression()
log_res.fit(X,y)

#构建坐标数据

x0,x1 = np.meshgrid(np.linspace(2.9,7,500).reshape(-1,1),np.linspace(0.8,2.7,200).reshape(-1,1))
X_new=np.c_[x0.ravel(),x1.ravel()]
y_proba=log.res.predict_proba(X_new)
plt.figure(figsize=(10,4))
plt.plot(X[y==0

Softmax方法

p_k=\frac{e^{s_k(x)}}{\sum(e^{s(x)})}

X = iris['data'][:,(2,3)]
y = iris['target']
softmax_reg = LogisticRegression(multi_class = 'multinomial',solver='lbfgs')
softmax_reg.fit(X,y)
softmax_reg.predict([[5,2]])
softmax_reg.predict_proba([[5,2]])
x0, x1 = np.meshgrid(
        np.linspace(0, 8, 500).reshape(-1, 1),
        np.linspace(0, 3.5, 200).reshape(-1, 1),
    )
X_new = np.c_[x0.ravel(), x1.ravel()]

y_proba = softmax_reg.predict_proba(X_new)
y_predict = softmax_reg.predict(X_new)

zz1 = y_proba[:, 1].reshape(x0.shape)
zz = y_predict.reshape(x0.shape)

plt.figure(figsize=(10, 4))
plt.plot(X[y==2, 0], X[y==2, 1], "g^", label="Iris-Virginica")
plt.plot(X[y==1, 0], X[y==1, 1], "bs", label="Iris-Versicolor")
plt.plot(X[y==0, 0], X[y==0, 1], "yo", label="Iris-Setosa")

from matplotlib.colors import ListedColormap
custom_cmap = ListedColormap(['#fafab0','#9898ff','#a0faa0'])

plt.contourf(x0, x1, zz, cmap=custom_cmap)
contour = plt.contour(x0, x1, zz1, cmap=plt.cm.brg)
plt.clabel(contour, inline=1, fontsize=12)
plt.xlabel("Petal length", fontsize=14)
plt.ylabel("Petal width", fontsize=14)
plt.legend(loc="center left", fontsize=14)
plt.axis([0, 7, 0, 3.5])
plt.show()