博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
逻辑回归
阅读量:6245 次
发布时间:2019-06-22

本文共 3087 字,大约阅读时间需要 10 分钟。

逻辑回归是一种分类算法,虽然名字中带有回归。但是它与回归之间有一定的联系。

逻辑回归的原理:

输入

逻辑回归的输入就是一个线性回归的结果

sigmoid函数(激活函数)

回归的结果输入到sigmoid函数当中

输出结果:[0, 1]区间中的一个概率值,默认为0.5为阈值
逻辑回归最终的分类是通过属于某个类别的概率值来判断是否属于某个类别,并且这个类别默认标记为1(正例),另外的一个类别会标记为0(反例)。(方便损失计算)

假设有两个类别A,B,并且假设我们的概率值为属于A(1)这个类别的概率值。现在有一个样本的输入到逻辑回归输出结果0.6,那么这个概率值超过0.5,意味着我们训练或者预测的结果就是A(1)类别。那么反之,如果得出结果为0.3那么,训练或者预测结果就为B(0)类别。

 

衡量逻辑回归的预测结果与真实结果的差异衡量逻辑回归的预测结果与真实结果的差异

损失,称之为对数似然损失,公式如下:

当y=1时:

完整损失函数: 

使用梯度下降优化算法,可以减少损失函数的值。更新逻辑回归前面对应算法的权重参数,提升原本属于1类别的概率,降低原本是0类别的概率。

 

逻辑回归在sklearn中的API

sklearn.linear_model.LogisticRegression(solver='liblinear', penalty=‘l2’, C = 1.0)
solver:优化求解方式(默认开源的liblinear库实现,内部使用了坐标轴下降法来迭代优化损失函数)
sag:根据数据集自动选择,随机平均梯度下降
penalty:正则化的种类
C:正则化力度
默认将类别数量少的当做正例

 

示例:癌症分类预测

数据集来源: :

数据描述:

699条样本,共11列数据,第一列用于检索的id,后9列分别是与肿瘤相关的医学特征,最后一列表示肿瘤类型的数值;包含16个缺失值,用”?”标出

完整代码实现:

import pandas as pdimport numpy as npfrom sklearn.model_selection import train_test_splitfrom sklearn.preprocessing import StandardScalerfrom sklearn.linear_model import LogisticRegressiondef logisticregression():    """    逻辑回归进行癌症预测    :return: None    """    # 1、读取数据,处理缺失值以及标准化    column_name = ['Sample code number', 'Clump Thickness', 'Uniformity of Cell Size', 'Uniformity of Cell Shape',                   'Marginal Adhesion', 'Single Epithelial Cell Size', 'Bare Nuclei', 'Bland Chromatin',                   'Normal Nucleoli', 'Mitoses', 'Class']    data = pd.read_csv(        "https://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/breast-cancer-wisconsin.data",        names=column_name    )    # 删除缺失值    data = data.replace(to_replace='?', value=np.nan)    data = data.dropna()    # 取出特征值    x = data[column_name[1:10]]    y = data[column_name[10]]    # 分割数据集    x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3)    # 进行标准化    std = StandardScaler()    x_train = std.fit_transform(x_train)    x_test = std.transform(x_test)    # 使用逻辑回归    lr = LogisticRegression()    lr.fit(x_train, y_train)    print("得出来的权重:", lr.coef_)    # 预测类别    print("预测的类别:", lr.predict(x_test))    # 得出准确率    print("预测的准确率:", lr.score(x_test, y_test))    return Nonelogisticregression()

 

预测结果:

 

分类评估报告

sklearn.metrics.classification_report(y_true, y_pred, labels=[], target_names=None )
y_true:真实目标值
y_pred:估计器预测目标值
labels:指定类别对应的数字
target_names:目标类别名称
return:每个类别精确率与召回率

print("精确率和召回率为:", classification_report(y_test, lr.predict(x_test), labels=[2, 4], target_names=['良性', '恶性']))

评估报告结果:

 

 

 

 

衡量样本不均衡下的评估---AUC指标

AUC的概率意义是随机取一对正负样本,正样本得分大于负样本的概率

AUC的最小值为0.5,最大值为1,取值越高越好
AUC=1,完美分类器,采用这个预测模型时,不管设定什么阈值都能得出完美预测。绝大多数预测的场合,不存在完美分类器。
0.5<AUC<1,优于随机猜测。这个分类器(模型)妥善设定阈值的话,能有预测价值。
AUC=0.5,跟随机猜测一样(例:丢铜板),模型没有预测价值。
AUC<0.5,比随机猜测还差;但只要总是反预测而行,就优于随机猜测,因此不存在 AUC<0.5 的情况。
最终AUC的范围在[0.5, 1]之间,并且越接近1越好

AUC计算API

from sklearn.metrics import roc_auc_score
sklearn.metrics.roc_auc_score(y_true, y_score)
计算ROC曲线面积,即AUC值
y_true:每个样本的真实类别,必须为0(反例),1(正例)标记
y_score:每个样本预测的概率值
# 0.5~1之间,越接近于1约好
y_test = np.where(y_test > 2.5, 1, 0)

 

print("AUC指标:", roc_auc_score(y_test, lr.predict(x_test)))

 AUC指标: 0.959063378758382

转载于:https://www.cnblogs.com/FG123/p/10787776.html

你可能感兴趣的文章
thinkphp用ajax遇到的坑——ajax请求没有反应
查看>>
Microsoft Visual Studio 中出现 Windows has triggered a breakpoint in xxx.exe的一个解决方案
查看>>
非常直白的 js 闭包概念.<转载>
查看>>
shared_ptr模版推导的问题
查看>>
mac下用ruby安装sass && webstorm下给scss文件添加watch
查看>>
前端Demo常用库文件链接
查看>>
react create-react-app 跨域
查看>>
python html parse
查看>>
本机连接调试Erlang结点与rebar3编译
查看>>
web基础html元素制作web
查看>>
Codeforces 96C - Hockey
查看>>
生成树协议
查看>>
Web应用三种部署方式的优缺点
查看>>
python爬虫——绕开杂乱无章的代码和堵住请求的302异常(2)
查看>>
static易错点
查看>>
js获取当前日期(年月日格式)
查看>>
LeetCode【217. Contains Duplicate】
查看>>
EBook
查看>>
单词加密
查看>>
【转】关于使用GUID和Identity做主键的一些思考
查看>>