逻辑回归是经典的分类模型,使用的是sigmod函数
我们可以画图尝试,在结果为1是,被分到1的损失越小,远离1的损失越大,log在0,1取值正好满足
综合后的损失函数为:
这里逻辑回归中优化损失的方法有两个:梯度下降和正则化
梯度下降
正则化
其中J()是我们之前提过的损失函数,C是用来控制正则化程度的超参数,n是方程中特征的总数,也是方程中参数的总数,j代表每个参数(w系数)。在这里,j要大于等于1,是因为我们的参数向量中,第一个参数是0,是我们的截距它通常是不参与正则化的。
总结:
L1和L2范式的区别
from sklearn.linear_model import LogisticRegression
from sklearn.neighbors import KNeighborsClassifier
from sklearn.naive_bayes import GaussianNB
import sklearn.datasets as dt
from sklearn.model_selection import train_test_split
feature = dt.load_breast_cancer()['data']
target = dt.load_breast_cancer()['target']
x_train,x_test,y_train,y_test = train_test_split(feature,target,test_size=0.2,random_state=2021)
knn = KNeighborsClassifier().fit(x_train,y_train)
print('knn:',knn.score(x_test,y_test))
gs = GaussianNB().fit(x_train,y_train)
print('gs:',gs.score(x_test,y_test))
l = LogisticRegression().fit(x_train,y_train)
print('l:',l.score(x_test,y_test))
# 结果:
knn: 0.9035087719298246
gs: 0.9385964912280702
l: 0.9210526315789473
l = LogisticRegression(penalty='l1',solver='liblinear',max_iter=500).fit(x_train,y_train)
print('l:',l.score(x_test,y_test)) # l: 0.9298245614035088
相关知识点:https://blog.csdn.net/xiaoyoupei/article/details/121547135
概念:在分类任务下,预测结果(Predict Condition)和真实结果(True Condition)之间存在的四种不同的组合。适用于二分类和多分类
例子:设计一个二分类的场景,将图片分类为猫或者狗。则:
真正例(TP):本来是猫结果预测值为猫的比例(预测为正例是真的)
伪正例(FP):本来不是猫结果预测值为猫的比例(预测为正例是假的)
伪反例(FN):本来是猫结果预测值为不是猫的比例(预测为反例是假的)
真反例(TN):本来不是猫结果预测值为不是猫的比例(预测为反例是真的)
真正例率TPR = TP / (TP + FN)
伪反例率FPR = FP / (FP + TN)
在数据不均衡的场景下,我们应该考虑的评估指标应该是精确率和召回率。
Recal = TP/(TP+FN)
from sklearn.linear_model import LogisticRegression
import sklearn.datasets as dt
from sklearn.model_selection import train_test_split
from sklearn.metrics import recall_score #召回率
from sklearn.metrics import accuracy_score #精确率
from sklearn.metrics import f1_score
feature = dt.load_breast_cancer()['data']
target = dt.load_breast_cancer()['target']
x_train,x_test,y_train,y_test = train_test_split(feature,target,test_size=0.2,random_state=2021)
l = LogisticRegression().fit(x_train,y_train)
print('准确率:',l.score(x_test,y_test))
print('召回率:',recall_score(y_test,l.predict(x_test)))
print('精确率:',accuracy_score(y_test,l.predict(x_test)))
print('f1-score:',f1_score(y_test,l.predict(x_test)))
# 结果:
准确率: 0.9210526315789473
召回率: 0.9722222222222222
精确率: 0.9210526315789473
f1-score: 0.9395973154362416
AUC是一个模型评价指标,只能用于二分类模型的评价。该评价指标通常应用的比较多!
AUC(Area under Curve),表面上意思是曲线下边的面积,这么这条曲线是什么?
ROC曲线(receiver operating characteristic curve,接收者操作特征曲线)
真正例率TPR = TP / (TP + FN)
- 预测为正例且实际为正例的样本占所有训练集中为正例样本的比例。
- 将正例预测对的占正样本的比例(预测对的比例),这个比例越大越好
伪反例率FPR = FP / (FP + TN)
- 预测为正例但实际为负例的样本占训练集中所有负例样本的比例
- 将负例预测错的占负样本的比例(预测错的比例),这个比例越小越好
在理想情况下,最佳的分类器应该尽可能地处于左上角,这就意味着分类器在伪反例率(预测错的概率)很低的同时获得了很高的真正例率(预测对的概率)。也就是说ROC曲线围起来的面积越大越好,因为ROC曲线面积越大,则曲线上面的面积越小,则分类器越能停留在ROC曲线的左上角。
AUC的API
from sklearn.metrics import roc_auc_score
l = LogisticRegression().fit(x_train,y_train)
#y_score是模型将测试样本集分到正例类别的概率
y_score = l.predict_proba(x_test)[:,1]
roc_auc_score(y_test,y_score) # 0.9847883597883598