一、应用场景
1.逻辑回归主要用来解决二分类问题。
2.二分类问题在具体业务应用中十分常见。
- 预测一个人会不会违约
- 预测一个人会不会点击某个物品
3.二分类问题, 都会转换成 概率问题 , 可以根据概率的高低进行排序, 此时模型的应用就会更加的灵活
二、原理
1.逻辑回归的输入就是一个线性方程。
2.结果输入到sigmoid函数当中。
3.输出结果解释(重要):
- 假设有两个类别A,B,并且假设我们的概率值为属于A(1)这个类别的概率值。
- 现在有一个样本的输入到逻辑回归输出结果0.55,那么这个概率值超过0.5,意味着我们训练或者预测的结果就是A(1)类别。
- 那么反之,如果得出结果为0.3那么,训练或者预测结果就为B(0)类别。
4.逻辑回归概念
- 回归方程的结果输入到sigmoid函数中, 把值域变换成从0~1的区间
- 0~1的区间就代表概率, 当概率>某一个阈值的时候(默认是0.5) 咱们认为它属于一个类别, 当概率<某一个阈值的时候(默认是0.5) 属于另一个类别
- 在使用逻辑回归的时候, 既可以直接预测出标签来, 0,1 。 也可以输出概率值 0~1结果, 可以根据概率排序再做截断。
5.逻辑回归求解的套路 跟线性回归类似的, 也使用梯度下降
- 确定损失函数
- 通过对损失函数求梯度, 找到极小值对应的系数
6.对数似然损失
三、评估
1. 混淆矩阵
真实值是 正例 的样本中,被分类为 正例 的样本数量有多少,这部分样本叫做真正例(TP,True Positive)
真实值是 正例 的样本中,被分类为 假例 的样本数量有多少,这部分样本叫做伪反例(FN,False Negative)
真实值是 假例 的样本中,被分类为 正例 的样本数量有多少,这部分样本叫做伪正例(FP,False Positive)
真实值是 假例 的样本中,被分类为 假例 的样本数量有多少,这部分样本叫做真反例(TN,True Negative)
T F 代表预测对了还是预测错了
- 当样本分布不均衡的时候, 一定要用混淆矩阵, 现实问题中, 样本分布不均衡的情况是很多的
- 精准率 查准率 = TP/TP+FP 模型出1标签的准确率
- 召回率 查全率= TP/TP+FN 模型是不是能把所有的1标签都找到
- F1score 综合考虑了精准率和召回率
2.ROC曲线和AUC指标
ROC曲线的绘制
TPR = TP/TP+FN 召回率 ROC曲线的Y坐标
FPR= FP/ FP+TN ROC曲线的X坐标
每一个样本 都会计算出一个概率值, 利用这个概率值作为阈值, 可以将所有样本打上0,1标签
通过ROC 主要要计算出 AUC (area under curve)
AUC 取值范围 0.5 ~1
- 风控模型 0.75 0.7(非资金场景)
- 推荐系统 0.7左右 就可以上线了
- 如果0~1标签比例 9:1 的情况,超过0.8 需要注意了 如果超过0.85 过拟合
四、案例
癌症分类预测
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
ames = ['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=names,na_values='?')
data['Bare Nuclei'].unique()
data.head()
data.shape
data.info()
data1 = data.dropna()
data1.info()
x = data1.iloc[:,1:10]
y = data1['Class']
x_train,x_test,y_train,y_test = train_test_split(x,y,random_state=22)
transformer = StandardScaler()
x_train = transformer.fit_transform(x_train)
x_test = transformer.transform(x_test)
lr = LogisticRegression()
lr.fit(x_train,y_train)
lr.score(x_test,y_test)
from sklearn.metrics import classification_report
y_pred = lr.predict(x_test)
print(classification_report(y_pred,y_test,labels=[2,4],target_names=['早期','晚期']))
from sklearn.metrics import roc_auc_score
roc_auc_score(y_pred,y_test)
lr.predict(x_test)
y.value_counts()