📅  最后修改于: 2020-12-10 05:35:09             🧑  作者: Mango
逻辑回归是一种监督学习分类算法,用于预测目标变量的概率。目标或因变量的性质是二分法的,这意味着将只有两个可能的类。
简而言之,因变量本质上是二进制的,其数据编码为1(代表成功/是)或0(代表失败/否)。
在数学上,逻辑回归模型预测P(Y = 1)作为X的函数。它是最简单的ML算法之一,可用于各种分类问题,例如垃圾邮件检测,糖尿病预测,癌症检测等。
通常,逻辑回归是指具有二进制目标变量的二进制逻辑回归,但是可以通过它预测两类以上的目标变量。基于这些类别,Logistic回归可以分为以下几种类型:
在这种分类中,因变量将仅具有两种可能的类型,即1和0。例如,这些变量可以表示成功或失败,是或否,赢或输等。
在这种分类中,因变量可以具有3种或更多可能的无序类型或没有定量意义的类型。例如,这些变量可以表示“类型A”或“类型B”或“类型C”。
在这种分类中,因变量可以具有3个或更多可能的有序类型或具有定量意义的类型。例如,这些变量可以表示“差”或“好”,“非常好”,“优秀”,并且每个类别的得分都可以为0、1、2、3。
在深入研究逻辑回归的实现之前,我们必须了解以下关于相同的假设-
如果是二进制逻辑回归,则目标变量必须始终为二进制,并且期望结果由因子级别1表示。
模型中不应存在任何多重共线性,这意味着自变量必须彼此独立。
我们必须在模型中包括有意义的变量。
我们应该选择大样本量进行逻辑回归。
Logistic回归的最简单形式是二进制或二项式Logistic回归,其中目标或因变量只能具有2种可能的类型,即1或0。它使我们能够对多个预测变量与二进制/二项式目标变量之间的关系进行建模。在逻辑回归的情况下,线性函数基本上用作以下关系的另一个函数的输入,例如−-
$$ h _ {\ theta} {(x)} = g(\ theta ^ {T} x)𝑤ℎ𝑒𝑟𝑒0≤h_ {\ theta}≤1$$
𝑔是逻辑或S型函数,可以给出如下-
$$ g(z)= \ frac {1} {1 + e ^ {-z}}𝑤ℎ𝑒𝑟𝑒𝑧= \ theta ^ {T}𝑥$$
可以通过下图来表示S形曲线。我们可以看到y轴的值介于0和1之间,并且与该轴的交点为0.5。
这些类别可以分为正面或负面。如果输出介于0和1之间,则输出属于正类别的概率。对于我们的实现,我们假设假设函数的输出≥0.5则为正,否则为负。
我们还需要定义一个损失函数,以使用权重来衡量算法的性能,以theta表示如下-
ℎ=𝑔(𝑋𝜃)
$$ J(\ theta)= \ frac {1} {m}。(-y ^ {T} log(h)-(1 -y)^ Tlog(1-h))$$
现在,在定义损失函数,我们的主要目标是使损失函数最小化。可以借助调整权重来完成,这意味着可以增加或减少权重。借助每个权重的损失函数的导数,我们将能够知道哪些参数应具有较高的权重,哪些参数应具有较小的权重。
以下梯度下降方程式告诉我们,如果我们修改参数,损耗将如何变化-
$$ \ frac {𝛿𝐽(𝜃)} {𝛿 \ theta_ {j}} = \ frac {1} {m} X ^ {T}(𝑔(𝑋𝜃)−𝑦)$$
现在,我们将在Python实现上述二项逻辑回归的概念。为此,我们使用一个名为“ iris”的多元花卉数据集,该数据集具有3类,每类50个实例,但是我们将使用前两个要素列。每个类别代表一种鸢尾花。
首先,我们需要导入必要的库,如下所示:
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn import datasets
接下来,按以下方式加载虹膜数据集-
iris = datasets.load_iris()
X = iris.data[:, :2]
y = (iris.target != 0) * 1
我们可以按照以下方式绘制训练数据-
plt.figure(figsize=(6, 6))
plt.scatter(X[y == 0][:, 0], X[y == 0][:, 1], color='g', label='0')
plt.scatter(X[y == 1][:, 0], X[y == 1][:, 1], color='y', label='1')
plt.legend();
接下来,我们将定义S型函数,损失函数和梯度下降,如下所示:
class LogisticRegression:
def __init__(self, lr=0.01, num_iter=100000, fit_intercept=True, verbose=False):
self.lr = lr
self.num_iter = num_iter
self.fit_intercept = fit_intercept
self.verbose = verbose
def __add_intercept(self, X):
intercept = np.ones((X.shape[0], 1))
return np.concatenate((intercept, X), axis=1)
def __sigmoid(self, z):
return 1 / (1 + np.exp(-z))
def __loss(self, h, y):
return (-y * np.log(h) - (1 - y) * np.log(1 - h)).mean()
def fit(self, X, y):
if self.fit_intercept:
X = self.__add_intercept(X)
现在,按以下方式初始化权重-
self.theta = np.zeros(X.shape[1])
for i in range(self.num_iter):
z = np.dot(X, self.theta)
h = self.__sigmoid(z)
gradient = np.dot(X.T, (h - y)) / y.size
self.theta -= self.lr * gradient
z = np.dot(X, self.theta)
h = self.__sigmoid(z)
loss = self.__loss(h, y)
if(self.verbose ==True and i % 10000 == 0):
print(f'loss: {loss} \t')
借助以下脚本,我们可以预测输出概率-
def predict_prob(self, X):
if self.fit_intercept:
X = self.__add_intercept(X)
return self.__sigmoid(np.dot(X, self.theta))
def predict(self, X):
return self.predict_prob(X).round()
接下来,我们可以评估模型并将其绘制如下:
model = LogisticRegression(lr=0.1, num_iter=300000)
preds = model.predict(X)
(preds == y).mean()
plt.figure(figsize=(10, 6))
plt.scatter(X[y == 0][:, 0], X[y == 0][:, 1], color='g', label='0')
plt.scatter(X[y == 1][:, 0], X[y == 1][:, 1], color='y', label='1')
plt.legend()
x1_min, x1_max = X[:,0].min(), X[:,0].max(),
x2_min, x2_max = X[:,1].min(), X[:,1].max(),
xx1, xx2 = np.meshgrid(np.linspace(x1_min, x1_max), np.linspace(x2_min, x2_max))
grid = np.c_[xx1.ravel(), xx2.ravel()]
probs = model.predict_prob(grid).reshape(xx1.shape)
plt.contour(xx1, xx2, probs, [0.5], linewidths=1, colors='red');
Logistic回归的另一种有用形式是多项式Logistic回归,其中目标或因变量可以具有3种或更多种可能的无序类型,即没有定量意义的类型。
现在,我们将在Python实现上述多项式逻辑回归的概念。为此,我们使用来自sklearn的名为digit的数据集。
首先,我们需要导入必要的库,如下所示:
Import sklearn
from sklearn import datasets
from sklearn import linear_model
from sklearn import metrics
from sklearn.model_selection import train_test_split
接下来,我们需要加载数字数据集-
digits = datasets.load_digits()
现在,如下定义特征矩阵(X)和响应向量(y)-
X = digits.data
y = digits.target
在下一行代码的帮助下,我们可以将X和y分为训练和测试集-
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.4, random_state=1)
现在创建一个逻辑回归的对象,如下所示:
digreg = linear_model.LogisticRegression()
现在,我们需要使用训练集来训练模型,如下所示:
digreg.fit(X_train, y_train)
接下来,对测试集进行如下预测:
y_pred = digreg.predict(X_test)
接下来打印模型的精度如下-
print("Accuracy of Logistic Regression model is:",
metrics.accuracy_score(y_test, y_pred)*100)
Accuracy of Logistic Regression model is: 95.6884561891516
从上面的输出中,我们可以看到我们模型的准确性约为96%。