机器学习
- 1. Logistic回归
- 1.1 原理
- 1.2 sklearn实现
1. Logistic回归
1.1 原理
Logistic回归是一种分类算法,通过将线性回归预测值映射到{0, 1}之间实现预测值到概率的转换;即根据数据集对分类边界线建立回归公式,以此进行分类。
Logistic回归选择Sigmoid作为映射函数,其中Sigmoid函数及其导数如图:
选择Sigmoid函数原因:
- 在(-,+)区间内单调递增,将所有预测值映射到(0, 1)区间,符合概率的转换
- 在(-,+)区间内单调可微,便于求解
给定一个大小为的数据集:
则线性回归模型的预测值为:
Logistic回归通过sigmoid函数将预测值映射到(0, 1)区间,即:
其中,,,n为自变量(特征值)个数, 0或1(从1到)
Logistic回归是一种概率判别模型,可用最大似然估计(MLE)进行参数求解,其通过对数似然损失函数,定义如下:
首先关于求导:
对关于求导:
因为有非线性项位于求和符号内,所以对无法直接求解(无解析解)
注:二分类Logistic回归是最大熵模型的特例,可将二分类的Logistic回归推广到一对多(one-vs-rest/all)分类或多分类的Logistic回归
1.2 sklearn实现
参考官方文档:点击查看
Logistic回归可通过sklearn库中linear_model下的LogisticRegression类实现
有关参数:
- penalty:增加惩罚项,即L1正则化(‘l1’),L2正则化(‘l2’),同时考虑L1和L2正则化-弹性网络('elasticnet)或无(’none)
- dual:是否转换为对偶问题
- tol:求解过程中的残差(当小于该值时停止计算)
- C:反向控制惩罚项的权重,数值越大,惩罚项权重越小
- fit_intercept:是否计算回归模型的截距(常量),即
- intercept_scaling:当求解器为’liblinear‘且需要计算模型截距时才用
- class_weight:类别的权重
- random_state:用于控制伪随机数生成器的种子,仅适用’sag’, ‘saga’和’liblinear’
- solver:选择用于计算的求解器(’liblinear’,'lbfgs’等)
- max_iter:最大迭代次数
- multi_class:选择分类方式,即one-vs-rest(拆解成多个二分类)或多项式
- verbose:对于’liblinear’和‘lbfgs’求解器设置输出日志的详细程度
- warm_start:是否使用上一次计算结果来初始化
- n_jobs:分类并行化时使用的CPU内核数
- l1_ratio:设置弹性网络中L1正则项的比例
有关属性:
- classes_:模型已知的类别标签列表
- coef_:Logistic回归系数,即
- intercept_:Logistic回归模型的截距(常量),即
- n_features_in_:自变量(特征值)的个数
- feature_names_in_:自变量的名称,仅当输入自变量有(字符)名称时可用
- n_iter_:所有类满足残差要求时的迭代次数
有关方法:
- decision_function:预测样本到分类超平面的(带符号)距离,即置信度水平
- densify:将回归系数矩阵转化为密集数组形式
- fit:拟合Logistic回归模型,即计算
- get_params:获取对应模型参数
- predict:预测类别
- predict_log_proba:预测概率的对数
- predict_proba:预测概率
- score:获取给定数据集的平均准确度
- set_params:设置对应模型参数
- sparsify:将回归系数矩阵转化为稀疏形式
使用案例
>>> import numpy as np
>>> from sklearn import linear_model
>>> reg = linear_model.LogisticRegression(penalty='none') #实例化Logistic回归模型对象
>>> X = np.array([[1, 1], [3, 2], [4, 7], [2, 5]]) #数据
>>> y = np.array([1, 1, 0, 0]) #类别
>>> reg.fit(X, y) #拟合求解
>>> reg.coef_
[[9.22...,-8.14...]]
>>> reg.intercept_
[9.10...]
>>> reg.classes_
[0, 1]
>>> reg.n_features_in_
2
>>> reg.decision_function([[1, 2]])
[2.03...]
>>> reg.predict_proba(X)
[[0.00..., 0.99...], [0.00..., 1.00...],
[0.99..., 0.00...], [1.00..., 0.00...]]
>>> reg.predict([[1, 3], [5, 2]])
[0, 1]
>>> reg.score(X, y)
1.0