机器学习--逻辑回归

环境:jupyter notebook

1.从这部分内容开始,我们将学习构建模型的方法——算法。

2.回归能处理分类任务么?(

广义线性模型:y=g(w^{T}*x+b) 其中 g() 称为“联系函数” (link function )
结论:要 使用回归来执行分类任务,只需考虑寻找一个联系函数将分类标记与线性回归得出的预测值联系起来即可,即将预测值 离散化
对于二分类任务,满足以上需求的最理想 g() 函数为“单位跃阶函数” (unit-step function)
问题 1 单位跃阶函数并不是 连续函数,无法使用梯度下降进行模型训练。
问题 2 :使用 单位跃阶函数进行分类任务会对异常值敏感。
问题3:逻辑回归不处理回归问题,处理分类问题
希望1:加入联系函数后,模型是连续的,并处处可导,单调性不变。
希望 2 :联系 函数应该降低线性模型对于异常点的敏感性。

什么是逻辑回归

逻辑 回归( Logistic Regression )是处理 分类 问题的 算法。
逻辑回归的表达式:

        

使用 σ 函数作为连接函数。
σ 函数叫做 sigmoid 函数,可以将函数值转换到 [0,1] 区间,并且满足处处可导和单调性。

Sigmoid函数

#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()
 
   

逻辑回归(Logistic Regression

Logistic 回归模型计算输入特征的加权和(加上偏差项),输出一个 0 1 之间的数表示概率。
逻辑回归 的表达式也叫做其概率 估计 公式。
逻辑回归满足连续、可导、单调,以及对异常值不敏感。
机器学习--逻辑回归_第1张图片 机器学习--逻辑回归_第2张图片

 逻辑回归的损失函数

1. 逻辑回归的损失函数与之前学习的线性回归的不同,主要目的是把预测错误的分类给出较大的代价值。
2. 线性回归的损失函数作用( 做回归的
远离拟合曲线的数据点,损失函数值大。
靠近拟合曲线的数据点,损失函数值小。
判断数据点与拟合曲线的靠近程度
3. 逻辑回归的损失函数 的主要作用( 做分类的
当我们的分类结果和真实结果相同,损失函数的值应该很小。
我们的分类结果和真实结果不同,损失函数的值应该很大。
判别决策边界分类数据点的正确程度

 对于单个样本的损失函数:

 如果把一个0的样本预测到将近1,或者把1的预测到将近0,都会造成很大的损失函数。

 整个训练集的损失函数就是所有训练样本损失函数的平均值,公式如下:

这种利用对数的方法计算损失的损失函数称为对数损失。

该损失函数是凸函数,可以使用梯度下降法直接求解。

损失函数关于θ_j的偏导数(梯度向量)为:

以莺尾花为例来分析逻辑回归模型

该数据 集包含 150 朵花,根据花片和花萼的形状共分为三种
种花分别为:
Setosa
Versicolor
Virginica

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

机器学习--逻辑回归_第3张图片

y_proba = log_reg.predict_proba(X_new)  #概率?
y_proba

机器学习--逻辑回归_第4张图片

#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()

机器学习--逻辑回归_第5张图片

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()

机器学习--逻辑回归_第6张图片

 多元逻辑回归

针对多分类问题的逻辑回归
Scikit -Learn 默认使用的是一对多( one-vs-the-rest( OvR ) 模型
对于多分类问题 LogisticRegression () 可以使用 OvR 转换
#多分类
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()

机器学习--逻辑回归_第7张图片

除了多分类转换的方法外,还可以使用softmax 回归处理多分类问题

机器学习--逻辑回归_第8张图片

Softmax回归

 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效果要好。

机器学习--逻辑回归_第9张图片

“liblinear”应用了坐标下降算法(Coordinate Descent, CD),并基于scikit-learn内附高性能C++LIBLINEAR library实现。

“newton-cg”、“sag”和“lbfgs”求解器仅支持L2正则化与原始公式。liblinear求解支持L1L2正则化。

“multinomial”选项仅由lbfgs”、“sagnewton-cg求解器支持。

“sag”求解器基于平均随机梯度下降算法(Stochastic Average Gradient descent),在样本量大且特征数多的大数据集下计算速度更快。

“saga” 求解器是“sag”一类变体,它支持非平滑(non-smoothL1则选项 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()

机器学习--逻辑回归_第10张图片

你可能感兴趣的:(机器学习,机器学习,python,pycharm)