机器学习-day3 逻辑回归
2023-08-12 本文已影响0人
后青春期的诗大喵
一、应用场景
1.逻辑回归主要用来解决二分类问题。
2.二分类问题在具体业务应用中十分常见。
- 预测一个人会不会违约
- 预测一个人会不会点击某个物品
3.二分类问题, 都会转换成 概率问题 , 可以根据概率的高低进行排序, 此时模型的应用就会更加的灵活
二、原理
1.逻辑回归的输入就是一个线性方程。
image.png
2.结果输入到sigmoid函数当中。
image.png
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.对数似然损失
image.png
image.png
三、评估
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()