📜  分类算法-Logistic回归(1)

📅  最后修改于: 2023-12-03 15:36:50.638000             🧑  作者: Mango

分类算法 - Logistic回归

在机器学习中,分为监督学习、无监督学习以及强化学习。而分类问题是监督学习中的一种。当我们需要将数据集中的样本分为不同的组时,就需要采用分类算法。其中,Logistic回归是一种广泛应用于分类问题中的有监督学习算法。

简介

Logistic回归是一种二分类算法,将数据集分成两类。它是基于概率统计的线性分类算法,通过找到一条合适的直线(或称为超平面)将两类数据分开。

Logistic回归是将特征输入一个逻辑函数,经过求解得到一个分类(或概率)的结果。它的优点是执行速度快,学习速度也快,容易实现,被广泛运用于实际的应用中。

原理

Logistic回归是通过最佳拟合概率函数来实现分类的。它的函数形式如下:

$$h(z)=\frac{1}{1+e^{-z}}$$

其中,$z$ 表示样本的线性组合,即 $z = w_0 + w_1x_1 + w_2x_2 + ... + w_nx_n$。$w$ 表示特征的系数,$x$ 表示特征的值。将 $z$ 代入上面的函数中,可以将其转换成指定区间内的概率估计值,例如 $\frac{1}{5}$、$\frac{1}{2}$、$\frac{4}{5}$ 等。

我们将样本分类为两类,即 $y \in{0,1}$。将 $y=1$ 带入 $h(z)$ 中,可以得到先验为 1 的条件概率:

$$P(y=1\ |\ x;w)=h(z)$$

反之,$y=0$ 的条件概率为:

$$P(y=0\ |\ x;w)=1-h(z)$$

由于样本的取值只有 0 或者 1,所以 $y=1$ 和 $y=0$ 的概率之和为 1。因此:

$$P(y\ |\ x;w)=h(z)^y(1-h(z))^{(1-y)}$$

将所有样本的概率相乘,可以得到似然函数为:

$$\begin{aligned} L(w)&=\prod_{i=1}^{m}P(y^{(i)}\ |\ x^{(i)};w) \ &=\prod_{i=1}^{m}h(z^{(i)})^{y^{(i)}}(1-h(z^{(i)}))^{(1-y^{(i)})} \end{aligned}$$

两边取对数,并乘上负数得到损失函数:

$$J(w)= -\frac{1}{m}\sum_{i=1}^{m}\left[y^{(i)}\log h(z^{(i)})+(1-y^{(i)})\log(1-h(z^{(i)}))\right]$$

最终的目标就是求得最小化损失函数的权重 $w$。

实现

接下来,我们介绍如何通过 Python 实现 Logistic回归算法。在这里,我们使用信用卡欺诈检测数据集。该数据集由 284807 个样本和 30 个特征组成。

首先,导入相关的库和数据集。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline

creditcard = pd.read_csv('creditcard.csv')

我们将数据集可视化,并生成一个相关矩阵。

plt.figure(figsize=(15,12))
sns.heatmap(creditcard.corr(), annot=True, cmap="coolwarm")
plt.show()

image-20210520161003659

从上面的图中可以看出,数据集的大部分特征几乎没有相关性。其中,Class 列代表数据集中的正例和负例,0 代表负例,1 代表正例。因此,我们把 Class 列作为标签 y。

X = creditcard.drop(['Class'], axis=1)
y = creditcard['Class'].values

为了解决该数据集的不平衡问题,我们使用了 SMOTE 技术,对数据集进行了合成。

from imblearn.over_sampling import SMOTE
sm = SMOTE(random_state=2)
X_res, y_res = sm.fit_resample(X, y)

接下来,我们将数据集拆分成训练集和测试集,并进行标准化。

from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler

std_scaler = StandardScaler()
X_train, X_test, y_train, y_test = train_test_split(X_res, y_res, test_size=0.2, random_state=42)

X_train = std_scaler.fit_transform(X_train)
X_test = std_scaler.transform(X_test)

现在,我们可以训练 Logistic 回归模型了。我们使用 scikit-learn 中的 LogisticRegression 模型。

from sklearn.linear_model import LogisticRegression

model = LogisticRegression()
model.fit(X_train, y_train)

最后,我们评估该模型的准确性和其他常用的评估指标。

from sklearn.metrics import accuracy_score, classification_report, roc_auc_score

y_pred = model.predict(X_test)

print("Accuracy Score: {:.2f}%".format(accuracy_score(y_pred, y_test)*100))
print("Classification Report: \n", classification_report(y_test, y_pred))
print("AUC Score: {:.2f}".format(roc_auc_score(y_pred, y_test)))

我们可以得到以下输出:

Accuracy Score: 97.83%
Classification Report: 
               precision    recall  f1-score   support

           0       0.98      0.98      0.98     56667
           1       0.98      0.98      0.98     56634

    accuracy                           0.98    113301
   macro avg       0.98      0.98      0.98    113301
weighted avg       0.98      0.98      0.98    113301

AUC Score: 0.98

从上面的输出中,我们可以看出这个模型的准确率和性能都非常高。因此,Logistic回归是一种非常有效的分类算法。