网站转入备案,好的 做网站的软件公司,软件开发是用什么软件,社区推广怎么做目录
算法介绍
算法概念
算法的优缺点
LogisticRegression()函数理解
环境准备
算法练习 算法介绍
算法概念
逻辑回归#xff08;Logistic Regression#xff09;是一种广泛应用于分类问题的机器学习算法。 它基于线性回归的思想#xff0c;但通过引入一个逻辑函数Logistic Regression是一种广泛应用于分类问题的机器学习算法。 它基于线性回归的思想但通过引入一个逻辑函数如 Sigmoid 函数将线性回归的输出值映射到 0 到 1 之间从而得到事件发生的概率估计。 算法的优缺点
逻辑回归的优点包括 计算效率高训练速度快。 模型简单易懂可解释性强。 能够处理线性可分和近似线性可分的数据。
逻辑回归的缺点 容易欠拟合分类精度可能不高。
LogisticRegression()函数理解
def __init__(self,penaltyl2,*,dualFalse,tol1e-4,C1.0,fit_interceptTrue,intercept_scaling1,class_weightNone,random_stateNone,solverlbfgs,max_iter100,multi_classauto,verbose0,warm_startFalse,n_jobsNone,l1_ratioNone,
):
#参数理解Penalty正则化方式有l1和l2两种。用于指定惩罚项中使用的规范。newton-cg、sag和lbfgs求解算法只支持L2规范。L1G规范假设的是模型的参数满足拉普拉斯分布L2假设的模型参数满足高斯分布所谓的范式就是加上对参数的约束使得模型更不会过拟合(overfit)理论上加了约束泛化能力更强。
Dual按默认即可。对偶方法只用在求解线性多核(liblinear)的L2惩罚项上。当样本数量样本特征的时候dual通常设置为False。
Tolfloat默认值1e-4容许停止标准即我们说的要迭代停止所需达到的精度要求。
C正则化强度。为浮点型数据。正则化系数λ的倒数float类型默认为1.0。必须是正浮点型数像SVM一样越小的数值表示越强的正则化。
fit_intercept指定是否应该将常量(即偏差或截距)添加到决策函数中。相当于是否加入截距项b。默认加入。
intercept_scaling仅在正则化项为”liblinear”且fit_intercept设置为True时有用。float类型默认为1。
class_weight用于标示分类模型中各种类型的权重可以是一个字典或者’balanced’字符串默认为None
也就是不考虑权重在出现样本不平衡时可以考虑调整class_weight系数去调整防止算法对训练样本多的类别偏倚。用于标示分类模型中各种类型的权重可以是一个字典或者’balanced’字符串默认为不输入也就是不考虑权重即为None。如果选择输入的话可以选择balanced让类库自己计算类型权重或者自己输入各个类型的权重。举个例子比如对于0,1的二元模型我们可以定义class_weight{0:0.9,1:0.1}这样类型0的权重为90%而类型1的权重为10%。如果class_weight选择balanced那么类库会根据训练样本量来计算权重。某种类型样本量越多则权重越低样本量越少则权重越高。当class_weight为balanced时类权重计算方法如下n_samples / (n_classes * np.bincount(y))。n_samples为样本数n_classes为类别数量np.bincount(y)会输出每个类的样本数例如y[1,0,0,1,1],则np.bincount(y)[2,3]。
那么class_weight有什么作用呢
在分类模型中我们经常会遇到两类问题
第一种是误分类的代价很高。比如对合法用户和非法用户进行分类将非法用户分类为合法用户的代价很高我们宁愿将合法用户分类为非法用户这时可以人工再甄别但是却不愿将非法用户分类为合法用户。这时我们可以适当提高非法用户的权重。
第二种是样本是高度失衡的比如我们有合法用户和非法用户的二元样本数据10000条里面合法用户有9995条非法用户只有5条如果我们不考虑权重则我们可以将所有的测试集都预测为合法用户这样预测准确率理论上有99.95%但是却没有任何意义。这时我们可以选择balanced让类库自动提高非法用户样本的权重。提高了某种分类的权重相比不考虑权重会有更多的样本分类划分到高权重的类别从而可以解决上面两类问题。
random_state伪随机数产生器在对数据进行洗牌时使用的种子。仅在正则化优化算法为sag,liblinear时有用。
Solver{‘newton-cg’, ‘lbfgs’, ‘liblinear’, ‘sag’, ‘saga’}优化拟合参数算法选择默认为liblinear。solver参数决定了我们对逻辑回归损失函数的优化方法有四种算法可以选择分别是
liblinear使用坐标轴下降法来迭代优化损失函数。使用了开源的liblinear库实现内部使用了坐标轴下降法来迭代优化损失函数。
newton-cg牛顿法sag方法使用一阶导数而牛顿法采用了二阶泰勒展开这样缩减了迭代轮数但是 需要计算Hsssian矩阵的逆所以计算复杂度较高。【也是牛顿法家族的一种利用损失函数二阶导数矩阵即海森矩阵来迭代优化损失函数。】
Lbfgs拟牛顿法考虑到牛顿法的Hessian矩阵求逆太过复杂尤其在高维问题中几乎不可行想到了用较低的代价寻找Hessian矩阵的近似逆矩阵便有了拟牛顿法。【拟牛顿法的一种利用损失函数二阶导数矩阵即海森矩阵来迭代优化损失函数。】
Sag即随机平均梯度下降类似于我们的stocGradAscent1函数思想是常用的一阶优化方法是求解无约束优化问题最经典最简单的方法之一。【即随机平均梯度下降是梯度下降法的变种和普通梯度下降法的区别是每次迭代仅仅用一部分的样本来计算梯度适合于样本数据多的时候。】
Saga线性收敛的随机优化算法。【线性收敛的随机优化算法的的变种。】
总结
liblinear适用于小数据集而sag和saga适用于大数据集因为速度更快。
对于多分类问题只有newton-cg,sag,saga和lbfgs能够处理多项损失而liblinear受限于一对剩余(OvR)。啥意思就是用liblinear的时候如果是多分类问题得先把一种类别作为一个类别剩余的所有类别作为另外一个类别。依次类推遍历所有类别进行分类。
newton-cg,sag和lbfgs这三种优化算法时都需要损失函数的一阶或者二阶连续导数因此不能用于没有连续导数的L1正则化只能用于L2正则化。而liblinear和saga通吃L1正则化和L2正则化。
同时sag每次仅仅使用了部分样本进行梯度迭代所以当样本量少的时候不要选择它而如果样本量非常大比如大于10万sag是第一选择。但是sag不能用于L1正则化所以当你有大量的样本又需要L1正则化的话就要自己做取舍了。要么通过对样本采样来降低样本量要么回到L2正则化。
从上面的描述大家可能觉得既然newton-cg, lbfgs和sag这么多限制如果不是大样本我们选择liblinear不就行了嘛错因为liblinear也有自己的弱点我们知道逻辑回归有二元逻辑回归和多元逻辑回归。对于多元逻辑回归常见的有one-vs-rest(OvR)和many-vs-many(MvM)两种。而MvM一般比OvR分类相对准确一些。郁闷的是liblinear只支持OvR不支持MvM这样如果我们需要相对精确的多元逻辑回归时就不能选择liblinear了。也意味着如果我们需要相对精确的多元逻辑回归不能使用L1正则化了。
max_iter算法收敛最大迭代次数int类型默认为100。仅在正则化优化算法为newton-cg, sag和lbfgs才有用算法收敛的最大迭代次数。
multi_class分类方式选择参数str类型可选参数为ovr和multinomial默认为ovr。ovr即前面提到的one-vs-rest(OvR)而multinomial即前面提到的many-vs-many(MvM)。如果是二元逻辑回归ovr和multinomial并没有任何区别区别主要在多元逻辑回归上。
OvR和MvM有什么不同?
OvR的思想很简单无论你是多少元逻辑回归我们都可以看做二元逻辑回归。具体做法是对于第K类的分类决策我们把所有第K类的样本作为正例除了第K类样本以外的所有样本都作为负例然后在上面做二元逻辑回归得到第K类的分类模型。其他类的分类模型获得以此类推。
而MvM则相对复杂这里举MvM的特例one-vs-one(OvO)作讲解。如果模型有T类我们每次在所有的T类样本里面选择两类样本出来不妨记为T1类和T2类把所有的输出为T1和T2的样本放在一起把T1作为正例T2作为负例进行二元逻辑回归得到模型参数。我们一共需要T(T-1)/2次分类。
可以看出OvR相对简单但分类效果相对略差这里指大多数样本分布情况某些样本分布下OvR可能更好。而MvM分类相对精确但是分类速度没有OvR快。如果选择了ovr则4种损失函数的优化方法liblinearnewton-cg,lbfgs和sag都可以选择。但是如果选择了multinomial,则只能选择newton-cg, lbfgs和sag了。
verbose日志冗长度int类型。默认为0。就是不输出训练过程1的时候偶尔输出结果大于1对于每个子模型都输出。
warm_start热启动参数bool类型。默认为False。如果为True则下一次训练是以追加树的形式进行重新使用上一次的调用作为初始化。
n_jobs并行数。int类型默认为1。1的时候用CPU的一个内核运行程序2的时候用CPU的2个内核运行程序。为-1的时候用所有CPU的内核运行程序。
在实际应用中逻辑回归常用于以下场景 二分类问题如预测是否患病、是否购买产品等。 作为基准模型与其他复杂模型进行比较。
逻辑回归的参数估计通常使用最大似然估计或梯度下降等优化算法来求解。在评估模型性能时可以使用准确率、召回率、F1 值等指标。 然而逻辑回归也有一些局限性例如对于非线性关系的拟合能力有限在处理复杂数据时可能表现不佳。但通过特征工程、与其他算法结合等方法可以在一定程度上克服这些不足。
环境准备
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn import metrics
from sklearn.preprocessing import StandardScaler 导入数据标准化处理的类 StandardScaler 用于对数据进行标准化操作使得不同特征具有相似的尺度。from sklearn.linear_model import LogisticRegression 导入逻辑回归模型 LogisticRegression 用于构建逻辑回归分类器。from sklearn.model_selection import train_test_split 导入数据分割的函数 train_test_split 用于将数据集分割为训练集和测试集。from sklearn import metrics 导入用于模型评估指标计算的模块例如准确率、召回率、F1 值等的计算函数。
算法练习
下面为银行贷款分析数据的部分截图第一列为时间可以删除最后一列为是否允许贷款的判定结果视为类别中间为特征列。
问题 将数据集划分为特征集和目标变量然后进一步划分为训练集和测试集。 创建逻辑回归模型并进行训练。 在测试集上进行预测并计算准确率打印分类结果报告。 from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn import metrics
import pandas as pd
# 读取信用卡数据集
data pd.read_csv(creditcard.csv)
data.head()
# 创建数据标准化对象
scalerStandardScaler()
# 获取数据中的Amount列以二维数组形式
adata[[Amount]]
# 获取数据中的Amount列以一维数组形式
bdata[Amount]
# 对Amount列进行标准化处理
data[Amount]scaler.fit_transform(data[[Amount]])
# 按列删除Time列
datadata.drop([Time],axis1)
# 定义特征集删除Class列
X_wholedata.drop(Class,axis1)
# 定义目标变量即Class列
Y_wholedata.Class
# 将数据集划分为训练集和测试集测试集占比0.3设置随机数种子为1000
x_train_w,x_test_w,y_train_w,y_test_w \train_test_split(X_whole,Y_whole,test_size 0.3,random_state 1000)
# 创建逻辑回归模型C1
lr LogisticRegression(C1)
# 使用训练集训练模型
lr.fit(x_train_w,y_train_w)
# 在测试集上进行预测
train_predicted lr.predict(x_test_w)
# 计算模型在测试集上的准确率
result lr.score(x_test_w,y_test_w)
# 获取分类结果报告
print(metrics.classification_report(y_test_w, train_predicted))