逻辑回归学习总结

逻辑回归(LR)解决的不是回归,而是分类问题。

核心思想:线性回归中出现的值通过sigmoid= 11+e-z转化到(0,1)之间,通过判断输出与0.5(z=0)的关系来做二分类。(时间复杂度O(nd),d为特征维数)

(线性回归:y=wTx+b => 线性回归:logistic= 11+e-wTx+b<即带入y值至sigmoid函数即可>)

  1. sigmoid函数可以减少线性回归中极端点(偏差过大点)的影响
  2. sigmoid函数的取值为(0,1),因此贴合概率模型
  3. sigmoid是神经网络的重要基础之一
  4. 逻辑回归函数求导即为g'z= gz*(1-g(z))用于梯度下降法求解。

代码:

from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import  classification_report
import numpy as np
import pandas as pd


if __name__ == '__main__':
    df_data = pd.read_csv('./merge_data.csv',header=None)
    df =df_data
    df.columns = ['id', 'expiration_id', 'src_ip',
                             'src_mac', 'src_oui', 'src_port',
                             'dst_ip', 'dst_mac', 'dst_oui',
                             'dst_port', 'protocol', 'ip_version',
                             'vlan_id', 'tunnel_id', 'bidirectional_first_seen_ms',
                             'bidirectional_last_seen_ms', 'bidirectional_duration_ms', 'bidirectional_packets',
                             'bidirectional_bytes', 'src2dst_first_seen_ms', 'src2dst_last_seen_ms',
                             'src2dst_duration_ms', 'src2dst_packets', 'src2dst_bytes',
                             'dst2src_first_seen_ms', 'dst2src_last_seen_ms', 'dst2src_duration_ms',
                             'dst2src_packets', 'dst2src_bytes', 'bidirectional_min_ps',
                             'bidirectional_mean_ps', 'bidirectional_stddev_ps', 'bidirectional_max_ps',
                             'src2dst_min_ps', 'src2dst_mean_ps', 'src2dst_stddev_ps',
                             'src2dst_max_ps', 'dst2src_min_ps', 'dst2src_mean_ps',
                             'dst2src_stddev_ps', 'dst2src_max_ps', 'bidirectional_min_piat_ms',
                             'bidirectional_mean_piat_ms', 'bidirectional_stddev_piat_ms',
                             'bidirectional_max_piat_ms',
                             'src2dst_min_piat_ms', 'src2dst_mean_piat_ms', 'src2dst_stddev_piat_ms',
                             'src2dst_max_piat_ms', 'dst2src_min_piat_ms', 'dst2src_mean_piat_ms',
                             'dst2src_stddev_piat_ms', 'dst2src_max_piat_ms', 'bidirectional_syn_packets',
                             'bidirectional_cwr_packets', 'bidirectional_ece_packets', 'bidirectional_urg_packets',
                             'bidirectional_ack_packets', 'bidirectional_psh_packets', 'bidirectional_rst_packets',
                             'bidirectional_fin_packets', 'src2dst_syn_packets', 'src2dst_cwr_packets',
                             'src2dst_ece_packets', 'src2dst_urg_packets', 'src2dst_ack_packets',
                             'src2dst_psh_packets', 'src2dst_rst_packets', 'src2dst_fin_packets',
                             'dst2src_syn_packets', 'dst2src_cwr_packets', 'dst2src_ece_packets',
                             'dst2src_urg_packets', 'dst2src_ack_packets', 'dst2src_psh_packets',
                             'dst2src_rst_packets', 'dst2src_fin_packets', 'application_name',
                             'application_category_name', 'application_is_guessed', 'application_confidence',
                             'requested_server_name', 'client_fingerprint', 'server_fingerprint', 'user_agent',
                             'content_type', 'label']
    df = df.drop(['id', 'expiration_id', 'src_ip',
                             'src_mac', 'src_oui', 'src_port',
                             'dst_ip', 'dst_mac', 'dst_oui',
                             'dst_port', 'protocol', 'ip_version',
                             'vlan_id', 'tunnel_id', 'bidirectional_first_seen_ms',
                          'bidirectional_last_seen_ms', 'src2dst_first_seen_ms', 'src2dst_last_seen_ms',
                          'dst2src_first_seen_ms', 'dst2src_last_seen_ms', 'bidirectional_min_piat_ms',
                          'bidirectional_mean_piat_ms',
                          'bidirectional_max_piat_ms',
                          'src2dst_min_piat_ms', 'src2dst_mean_piat_ms',
                          'src2dst_max_piat_ms', 'dst2src_min_piat_ms', 'dst2src_mean_piat_ms',
                          'dst2src_max_piat_ms', 'application_name',
                          'application_category_name', 'application_is_guessed', 'application_confidence',
                          'requested_server_name', 'client_fingerprint', 'server_fingerprint', 'user_agent',
                          'content_type'], axis=1)

    labels = np.array(df['label'][1:])
    labels = labels.astype('int')

    df = df.drop(['label'],axis=1)
    df = df[1:]
    df = np.array(df)
    train_sample,test_sample,train_label,test_label =train_test_split(df,labels,test_size=0.3,random_state=11)
    """注意正则化影响损失函数优化算法:L1正则化的损失函数不是连续可导的,而{‘newton-cg’, ‘lbfgs’,‘sag’}
    这三种优化算法时都需要损失函数的一阶或者二阶连续导数。而‘liblinear’并没有这个依赖。"""
    model1 = LogisticRegression(penalty='l1',C=0.5,max_iter=100,solver="liblinear")
    model2 = LogisticRegression(penalty='l2',C=0.5,max_iter=100,solver="liblinear")

    model1.fit(train_sample,train_label)
    model2.fit(train_sample, train_label)


    true = test_label.tolist()
    predict1 = model1.predict(test_sample)
    predict2 = model2.predict(test_sample)

    print(classification_report(y_true=true,y_pred=predict1))
    print(classification_report(y_true=true, y_pred=predict2))

逻辑回归的损失函数:损失函数一般定义为预测值和真实值的差(预测值拟合真实分布的好坏),而逻辑回归中的损失函数等同于最大似然函数(交叉熵)。

交叉熵:可以从两个角度理解

(y代表真实值,y拔代表预测值)

(1)从对数似然函数理解

上述式子是所有事件的总概率,由sigmoid推导得来,取ln即可得到对数似然函数。通过最大化似然函数来求解参数w和b。

(2)从信息论的角度理解

KL散度用于衡量两个分布之间的差异:

展开KL散度得:

q为预测分布,则可得KL散度=交叉熵-真实分布的信息熵,又真实分布的信息熵是常数,故交叉熵越小即可。

交叉熵的优点是比均方误差学习速度快,有利于梯度下降迭代,尤其是模型效果差的时候;模型效果好时会变慢。

缺点:标准的交叉熵损失确实一直都只利用了每个样本正确类别的信息,错误类别的信息并未充分利用。采用了类间竞争机制,比较擅长于学习类间的信息,但是只关心对于正确标签预测概率的准确性,而忽略了其他非正确标签的差异,从而导致学习到的特征比较散。

梯度下降法:求解损失函数的极小值,也就是通过损失函数导函数值找到函数下降的方向直到找到最低点(极值点)。

逻辑回归的优化办法:

1. 解决过拟合:

(1)减少特征

(2)正则化:L1(数据稀疏)、L2(其他)

2. 损失函数:

选择随机梯度下降、批梯度下降等

逻辑回归的优点:

1)计算量只与特征有关,高效

(2)可解释性强,从特征的w权重可看到不同特征对结果的影响

(3)二分类效果好

(4)内存占用小,只需要存储特征值

逻辑回归的缺点:

(1)由于是基于线性回归的,不能解决非线性问题(决策面是线性的)

(2)不同类别数据如果多重共线性,模型较为敏感

(3)很难处理不平衡数据(模型优化目标是最小化模型在训练集上的平均损失。具体而言,逻辑回归采用的最大后验概率的策略,他的目标是使得训练集总体的后验概率最大,因此这种算法天然地会将关注点更多地放在多数类的拟合情况下。)

(4)准确率不高,线性模型难以拟合真实分布(欠拟合)

(5)无法筛选特征(可使用GBDT筛选)

(6)不适用于多分类

(7)特征维数过多时不好,不能学习特征间的非线性关系

-----------------------------------------------------------

跑的速度还行:43维特征,100多万条数据

大概20多秒,结果分别是L1和L2正则化的,另外L2正则化结果和非正则一致。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值