#1
# To support both python 2 and python 3
from __future__ import division, print_function, unicode_literals
# Common imports
import numpy as np
import os
# to make this notebook's output stable across runs
np.random.seed(42)
# To plot pretty figures
%matplotlib inline
import matplotlib as mpl
import matplotlib.pyplot as plt
mpl.rc('axes', labelsize=14)
mpl.rc('xtick', labelsize=12)
mpl.rc('ytick', labelsize=12)
# Where to save the figures
PROJECT_ROOT_DIR = "."
CHAPTER_ID = "training_linear_models"
#2
t = np.linspace(-10, 10, 100)
sig = 1 / (1 + np.exp(-t))
plt.figure(figsize=(9, 3))
plt.plot([-10, 10], [0, 0], "k-")
plt.plot([-10, 10], [0.5, 0.5], "k:")
plt.plot([-10, 10], [1, 1], "k:")
plt.plot([0, 0], [-1.1, 1.1], "k-")
plt.plot(t, sig, "b-", linewidth=2, label=r"$\sigma(t) = \frac{1}{1 + e^{-t}}$")
plt.xlabel("t")
plt.legend(loc="upper left", fontsize=20)
plt.axis([-10, 10, -0.1, 1.1])
plt.show()
如果把一个0的样本预测到将近1,或者把1的预测到将近0,都会造成很大的损失函数。
整个训练集的损失函数就是所有训练样本损失函数的平均值,公式如下:
这种利用对数的方法计算损失的损失函数称为对数损失。
该损失函数是凸函数,可以使用梯度下降法直接求解。
损失函数关于θ_j的偏导数(梯度向量)为:
from sklearn import datasets
iris = datasets.load_iris()#使用鸢尾花数据
X=iris.data[:,3:] #筛选最后一列
y=(iris.target == 2) #二分化处理,第三种花
from sklearn.linear_model import LogisticRegression#逻辑回归
log_reg = LogisticRegression(random_state=42)#初始化回归模型随机种子
log_reg.fit(X,y)#训练模型
LogisticRegression(random_state=42)
X_new = np.linspace(0,3,1000).reshape(-1,1)#等差数列产生一系列数据
y_pred = log_reg.predict(X_new)#预测值
y_pred
y_proba = log_reg.predict_proba(X_new) #概率?
y_proba
#3绘制曲线
X_new = np.linspace(0, 3, 1000).reshape(-1, 1)
y_proba = log_reg.predict_proba(X_new)
decision_boundary = X_new[y_proba[:, 1] >= 0.5][0]
plt.figure(figsize=(8, 3))
plt.plot(X[y==0], y[y==0], "bs")
plt.plot(X[y==1], y[y==1], "g^")
plt.plot([decision_boundary, decision_boundary], [-1, 2], "k:", linewidth=2)
plt.plot(X_new, y_proba[:, 1], "g-", linewidth=2, label="Iris-Virginica")
plt.plot(X_new, y_proba[:, 0], "b--", linewidth=2, label="Not Iris-Virginica")
plt.text(decision_boundary+0.02, 0.15, "Decision boundary", fontsize=14, color="k", ha="center")
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.xlabel("Petal width (cm)", fontsize=14)
plt.ylabel("Probability", fontsize=14)
plt.legend(loc="center left", fontsize=14)
plt.axis([0, 3, -0.02, 1.02])
plt.show()
1.6左右可看成决策边界
#4
from sklearn.linear_model import LogisticRegression
X = iris["data"][:, (2, 3)] # petal length, petal width
y = (iris["target"] == 2).astype(np.int)
log_reg = LogisticRegression(solver="liblinear", C=10**10, random_state=42)
log_reg.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_reg.predict_proba(X_new)
plt.figure(figsize=(10, 4))
plt.plot(X[y==0, 0], X[y==0, 1], "bs")
plt.plot(X[y==1, 0], X[y==1, 1], "g^")
zz = y_proba[:, 1].reshape(x0.shape)
contour = plt.contour(x0, x1, zz, cmap=plt.cm.brg)
left_right = np.array([2.9, 7])
boundary = -(log_reg.coef_[0][0] * left_right + log_reg.intercept_[0]) / log_reg.coef_[0][1]
plt.clabel(contour, inline=1, fontsize=12)
plt.plot(left_right, boundary, "k--", linewidth=3)
plt.text(3.5, 1.5, "Not Iris-Virginica", fontsize=14, color="b", ha="center")
plt.text(6.5, 2.3, "Iris-Virginica", fontsize=14, color="g", ha="center")
plt.xlabel("Petal length", fontsize=14)
plt.ylabel("Petal width", fontsize=14)
plt.axis([2.9, 7, 0.8, 2.7])
plt.show()
#多分类
X = iris.data[:,(2,3)]#保留两列,2和3
y = iris.target
multi_log_reg = LogisticRegression(multi_class = 'ovr',C=10,random_state = 42)#默认‘l2',岭回归,ovr:one-vs-rest(OvR)多分类器
multi_log_reg.fit(X,y)
LogisticRegression(C=10, multi_class='ovr', random_state=42)
multi_log_reg.score(X,y)#分数
0.96
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 = multi_log_reg.predict_proba(X_new)
y_predict = multi_log_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()
Softmax回归是Logistic回归的一般形式,也叫多项式(多元)logistic 回归,可以表示为:
其中 表示k类别的softmax分数
学习链接:https://zhuanlan.zhihu.com/p/98061179
Softmax 回归分类器将估计概率最高的那类作为预测结果
Softmax回归的损失函数采用交叉熵的形式。主要用来衡量类别概率与目标类别的匹配程度:
Sklearn下使用梯度下降法训练softmax回归LogisticRegression(multi_class=“multinomial”,solver=“lbfgs”, C=10, penalty=‘l2’, random_state=42)
•如果想要使用softmax需要设置multi_class参数为“multinomial”(多项式损失)。
•指定一个支持 Softmax回归的求解器,例如“lbfgs”求解器。
•一般情况,使用Softmax回归要比OvR效果要好。
“liblinear”应用了坐标下降算法(Coordinate Descent, CD),并基于scikit-learn内附的高性能C++库LIBLINEAR library实现。
“newton-cg”、“sag”和“lbfgs”求解器仅支持L2正则化与原始公式。“liblinear”求解器支持L1和L2正则化。
“multinomial”选项仅由“lbfgs”、“sag”和“newton-cg”求解器支持。
“sag”求解器基于平均随机梯度下降算法(Stochastic Average Gradient descent),在样本量大且特征数多的大数据集下计算速度更快。
“saga” 求解器是“sag”的一类变体,它支持非平滑(non-smooth)的L1正则选项 penalty="l1" 。因此对于稀疏多项式 logistic 回归 ,往往选用该求解器。
“saga” 一般都是最佳的选择。
softmax_reg = LogisticRegression(multi_class = 'multinomial',solver='lbfgs',C=10,random_state=42)
softmax_reg.fit(X,y)
softmax_reg.predict([[5,2]])#第二类
array([2]
softmax_reg.predict_proba([[5,2]])
#预测概率
array([[6.38014896e-07, 5.74929995e-02, 9.42506362e-01]])
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()