共计 4391 个字符,预计需要花费 11 分钟才能阅读完成。
动动发财的小手,点个赞吧!
1. 导读
- 逻辑回归 是在因变量为二元时进行的回归剖析。它用于形容数据并解释一个因二元变量与一个或多个名义、有序、区间或比率程度变量之间的关系。
- 二元或二项式 Logistic 回归 能够了解为解决其中因变量的察看后果只能是二元的场景的 Logistic 回归 类型,即它只能有两种可能的类型。
- 多项 Logistic 回归 实用于后果可能具备两种以上可能类型(A 型、B 型和 C 型)的状况,它们没有任何特定的程序。
分类技术是机器学习和数据挖掘利用中的重要组成部分。解决分类问题的算法也有很多种,比方:k- 近邻算法,应用间隔计算来实现分类;决策树,通过构建直观易懂的树来实现分类;奢侈贝叶斯,应用概率论构建分类器。这里咱们要讲的是 Logistic 回归,它是一种很常见的用来解决二元分类问题的回归办法,它次要是通过寻找最优参数来正确地分类原始数据。
1. Logistic Regression
逻辑回归 (Logistic Regression, 简称 LR),其实是一个很有误导性的概念,尽管它的名字中带有“回归”两
个字,然而它最善于解决的却是分类问题。LR 分类器实用于各项狭义上的分类工作,例如:评论信息的
正负情感剖析(二分类)、用户点击率(二分类)、用户守约信息预测(二分类)、垃圾邮件检测(二
分类)、疾病预测(二分类)、用户等级分类(多分类)等场景。咱们这里次要探讨的是二分类问题。
2. 线性回归
逻辑回归和线性回归同属于狭义线性模型,逻辑回归就是用线性回归模型的预测值去拟合实在标签的的 对数几率(一个事件的几率(odds)是指该事件产生的概率与不产生的概率之比,如果该事件产生的概率是 P,那么该事件的几率是
对数几率就是
逻辑回归和线性回归实质上都是失去一条直线,不同的是,线性回归的直线是尽可能去拟合输出变量 X
的散布,使得训练集中所有样本点到直线的间隔最短;而逻辑回归的直线是尽可能去拟合决策边界,使
得训练集样本中的样本点尽可能分来到。因而,两者的目标是不同的。
线性回归方程:
此处,y 为因变量,x 为自变量。在机器学习中 y 是标签,x 是特色。
3. Sigmoid 函数
在二分类的状况下,函数能输入 0 或 1。领有这类性质的函数称为海维赛德阶跃函数(Heaviside step function),又称之为单位阶跃函数(如下图所示)
单位阶跃函数的问题在于:在 0 点地位该函数从 0 霎时跳跃到 1,这个霎时跳跃过程很难解决(不好求
导)。侥幸的是,Sigmoid 函数也有相似的性质,且数学上更容易解决。
Sigmoid 函数公式:
import numpy as np
import math
import matplotlib.pyplot as plt
%matplotlib inline
X = np.linspace(-5,5,200)
y = [1/(1+math.e**(-x)) for x in X]
plt.plot(X,y)
plt.show()
X = np.linspace(-60,60,200)
y = [1/(1+math.e**(-x)) for x in X]
plt.plot(X,y)
plt.show()
上图给出了 Sigmoid 函数在不同坐标尺度下的两条曲线。当 x 为 0 时,Sigmoid 函数值为 0.5。随着 x 的增
大,对应的函数值将迫近于 1;而随着 x 的减小,函数值迫近于 0。所以 Sigmoid 函数值域为(0,1),注
意这是开区间,它仅有限靠近 0 和 1。如果横坐标刻度足够大,Sigmoid 函数看起来就很像一个阶跃函数
了。
4. 逻辑回归
通过将线性模型和 Sigmoid 函数联合,咱们能够失去逻辑回归的公式:
这样 y 就是(0,1)的取值。对式子进行变换,可得:
这个其实就是一个对数几率公式。
- 二项 Logistic 回归:
- 多项 Logistic 回归:
- 代码
import numpy as np
class LoisticRegression:
# declaring learning rate and number of iterations(hyperparameters)
def __init__(self, learning_rate=0.001, n_iters=1000):
self.lr = learning_rate
self.n_iters = n_iters
self.weights = None
self.bias = None
def fit(self, X, y):
n_samples, n_features = X.shape
# initializing weights
self.weights = np.zeros(n_features)
# initializing bias
self.bias = 0
# Gradient descent
for i in range(self.n_iters):
# applying the linear model
linear_model = np.dot(X, self.weights) + self.bias
# defining the predict method
y_predicted = self._sigmoid(linear_model)
# compute the gradients
dw = (1 / n_samples) * np.dot(X.T, (y_predicted - y))
db = (1 / n_samples) * np.sum(y_predicted - y)
# update the parameters
self.weights -= self.lr * dw
self.bias -= self.lr * db
# get the test samples that we want to predict
def predict(self, X):
# applying the linear model
linear_model = np.dot(X, self.weights) + self.bias
# defining the predict method
y_predicted = self._sigmoid(linear_model)
y_predicted_cls = [1 if i > 0.5 else 0 for i in y_predicted]
return np.array(y_predicted_cls)
def _sigmoid(self, x):
return 1 / (1 + np.exp(-x))
5. LR 与线性回归的区别
逻辑回归和线性回归是两类模型,逻辑回归是分类模型,线性回归是回归模型。
6. LR 损失函数
损失函数,艰深讲,就是掂量实在值和预测值之间差距的函数。所以,损失函数越小, 模型就越好。在这
里,最小损失是 0。
# 函数的图像
X = np.linspace(0.0001,1,200)
y = [(-np.log(x)) for x in X]
plt.plot(X,y)
plt.show()
X = np.linspace(0,0.99999,200)
y = [(-np.log(1-x)) for x in X]
plt.plot(X,y)
plt.show()
把这两个损失函数综合起来:
y 就是标签,别离取 0,1。
对于 m 个样本,总的损失函数为:
这个式子中,m 是样本数,y 是标签,取值 0 或 1,i 示意第 i 个样本,p(x)示意预测的输入。
7. 实例
应用 Logistic 回归来预测患疝气病的马的存活问题。原始数据集下载地址
数据蕴含了 368 个样本和 28 个特色。该数据集中蕴含了医院检测马疝病的一些指标,有的指标比拟主观,有的指标难以测量,例如马的疼痛级别。另外须要阐明的是,除了局部指标主观和难以测量外,该数据还存在一个问题,数据集中有 30% 的值是缺失的。上面将首先介绍如何解决数据集中的 数据缺失问题 ,而后再 利用 Logistic 回归和随机梯度回升算法来预测病马的生死。
7.1. 数据筹备
数据中的缺失值解决办法:
- 应用可用特色的均值来填补缺失值;
- 应用非凡值来填补缺失值,如 -1;
- 疏忽有缺失值的样本;
- 应用类似样本的均值添补缺失值;
- 应用另外的机器学习算法预测缺失值。
预处理数据做两件事:
- 如果测试集中一条数据的 特征值 曾经缺失,那么咱们抉择实数 0 来替换所有缺失值,因为本文应用
Logistic 回归。因而这样做不会影响回归系数的值。sigmoid(0)=0.5,即它对后果的预测不具备任
何倾向性。 - 如果测试集中一条数据的 类别标签 曾经缺失,那么咱们将该类别数据抛弃,因为类别标签与特色不
同,很难确定采纳某个适合的值来替换。
train = pd.read_table('horseColicTraining.txt',header=None)
train.head()
train.shape
train.info()
test = pd.read_table('horseColicTest.txt',header=None)
test.head()
test.shape
test.info()
7.2. 回归
失去训练集和测试集之后,能够失去训练集的 weights。这里须要定义一个分类函数,依据 sigmoid 函数返回的值来确定 y 是 0 还是 1。
"""
函数性能:给定测试数据和权重,返回标签类别
参数阐明:inX:测试数据
weights:特色权重
"""
def classify(inX,weights):
p = sigmoid(sum(inX * weights))
if p < 0.5:
return 0
else:
return 1
7.3. 模型构建
"""
函数性能:logistic 分类模型
参数阐明:train:测试集
test:训练集
alpha:步长
maxCycles:最大迭代次数
返回:retest: 预测好标签的测试集
"""
def get_acc(train,test,alpha=0.001, maxCycles=5000):
weights = SGD_LR(train,alpha=alpha,maxCycles=maxCycles)
xMat = np.mat(test.iloc[:, :-1].values)
xMat = regularize(xMat)
result = []
for inX in xMat:
label = classify(inX,weights)
result.append(label)
retest=test.copy()
retest['predict']=result
acc = (retest.iloc[:,-1]==retest.iloc[:,-2]).mean()
print(f'模型准确率为:{acc}')
return retest
- 运行后果
get_acc(train,test,alpha=0.001, maxCycles=5000)
- 运行 10 次查看后果:
for i in range(10):
acc =get_acc(train,test,alpha=0.001, maxCycles=5000)
从后果看出,模型预测的准确率根本维持在 74% 左右,起因有两点:
- 数据集自身有缺失值,解决之后对后果也会有影响;
- 逻辑回归这个算法自身也有下限。
本文由 mdnice 多平台公布