逻辑回归用于解决“二分类”问题,好比判断明天是晴是雨,判断一封邮件是不是垃圾邮件,判断肿瘤是不是恶性的等等。python
让咱们举个例子来讲明为何这类问题适合用逻辑回归而不是线性回归来解决。git
假如咱们想用肿瘤的大小判断它是否为恶性,根据样本,获得以下的线性回归模型:github
看起来这条线拟合地并非很使人满意,但彷佛仍是可以解决问题的,咱们把输出的中值做为阈值,就能够获得正确的分类结果。算法
但若是在右侧再加入一个样本,直线会发生如下改变:dom
很明显出现了矛盾。这个时候,假如咱们用于预测的模型长下面这样:函数
好像问题就迎刃而解了呢!那么什么函数长这样呢?通过一些科学的设想与推导(参考「阿拉丁吃米粉的文章 - 逻辑回归的简单解释」),咱们发现 Sigmoid 函数,即测试
$$S(x) = \frac{1}{1 + e^{-\theta x}}$$.net
很是符合这个特性,并且与咱们须要解决的问题的思路——经过几率来判断分类的状况相统一。code
接下来,问题变成了求 $\theta$ 的值,与线性回归同样,咱们能够找出损失函数,再使用梯度降低法(参考「逻辑回归详解」、「如何理解梯度降低法」)来求得 $\theta$。orm
对有多元输入的状况,则须要求出 $\theta^T$。
示例数据地址:GitHub - Avik-Jain/100-Days-Of-ML-Code/datasets
# 导入库 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)
# 拟合逻辑回归模型 from sklearn.linear_model import LogisticRegression classifier = LogisticRegression() classifier.fit(X_train, y_train)
这里咱们使用“混淆矩阵”来评估预测的结果。混淆矩阵就是将预测的结果与测试集中实际的结果进行对比,好比矩阵
$$\begin{bmatrix}12
& 1\ 2
& 14
\end{bmatrix}$$
是指预测为第 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)
能够看出,实际应用时使用的代码很是简单。可是咱们只有理解了算法自己,才能更好地利用它。
欢迎关注 Evan 的博客