逻辑回归
首先,逻辑回归是一个分类算法而不是一个回归算法,该算法可根据已知的一系列因变量估计离散数值(比方说二进制数值 0 或 1 ,是或否,真或假),它通过将数据拟合进一个 逻辑函数 来预估一个事件出现的概率。因为它预估的是概率,所以它的输出值大小在 0 和 1 之间(正如所预计的一样)。
[比利时的人口增长数量图]
逻辑函数由于它的S形,有时也被称为sigmoid函数。
通过一个简单的例子来理解这个算法。 假设你的朋友让你解开一个谜题。这只会有两个结果:你解开了或是你没有解开(离散值)。想象你要解答很多道题来找出你所擅长的主题。这个研究的结果就会像是这样:假设题目是一道十年级的三角函数题,你有 70% 的可能会解开这道题。然而,若题目是个五年级的历史题,你只有 30% 的可能性回答正确。这就是逻辑回归能提供给你的信息。
用途
逻辑回归主要用于分类,比如邮件分类,是否肿瘤、癌症诊断,用户性别判断,预测用户购买产品类别,判断评论是正面还是负面等。
逻辑回归的数学模型和求解都相对比较简洁,实现相对简单。通过对特征做离散化和其他映射,逻辑回归也可以处理非线性问题,是一个非常强大的分类器。因此在实际应用中,当我们能够拿到许多低层次的特征时,可以考虑使用逻辑回归来解决我们的问题。
加载数据(Data Loading)
我们假设输入是一个特征矩阵或者 csv 文件,我们使用 NumPy 来载入 csv 文件。 以下是从 UCI 机器学习数据仓库中下载的数据。
代码语言:javascript复制import numpy as np
import urllib.request
# 加载数据
url = "http://archive.ics.uci.edu/ml/machine-learning-databases/pima-indians-diabetes/pima-indians-diabetes.data"
raw_data = urllib.request.urlopen(url)
# 把CSV文件转化为numpy matrix
dataset = np.loadtxt(raw_data, delimiter=",")
# 训练集和结果
X = dataset[:, 0:7]
y = dataset[:, 8]
数据归一化(Data Normalization)与标准化
数据归一化是指把数字变成(0,1)之间的小数。
数据的标准化是将数据按比例缩放,使之落入一个小的特定区间。
大多数机器学习算法中的梯度方法对于数据的缩放和尺度都是很敏感的,在开始跑算法之前,我们应该进行归一化或者标准化的过程,这使得特征数据缩放到 0-1 范围中。scikit-learn 提供了归一化和标准化的方法:
代码语言:javascript复制from sklearn import preprocessing
# 归一化
normalized_X = preprocessing.normalize(X)
# 标准化
standardized_X = preprocessing.scale(X)
特征选择(Feature Selection)
在解决一个实际问题的过程中,选择合适的特征或者构建特征的能力特别重要。这成为特征选择或者特征工程。 特征选择时一个很需要创造力的过程,更多的依赖于直觉和专业知识,并且有很多现成的算法来进行特征的选择。 下面的树算法(Tree algorithms)计算特征的信息量:
代码语言:javascript复制from sklearn import metrics
from sklearn.ensemble import ExtraTreesClassifier
model = ExtraTreesClassifier()
model.fit(X, y)
# 显示每个属性相对重要性
print(model.feature_importances_)
关于特征提取
机器学习是一个过程,这样的过程包括数据处理 模型训练,而特征提取是数据处理中不可或缺的一环。
比如预测什么样的生活方式特征是引发冠心病 (CHD) 的危险因素?给定具有吸烟状态、饮食、锻炼、饮酒和 CHD 状态度量的患者样本,可以使用这四个生活方式变量建立一个模型,用于预测患者样本中 CHD 的存在性。然后可使用此模型为每个因子推导几率比估计值,从而获知某些信息,例如吸烟者比非吸烟者在何种程度上更易患 CHD。
算法选择–逻辑回归
大多数问题都可以归结为二元分类问题。这个算法的优点是可以给出数据所在类别的概率。
代码语言:javascript复制from sklearn import metrics
from sklearn.linear_model import LogisticRegression
model = LogisticRegression()
model.fit(X, y)
# 预测
expected = y
predicted = model.predict(X)
# 模型拟合概述
print(metrics.classification_report(expected, predicted))
print(metrics.confusion_matrix(expected, predicted))
最后
以上 加载数据 -> 数据归一化 -> 特征选择 -> 算法选择 既是机器学习的一般代码逻辑。如果选择其它算法,只需要更改最后一步算法选择即可。
代码地址
参考文献
- Logistic Regression 模型简介
- Logistic 回归
- scikit-learn的主要模块和基本使用