逻辑斯蒂回归
逻辑斯蒂回归通常用来解决分类问题,是将样本的特征和样本发生的概率联系起来
值域是(0,1);t>0时,p>0.5; t<0时,p<0.5
该假设函数预测的是分类y=1的发生概率的大小
决策边界
决策边界是用来划分样本的边界分为线性决策边界(y=h_threta(x)-3+x1+x2>=0)和非线性决策边界(y=h_threta(x)-1+x12+x22>=0)
逻辑回归的损失函数
逻辑回归损失函数的梯度
scikit-learn实现逻辑回归
scikit-learn逻辑回归多分类问题的解决(ovr策略和ovo策略)
独立的OvO and OvR
OVR训练拟合过程
OVO与OVR预测过程
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
iris = datasets.load_iris()
X = iris.data
y = iris.target
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test = train_test_split(X,y,random_state=666)
#ovr (One versus rest策略)
log_reg = LogisticRegression(multi_class=‘ovr’) # one versus rest
log_reg.fit(X_train,y_train)
y_predict = log_reg.predict(X_test)
log_reg.score(X_test,y_test)
#ovo (One versus one策略)====>更准确!
log_reg = LogisticRegression(multi_class=‘multinomial’,
solver=“newton-cg”)
在逻辑回归中使用多项式特征
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(666)
X = np.random.normal(0, 1, size=(200, 2))
y = np.array((X[:,0]**2+X[:,1])<1.5, dtype=‘int’)
for _ in range(20):
y[np.random.randint(200)] = 1
plt.scatter(X[y0,0], X[y0,1])
plt.scatter(X[y1,0], X[y1,1])
plt.show()
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=666)
#绘制决策边界的函数
def plot_decision_boundary(model, axis):
x0, x1 = np.meshgrid(
np.linspace(axis[0], axis[1], int((axis[1]-axis[0])*100)).reshape(-1, 1),
np.linspace(axis[2], axis[3], int((axis[3]-axis[2])*100)).reshape(-1, 1),
)
X_new = np.c_[x0.ravel(), x1.ravel()]
y_predict = model.predict(X_new)
zz = y_predict.reshape(x0.shape)
from matplotlib.colors import ListedColormap
custom_cmap = ListedColormap([‘#EF9A9A’,‘#FFF59D’,‘#90CAF9’])
plt.contourf(x0, x1, zz, linewidth=5, cmap=custom_cmap)
#scikit-learn中的逻辑回归
from sklearn.linear_model import LogisticRegression
log_reg = LogisticRegression()
log_reg.fit(X_train, y_train)
log_reg.score(X_train,y_train)
log_reg.score(X_test,y_test)
log_reg.predict(X_test)
plot_decision_boundary(log_reg, axis=[-4, 4, -4, 4])
plt.scatter(X[y0,0], X[y0,1])
plt.scatter(X[y1,0], X[y1,1])
plt.show()
#使用多项式回归的逻辑回归
def PolynomialLogisticRegression(degree, C, penalty=‘l2’):
return Pipeline([
(‘poly’, PolynomialFeatures(degree=degree)),
(‘std_scaler’, StandardScaler()),
(‘log_reg’, LogisticRegression(C=C, penalty=penalty))
])
poly_log_reg = PolynomialLogisticRegression(degree=20, C=0.1, penalty=‘l1’)
poly_log_reg.fit(X_train, y_train)
poly_log_reg.score(X_train, y_train)
poly_log_reg.score(X_test, y_test)
plot_decision_boundary(poly_log_reg, axis=[-4, 4, -4, 4])
plt.scatter(X[y0,0], X[y0,1])
plt.scatter(X[y1,0], X[y1,1])
plt.show()
支持向量机(SVM)
提出原因:不适定问题(决策边界不唯一)
Hard Margin SVM
解决的是线性可分问题:存在一根直线或超平面(在高维空间中)可以将样本点划分,此时才定义出了margin,这样的算法通常称为Hard Margin SVM.
Soft Margin SVM
在真实情况下,很多数据是线性不可分的,此时,SVM可以改进为Soft Margin SVM.
Soft Margin SVM和
SVM的正则化
Soft Margin SVM:有了“双标”,wx+b=1负责SVM的工作,wx+b=1-eta负责容错空间
我们希望有容错空间,但容错空间又不能太大
前半部分兼顾了Hard Margin SVM对应的最优化内容(SVM的思想所要干的事情);后半部分使得SVM可以容忍一定程度的错误,但容错空间要尽量的小,二者要尽量取得平衡。
SVM的正则化
正则项前面的常数C,C越大说明相应的容错空间越小,若C取正无穷,则"逼迫"着每个eta都必须等于0,此时的Soft Margin SVM就变成了Hard Margin SVM.
scikit-learn中的SVM
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
iris = datasets.load_iris()
X = iris.data
y = iris.target
X = X[y<2,:2]
y = y[y<2]
#涉及距离故要标准化
from sklearn.preprocessing import StandardScaler
standardScaler = StandardScaler()
standardScaler.fit(X)
X_standard = standardScaler.transform(X)
from sklearn.svm import LinearSVC
svc = LinearSVC(C=1e9)
svc.fit(X_standard,y)
Hard SVM的最优化公式推导
n维空间中点到直线的距离
SVM的公式推导
目标:最大化margin(2d)
参考ppt
数学扩展
注意:此时的w其实是去wd
有条件的求极值问题的最简单方法是"拉格朗日乘子法"or"拉普拉斯算子"