一、逻辑回归简介
逻辑回归用于解决**“二分类”**问题,比如判断明天是晴是雨,判断一封邮件是否是垃圾邮件,判断肿瘤是否是恶性的等等。
让我们举个例子来说明为什么这类问题适合用逻辑回归而不是线性回归来解决。
假如我们想用肿瘤的大小判断它是否为恶性,根据样本,得到如下的线性回归模型:
看起来这条线拟合地并不是很令人满意,但似乎还是能够解决问题的,我们把输出的中值作为阈值,就可以得到正确的分类结果。
但如果在右侧再加入一个样本,直线会发生以下改变:
很明显出现了矛盾。这个时候,假如我们用于预测的模型长下面这样:
问题就迎刃而解了!那么什么函数长这样呢?经过一些科学的设想与推导(参考「阿拉丁吃米粉的文章 - 逻辑回归的简单解释」),我们发现 Sigmoid 函数(S 型函数、挤压函数),即
S ( x ) = 1 1 + e − θ x S(x) = \frac{1}{1 + e^{-\theta x}} S(x)=1+e−θx1
非常符合这个特性,而且与我们需要解决的问题的思路——通过概率来判断分类的情况相统一。
接下来,问题变成了求 θ \theta θ 的值,与线性回归一样,我们可以找出损失函数,再使用梯度下降法(参考「逻辑回归详解」、「如何理解梯度下降法」)来求得 θ \theta θ。
对有多元输入的情况,则需要求出 θ T \theta^T θT。
二、Python 代码实现
示例数据地址:GitHub - Avik-Jain/100-Days-Of-ML-Code/datasets
1 数据预处理
# 导入库
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
# 导入数据
dataset = pd.read_csv('Social_Network_Ads.csv')
X = dataset.iloc[:, [2, 3]].values
y = dataset.iloc[:, 4].values
# 分割
from sklearn.cross_validation import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.25, random_state = 0)
# 特征缩放
from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
X_train = sc.fit_transform(X_train)
X_test = sc.transform(X_test)
2 逻辑回归模型
# 拟合逻辑回归模型
from sklearn.linear_model import LogisticRegression
classifier = LogisticRegression()
classifier.fit(X_train, y_train)
3 预测与评价
这里我们使用**“混淆矩阵”**来评估预测的结果。混淆矩阵就是将预测的结果与测试集中实际的结果进行对比,比如矩阵
[ 12 1 2 14 ] \begin{bmatrix}12 & 1\\ 2 & 14 \end{bmatrix} [122114]
是指预测为第 1 类,实际也为第 1 类的结果有 12 个,预测为第 2 类,实际为第 1 类的结果有 1个;
预测为第 1 类,实际为第 2 类的有 2 个,预测为第 2 类,实际也为第 2 类的有14 个。
# 使用测试集预测
y_pred = classifier.predict(X_test)
# 构建混淆矩阵
from sklearn.metrics import confusion_matrix
cm = confusion_matrix(y_test, y_pred)
可以看出,实际应用时使用的代码非常简单。但是我们只有理解了算法本身,才能更好地利用它。