目录
Task04 分类问题
度量分类的指标
1、混淆矩阵
- 真阳性TP:预测值和真实值都为正例;
- 真阴性TN:预测值与真实值都为正例;
- 假阳性FP:预测值为正,实际值为负;
- 假阴性FN:预测值为负,实际值为正;
准确率(Accuracy)
分类正确的样本数占总样本的比例(真阳性和真阴性占总样本比例),即: A C C = T P + T N F P + F N + T P + T N ACC = \frac{TP+TN}{FP+FN+TP+TN} ACC=FP+FN+TP+TNTP+TN.
精度(Precision)
预测为正且分类正确的样本占预测值为正的比例(真阳性占预测为阳性的比例),即: P R E = T P T P + F P PRE = \frac{TP}{TP+FP} PRE=TP+FPTP.
召回率(Recall)
预测为正且分类正确的样本占类别为正的比例(真阳性占实际阳性的比例),即: R E C = T P T P + F N REC = \frac{TP}{TP+FN} REC=TP+FNTP.
F1值
综合衡量精度和召回率,即: F 1 = 2 P R E × R E C P R E + R E C F1 = 2\frac{PRE\times REC}{PRE + REC} F1=2PRE+RECPRE×REC.
ROC曲线
以假阳率为横轴,真阳率为纵轴画出来的曲线,曲线下方面积越大越好
AUC曲线
ROC与x轴之间的面积。
Q1:回归问题和分类问题的联系和区别,如何利用回归问题解决分类问题?
A1:
分类和回归的区别在于输出变量的类型。
连续变量预测称为回归,离散变量预测称为分类。
在回归问题中,因变量是连续性变量,我们需要预测
E
(
Y
∣
X
)
E(Y|X)
E(Y∣X)是一个连续的实数,但是在分类问题中,我们往往是通过已知X的信息预测Y的类别,往往是一个离散集合中的某个元素。如:是否患癌症,图片是猫还是狗等。一个很自然的想法是能否用线性回归去处理分类问题,
举个例子:
预测明天的气温是多少度,这是一个回归任务;
预测明天是阴、晴还是雨,就是一个分类任务。
将回归的线性关系加一个激活函数(如sigmoid),转变为分类问题。
Q2:为什么分类问题的损失函数可以是交叉熵而不是均方误差?
Q4:从0推导svm
A4:
-
支持向量机SVM:
支持向量机SVM是20世纪90年代在计算机界发展起来的一种分类算法,在许多问题中都被证明有较好的效果,被认为是适应性最广的算法之一。
支持向量机的基本原理非常简单,如图所视,白色和蓝色的点各为一类,我们的目标是找到一个分割平面将两个类别分开。通常来说,如果数据本身是线性可分的,那么事实上存在无数个这样的超平面。这是因为给定一个分割平面稍微上移下移或旋转这个超平面,只要不接触这些观测点,仍然可以将数据分开。一个很自然的想法就是找到最大间隔超平面,即找到一个分割平面距离最近的观测点最远。下面我们来严格推导:
我们根据距离超平米那最近的点,只要同时缩放w和b可以得到: w T x 1 + b = 1 w^Tx_1 + b = 1 wTx1+b=1与 w T x 2 + b = − 1 w^Tx_2+b = -1 wTx2+b=−1,因此:
w T x 1 + b = 1 w T x 2 + b = − 1 ( w T x 1 + b ) − ( w T x 2 + b ) = 2 w T ( x 1 − x 2 ) = 2 w T ( x 1 − x 2 ) = ∥ w ∥ 2 ∥ x 1 − x 2 ∥ 2 cos θ = 2 ∥ x 1 − x 2 ∥ 2 cos θ = 2 ∥ w ∥ 2 d 1 = d 2 = ∥ x 1 − x 2 ∥ 2 cos θ 2 = 2 ∥ w ∥ 2 2 = 1 ∥ w ∥ 2 d 1 + d 2 = 2 ∥ w ∥ 2 \begin{array}{l} w^{T} x_{1}+b=1 \\ w^{T} x_{2}+b=-1 \\ \left(w^{T} x_{1}+b\right)-\left(w^{T} x_{2}+b\right)=2 \\ w^{T}\left(x_{1}-x_{2}\right)=2 \\ \qquad \begin{array}{l} w^{T}\left(x_{1}-x_{2}\right)=\|w\|_{2}\left\|x_{1}-x_{2}\right\|_{2} \cos \theta=2 \\ \left\|x_{1}-x_{2}\right\|_{2} \cos \theta=\frac{2}{\|w\|_{2}} \end{array} \\ \qquad \begin{array}{l} d_{1}=d_{2}=\frac{\left\|x_{1}-x_{2}\right\|_{2} \cos \theta}{2}=\frac{\frac{2}{\|w\|_{2}}}{2}=\frac{1}{\|w\|_{2}} \\ d_{1}+d_{2}=\frac{2}{\|w\|_{2}} \end{array} \end{array} wTx1+b=1wTx2+b=−1(wTx1+b)−(wTx2+b)=2wT(x1−x2)=2wT(x1−x2)=∥w∥2∥x1−x2∥2cosθ=2∥x1−x2∥2cosθ=∥w∥22d1=d2=2∥x1−x2∥2cosθ=2∥w∥22=∥w∥21d1+d2=∥w∥22
由此可知道SVM模型的具体形式:
min w , b 1 2 ∥ w ∥ 2 s.t. y ( i ) ( w T x ( i ) + b ) ≥ 1 , i = 1 , … , n \begin{aligned} \min _{w, b} & \frac{1}{2}\|w\|^{2} \\ \text { s.t. } & y^{(i)}\left(w^{T} x^{(i)}+b\right) \geq 1, \quad i=1, \ldots, n \end{aligned} w,bmin s.t. 21∥w∥2y(i)(wTx(i)+b)≥1,i=1,…,n
可以将约束条件写为: $g_{i}(w)=-y{(i)}\left(w{T} x^{(i)}+b\right)+1 \leq 0 $
可以将优化问题拉格朗日化
L ( w , b , α ) = 1 2 ∥ w ∥ 2 − ∑ i = 1 n α i [ y ( i ) ( w T x ( i ) + b ) − 1 ] \mathcal{L}(w, b, \alpha)=\frac{1}{2}\|w\|^{2}-\sum_{i=1}^{n} \alpha_{i}\left[y^{(i)}\left(w^{T} x^{(i)}+b\right)-1\right] L(w,b,α)=21∥w∥2−i=1∑nαi[y(i)(wTx(i)+b)−1]
因此:
L ( w , b , α ) = 1 2 ∥ w ∥ 2 − ∑ i = 1 n α i [ y ( i ) ( w T x ( i ) + b ) − 1 ] \mathcal{L}(w, b, \alpha)=\frac{1}{2}\|w\|^{2}-\sum_{i=1}^{n} \alpha_{i}\left[y^{(i)}\left(w^{T} x^{(i)}+b\right)-1\right] L(w,b,α)=21∥w∥2−i=1∑nαi[y(i)(wTx(i)+b)−1]
欲构造 dual 问题, 首先求拉格朗日化的问题中 $\mathrm{w} $ 和 $\mathrm{b} $ 的值, 对 $ \mathrm{w}$ 求梯度, 令梯度为 0, 可求得 w:
对 b 求梯度, 令梯度为 0, 可得:
∂ ∂ b L ( w , b , α ) = ∑ i = 1 n α i y ( i ) = 0 \frac{\partial}{\partial b} \mathcal{L}(w, b, \alpha)=\sum_{i=1}^{n} \alpha_{i} y^{(i)}=0 ∂b∂L(w,b,α)=i=1∑nαiy(i)=0将 w \mathrm{w} w 带入拉格朗日化的原问题可得
L ( w , b , α ) = ∑ i = 1 n α i − 1 2 ∑ i , j = 1 n y ( i ) y ( j ) α i α j ( x ( i ) ) T x ( j ) − b ∑ i = 1 n α i y ( i ) L ( w , b , α ) = ∑ i = 1 n α i − 1 2 ∑ i , j = 1 n y ( i ) y ( j ) α i α j ( x ( i ) ) T x ( j ) \begin{array}{l} \mathcal{L}(w, b, \alpha)=\sum_{i=1}^{n} \alpha_{i}-\frac{1}{2} \sum_{i, j=1}^{n} y^{(i)} y^{(j)} \alpha_{i} \alpha_{j}\left(x^{(i)}\right)^{T} x^{(j)}-b \sum_{i=1}^{n} \alpha_{i} y^{(i)} \\ \mathcal{L}(w, b, \alpha)=\sum_{i=1}^{n} \alpha_{i}-\frac{1}{2} \sum_{i, j=1}^{n} y^{(i)} y^{(j)} \alpha_{i} \alpha_{j}\left(x^{(i)}\right)^{T} x^{(j)} \end{array} L(w,b,α)=∑i=1nαi−21∑i,j=1ny(i)y(j)αiαj(x(i))Tx(j)−b∑i=1nαiy(i)L(w,b,α)=∑i=1nαi−21∑i,j=1ny(i)y(j)αiαj(x(i))Tx(j)
因此:
对拉格朗日化的原问题求最小值, 得到了 w , 现在可以构造 dual 问題 max α W ( α ) = ∑ i = 1 n α i − 1 2 ∑ i , j = 1 n y ( i ) y ( j ) α i α j ⟨ x ( i ) , x ( j ) ⟩ s.t. α i ≥ 0 , i = 1 , … , n ∑ i = 1 n α i y ( i ) = 0 可以推导出 b的值为: b ∗ = − max i : y ( i ) = − 1 w ∗ T x ( i ) + min i : y ( i ) = 1 w ∗ T x ( i ) 2 SVM的决策子如下,值的符号为类别. w T x + b = ( ∑ i = 1 n α i y ( i ) x ( i ) ) T x + b = ∑ i = 1 n α i y ( i ) ⟨ x ( i ) , x ⟩ + b \begin{aligned} &\text { 对拉格朗日化的原问题求最小值, 得到了 } \mathrm{w} \text { , 现在可以构造 dual 问題 }\\ &\begin{aligned} \max _{\alpha} & W(\alpha)=\sum_{i=1}^{n} \alpha_{i}-\frac{1}{2} \sum_{i, j=1}^{n} y^{(i)} y^{(j)} \alpha_{i} \alpha_{j}\left\langle x^{(i)}, x^{(j)}\right\rangle \\ \text { s.t. } & \alpha_{i} \geq 0, \quad i=1, \ldots, n \\ & \sum_{i=1}^{n} \alpha_{i} y^{(i)}=0 \end{aligned}\\ &\text { 可以推导出 b的值为: } b^{*}=-\frac{\max _{i: y^{(i)}=-1} w^{* T} x^{(i)}+\min _{i: y^{(i)}=1} w^{* T} x^{(i)}}{2}\\ &\begin{array}{r} \text { SVM的决策子如下,值的符号为类别. } \\ \qquad w^{T} x+b=\left(\sum_{i=1}^{n} \alpha_{i} y^{(i)} x^{(i)}\right)^{T} x+b=\sum_{i=1}^{n} \alpha_{i} y^{(i)}\left\langle x^{(i)}, x\right\rangle+b \end{array} \end{aligned} 对拉格朗日化的原问题求最小值, 得到了 w , 现在可以构造 dual 问題 αmax s.t. W(α)=i=1∑nαi−21i,j=1∑ny(i)y(j)αiαj⟨x(i),x(j)⟩αi≥0,i=1,…,ni=1∑nαiy(i)=0 可以推导出 b的值为: b∗=−2maxi:y(i)=−1w∗Tx(i)+mini:y(i)=1w∗Tx(i) SVM的决策子如下,值的符号为类别. wTx+b=(∑i=1nαiy(i)x(i))Tx+b=∑i=1nαiy(i)⟨x(i),x⟩+b
Q6:python+numpy实现逻辑回归
A6:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import scipy
df = pd.read_csv('./ex2data1.txt')
m = len(df) # 数据总数
pos = df[(df['y'] == 1)]
neg = df[(df['y'] == 0)]
x = np.mat(df.iloc[:, 0:-1])
y = np.mat(df.iloc[:, -1]).T # m*1 mat
X = np.hstack((np.ones((m, 1)), x)) # m*n mat
#theta = np.zeros((X.shape[1], 1)) # n*1 mat
theta=np.array([0,0,0]).reshape(3,1)
cost_history = []
def sigmoid(x):
return 1.0 / (1 + np.exp(-x))
def J(theta,X,y,mylambda=0):
theta=theta.reshape(3,1)
#print(theta.shape,X.shape,y.shape)
return -1*float((y.T*np.log(h(X,theta))+(1-y.T)*np.log(1-h(X,theta)))/m)+float(theta.T.dot(theta))*mylambda/(2*m)
def h(X,theta):
return sigmoid(X.dot(theta))
from scipy import optimize
def opt():
global theta
result = optimize.fmin(J, x0=theta, args=(X, y,0.), maxiter=400, full_output=True)
theta=result[0]
print(theta)
def plot():
fig = plt.figure()
plt.plot(pos.iloc[:, 0], pos.iloc[:, 1], 'k+', label='pos')
plt.plot(neg.iloc[:, 0], neg.iloc[:, 1], 'yo', label='neg')
# 画边界
x0 = [float(df.x0.min()), float(df.x0.max())]
x1 = [float(-1*theta[0]/theta[2] -
theta[1]/theta[2]*each) for each in x0]
plt.plot(x0, x1)
plt.grid(True)
plt.show()
opt()
plot()