机器学习之逻辑回归(LR)

监督式学习、二分类模型

线性回归预测结果是连续值,而逻辑回归预测结果在应用转换函数后是离散值。逻辑回归用了和回归类似的方法来解决了分类问题。

​ 逻辑回归最适合二元分类(数据集中 y=0 或 1,其中 1 指默认类别。例如,在预测某个事件是否会发生时,事件发生归类为 1;预测某人是否生病时,生病的状况会以1表示)。它以应用在其中的转换函数而命名,称为逻辑函数 h(x)= 1/ (1 + e^x),是一个 S 型曲线。

​ 在逻辑回归中,输出值的形式为默认类的概率(不像线性回归中,输出值为直接产生)。因为是概率,所以输出值会介乎 0 到 1 之间。通过使用逻辑函数 h(x)= 1/ (1 + e^ -x),对 X 值进行对数转换可得到输出值。然后用阙值将得到的概率,即输出值,应用到二元分类中。

特点:

模型源自于逻辑斯蒂分布优化算法有改进的迭代尺度法、梯度下降法、拟牛顿法

优点:

简单,计算量小,存储资源低

缺点

欠拟合,精度不高

1.概念

  • Sigmoid 函数

    ​ 当 x 为 0 时,Sigmoid 函数值为 0.5 。随着 x 的增大,对应的 Sigmoid 值将逼近于 1 ; 而随着 x 的减小, Sigmoid 值将逼近于 0 。如果横坐标刻度足够大, Sigmoid 函数看起来很像一个阶跃函数。

2. 基本思路

2.1 伪代码

1
2
3
4
5
每个回归系数初始化为 1
重复 R 次:
计算整个数据集的梯度
使用 步长 x 梯度 更新回归系数的向量
返回回归系数

2.2 模型特点

特征条件下类别的条件概率分布,对数线形模型

学习策略

极大似然估计,正则化的极大似然估计

学习的损失函数

逻辑斯谛损失

学习方法

改进的迭代尺度算法,梯度下降,拟牛顿法

3. 使用

3.1 一般流程

收集数据: 采用任意方法收集数据
准备数据: 由于需要进行距离计算,因此要求数据类型为数值型。另外,结构化数据格式则最佳。
分析数据: 采用任意方法对数据进行分析。
训练算法: 大部分时间将用于训练,训练的目的是为了找到最佳的分类回归系数。
测试算法: 一旦训练步骤完成,分类将会很快。
使用算法: 首先,我们需要输入一些数据,并将其转换成对应的结构化数值;接着,基于训练好的回归系数就可以对这些数值进行简单的回归计算,判定它们属于哪个类别;在这之后,我们就可以在输出的类别上做一些其他分析工作。

3.2 调参

4. 代码实现

4.1 核心算法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# sigmoid跳跃函数
def sigmoid(inX):
return 1.0/(1+exp(-i# 随机梯度上升
# 梯度上升优化算法在每次更新数据集时都需要遍历整个数据集,计算复杂都较高
# 随机梯度上升一次只用一个样本点来更新回归系数
def stocGradAscent0(dataMatrix, classLabels):
'''
Desc:
随机梯度上升,只使用一个样本点来更新回归系数
Args:
dataMatrix -- 输入数据的数据特征(除去最后一列)
classLabels -- 输入数据的类别标签(最后一列数据)
Returns:
weights -- 得到的最佳回归系数
'''
m,n = shape(dataMatrix)
alpha = 0.01
# n*1的矩阵
# 函数ones创建一个全1的数组
weights = ones(n) # 初始化长度为n的数组,元素全部为 1
for i in range(m):
# sum(dataMatrix[i]*weights)为了求 f(x)的值, f(x)=a1*x1+b2*x2+..+nn*xn,此处求出的 h 是一个具体的数值,而不是一个矩阵
h = sigmoid(sum(dataMatrix[i]*weights))
# print 'dataMatrix[i]===', dataMatrix[i]
# 计算真实类别与预测类别之间的差值,然后按照该差值调整回归系数
error = classLabels[i] - h
# 0.01*(1*1)*(1*n)
print weights, "*"*10 , dataMatrix[i], "*"*10 , error
weights = weights + alpha * error * dataMatrix[i]
return weightsnX))

4.2 sklearn实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import numpy as np
import matplotlib.pyplot as plt
from sklearn import linear_model, datasets

# 引入一些数据来玩
iris = datasets.load_iris()
# 我们只采用样本数据的前两个feature
X = iris.data[:, :2]
Y = iris.target

h = .02 # 网格中的步长

logreg = linear_model.LogisticRegression(C=1e5)

# 我们创建了一个 Neighbours Classifier 的实例,并拟合数据。
logreg.fit(X, Y)

# 绘制决策边界。为此我们将为网格 [x_min, x_max]x[y_min, y_max] 中的每个点分配一个颜色。
x_min, x_max = X[:, 0].min() - .5, X[:, 0].max() + .5
y_min, y_max = X[:, 1].min() - .5, X[:, 1].max() + .5
xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))
Z = logreg.predict(np.c_[xx.ravel(), yy.ravel()])

# 将结果放入彩色图中
Z = Z.reshape(xx.shape)
plt.figure(1, figsize=(4, 3))
plt.pcolormesh(xx, yy, Z, cmap=plt.cm.Paired)

# 将训练点也同样放入彩色图中
plt.scatter(X[:, 0], X[:, 1], c=Y, edgecolors='k', cmap=plt.cm.Paired)
plt.xlabel('Sepal length')
plt.ylabel('Sepal width')

plt.xlim(xx.min(), xx.max())
plt.ylim(yy.min(), yy.max())
plt.xticks(())
plt.yticks(())

plt.show()

4.3 《机器学习实战》(python3.x)

第五章 Logistic回归

5. 补充

  • 优化点
  • 证明:
  • 参考:
    • 李航《统计学习方法》
    • 周志华《机器学习》
    • ApacheCN
-------------感谢阅读-------------
0%