听了菜菜的sklearn课程所做的学习笔记
逻辑回归的基础一线性回归简介
线性回归公式:
写成矩阵形式:
其中:
- θ:模型的参数
- θ0:截距
- θ1-θn:系数
线性回归的任务:构造预测函数z来映射输入的特征矩阵x和标签值y的线性关系;
注:通过函数z,线性回归使用输入的特征矩阵X来输出一组连续型的标签值y_pred,以完成各种预测连续型变量的任务(比如预测产品销量,预测股价等等)。
线性回归的核心:找出模型的参数θ,最著名的方法是最小二乘法。
逻辑回归一预测离散型标签
联系函数:将连续型变量转化为离散型变量的函数。
标签为0-1的离散型变量,二分类思想
Sigmoid函数
- S型函数;
- 当z→∞时,g(z)→1;当z→-∞时,g(z)→0;
- 用于将任何实数映射到(0,1)区间,使其可用于将任意值函数转换为更适合二分类的函数;
- 归一化的方法,同理的还有MinMaxSclaer方法,只不过它将函数转化到[0,1]区间而不是(0,1)。
二元逻辑回归的一般形式
y(x)∈(0,1),y(x)+(1-y(x))=1;
形似几率y(x)/(1-y(x))取对数得:
形似几率取对数的本质是线性回归z,因此逻辑回归又叫"对数几率回归"。
y(x):本质上不是概率,却拥有着概率的性质,因此被当作概率来使用。
y(x)与1-y(x):可以看成一对正反例,y(x)是某样本标签被预测为1的概率,1-y(x)是某样本标签被预测为0的概率,y(x)/(1-y(x))是样本i的标签被预测为1的相对概率。
注:使用最大似然法和概率分布函数推导出逻辑回归的损失函数,并且把返回样本在标签取值上的概率当成是逻辑回归的性质来使用,每当我们诉求概率的时候,我们都会使用逻辑回归。
逻辑回归除了可以用来二分类,也可以多分类
逻辑回归的优势
- 对线性关系的拟合效果极好;
- 计算快;
- 返回的分类结果不是固定的0,1,而是以小数形式呈现的类概率数字;
注:决策树,随机森林等输出的是分类结果,但不会计算分数。 - 抗噪能力强:技术上来说,最佳模型的AUC面积低于0.8时,逻辑回归明显优于树模型”的说法。并且,逻辑回归在小数据集上表现更好,在大型的数据集上,树模型有着更好的表现。
逻辑回归的数学目的
求解能够让模型对数据拟合程度最高的参数θ的值,以此构建预测函数y(x),然后将特征矩阵X输入预测函数来计算出逻辑回归的结果y。
sklearn种最简单的逻辑回归分类器
(又叫logit回归,最大熵分类器)
class sklearn.linear_model.LogisticRegression (penalty=’l2’, dual=False, tol=0.0001, C=1.0,
fit_intercept=True, intercept_scaling=1, class_weight=None, random_state=None, solver=’warn’, max_iter=100,
multi_class=’warn’, verbose=0, warm_start=False, n_jobs=None)
可能会用到的其它类
- metrics.confusion_matrix一混淆矩阵,模型评估指标之一
- metrics.roc_auc_score一ROC曲线,模型评估指标之一
- metrics.accuracy_score一精确性(最常用),模型评估指标之一
二元逻辑回归的损失函数
两种模型表现:
- 在训练集上的模型表现
- 在测试集上的模型表现
逻辑回归与决策树及随机森林的区别:
- 逻辑回归侧重于追求模型在训练集上表现最优;
- 决策树及随机森林侧重于追求模型在测试集上表现最优。
损失函数一衡量参数θ优劣的评估指标,求解最优参数的工具
- 损失函数小,模型在训练集上表现优异,拟合充分,参数优秀;
- 损失函数大,模型在训练集上表现差劲,拟合不足,参数糟糕
注:没有"求解参数"需求的模型没有损失函数,eg:KNN,决策树。
损失函数由极大似然估计推导出:
其中:
- θ:求解出来的参数
- m:样本的个数
- yi:样本i真实的标签
- yθ(xi):样本i基于θ预测的标签值
- xi:样本i的各个特征的值
逻辑回归追求:能够让J(θ)取min的参数组合;
注:对于J(θ),x、y是已知参数,θ是自变量,求导(或偏导)时要注意对θ求导(或偏导)。
损失函数的数学推导
将两种概率整合得:
(模型拟合好,损失小的目的,我们每时每刻都希望 的值等于1)
概率:
取对数得:
取负值:
(在这个函数上,追求最小值就能让模型在训练数据上的拟合效果最好,损失最低)
LogisticRegression常用重要参数、属性及接口
正则化
(因为极力追求J(θ)的最小值,让模型在训练集上表现最有,但是在测试集上表现却不好,即出现了过拟合的现象,为了对逻辑回归中的过拟合进行控制,可以正则化。)
- LogisticRegression种最常用的正则化方法:
- L1正则化:J(θ)+θ的L1范式的倍数;
- L2正则化:J(θ)+θ的L2范式的倍数;
(正则项/惩罚项:即J(θ)后加的范式)
其中,
- C:控制正则化程度的超参数,在LogisticRegression中参数的名字也是C;
- n:方程中特征的总数;
- j≥1的原因:因为θ中的第一个参数θ0是截距,一般不参与正则化。
- 正则化调节模型拟合程度的方法:正则化后,损失函数改变,基于损失函数的最优化求得的解θ就会随之改变。
- 一些其他博客或资料中,正则化后的损失函数也会这样写:
但在sklearn中,常数C通常写在J(θ)的前面,通过调节J(θ)的大小,来调节对模型的惩罚。 - L1/L2正则化效果不同:正则化强度越大,C越小,θ越的取值越小
-
L1正则化可以将参数θ中的元素压缩到0;
(在L1正则化的过程中,携带信息量小的、对模型贡献不大的特征的参数会比携带信息量大的、对模型贡献大的特征的参数更快地变为0,因为L1正则化其实是一个特征选择的过程,掌管了参数的"稀疏性"。L1正则化也正是基于此来防止过拟合,由于L1正则化这个性质,逻辑回归的特征选择可以由embedded嵌入法来完成。)
-
L2正则化不会将参数θ中的元素压缩到0,但是会让元素变得非常小(趋于0)。
-
由此可以看出,L1正则化的效力更大,因此,如果数据维度很高,特征量很大,我们倾向于使用L1正则化。
-
如果我们得目的只是简单的正则化防止过拟合,那么用L2就够了,如果L2后还是过拟合或者是在数据集上的表现很差,那就使用L1。
参数penalty
指定正则化的方式,默认为"l2",有以下两种取值:
- l1:即L1正则化,参数solver只能取"saga"和"liblinear";
- l2:即L2正则化,参数solver可以取任意值。
参数C
正则化强度的倒数,一个大于0的浮点数,默认1.0,即正则项与损失函数的比例是1:1;
- C越小,损失函数越小,模型对损失函数的惩罚越重,正则化效力越强,θ会被压缩得越来越小;
- 两种正则化方法下的C值如果没法确定的话,可以使用学习曲线来寻找最优的C值。
属性coef_
查看每个特征对应的参数,可以在正则化前后分别调用该属性来清晰地看到正则化的效果。
例子
lrl1=LR(penalty="l1",solver="liblinear",C=0.5,max_iter=1000)
lrl2=LR(penalty="l2",solver="liblinear",C=0.5,max_iter=1000)
lrl1=lrl1.fit(x,y) #x,y 分别是特征矩阵和标签
lrl1.coef_
array([[ 4.00036718, 0.03179879, -0.13708193, -0.01622688, 0. ,
0. , 0. , 0. , 0. , 0. ,
0. , 0.50444988, 0. , -0.07126651, 0. ,
0. , 0. , 0. , 0. , 0. ,
0. , -0.24568087, -0.12857603, -0.01440636, 0. ,
0. , -2.04168215, 0. , 0. , 0. ]])
lrl2=lrl2.fit(x,y)
lrl2.coef_
array([[ 1.61358623e+00, 1.00284781e-01, 4.61036191e-02,
-4.21333984e-03, -9.27388895e-02, -3.00561176e-01,
-4.53477303e-01, -2.19973055e-01, -1.33257382e-01,
-1.92654788e-02, 1.87887747e-02, 8.75532438e-01,
1.31708341e-01, -9.53440922e-02, -9.64408195e-03,
-2.52457845e-02, -5.83085040e-02, -2.67948347e-02,
-2.74103894e-02, -6.09326731e-05, 1.28405755e+00,
-3.00219699e-01, -1.74217870e-01, -2.23449384e-02,
-1.70489339e-01, -8.77400140e-01, -1.15869741e+00,
-4.22909464e-01, -4.12968162e-01, -8.66604813e-02]])
l1=[]
l2=[]
l1test=[]
l2test=[]
Xtrain,Xtest,Ytrain,Ytest=train_test_split(x,y,test_size=0.3,random_state=420)
for i in np.linspace(0.05,1,19):
lrl1 = LR(penalty="l1",solver="liblinear",C=i,max_iter=1000)
lrl2 = LR(penalty="l2",solver="liblinear",C=i,max_iter=1000)
lrl1 = lrl1.fit(Xtrain,Ytrain)
#用accuracy_score进行打分,来评价预测的效果
l1.append(accuracy_score(lrl1.predict(Xtrain),Ytrain))
l1test.append(accuracy_score(lrl1.predict(Xtest),Ytest))
lrl2 = lrl2.fit(Xtrain,Ytrain)
l2.append(accuracy_score(lrl2.predict(Xtrain),Ytrain))
l2test.append(accuracy_score(lrl2.predict(Xtest),Ytest))
#画曲线来直观得显示预测的效果
graph=[l1,l2,l1test,l2test]
color=["green","black","lightgreen","gray"]
label=["L1","L2","L1test","L2test"]
plt.figure(figsize=(6,6))
for i in range(len(graph)):
plt.plot(np.linspace(0.05,1,19),graph[i],color[i],label=label[i])
plt.legend(loc=4) #图例的位置在哪里?4表示,右下角
plt.show() #由图判断出,当C等于0.8或0.9左右时,四个拟合效果都是好的;若C更大,会表现出过拟合的现象
特征工程
- 业务选择:一个人可以通过很多个特征来进行判别不如使用几个特征来判别的方便。
- 如果熟悉业务,可以自己选择重要的特征;
- 如果不熟悉业务,或特征数量巨大,那么就可以借助算法,筛选过一遍后再根据常识选择出重要的特征。
- PCA和SVD一般不用
- PCA和SVD是高效降维算法,但是其降维后具有不可解释性,所以不用;
- 希望逻辑回归的结果能够保留原特征。