吴恩达深度学习课程笔记--逻辑回归和损失函数

二元分类(Binary Classification)

     -- 非黑即白,一张猫的图片,只会识别出猫和非猫两种的答案。

        多种特征值组成的X训练出的y结果只会是0或者1

逻辑回归(Logistic Regression)

     -- 一种针对监督学习和二元分类的算法。

凸函数(Convex Function)

     -- 假设一个函数f(x)在定义区间(a, b)内有定义,那么在(a, b)区间内任意点x1,x2以及任意实数λ1,λ2都(λ1 > 0,λ2 > 0, λ1 + λ2 = 1 )恒有:

                                             f(λ1x1+λ2x2) < λ1f(x1) + λ1f(x1)

非凸函数(Non Convex Function)

     -- 不符合凸函数定义的函数即非凹函数。在机器学习寻找预测值与实际值的损失的时候我们通常更倾向于寻找模型损失函数的凸函数,因为便于寻找最小值,而非凸函数则容易使模型陷入局部最优解。

非凹函数图像:

凸函数与非凸函数对比:

逻辑回归损失函数(Logistic Regression Cost Function)

     -- 定义一个拟合各种特征x的函数 ŷ来预测真实的y值,期望 ŷ的值能接近真实的y值

     通常来说,定义平方误差(y -  ŷ)^2或二分之一(1/2((y -  ŷ)^2))平方误差通常是一个可行的损失的计算的公式,但是在逻辑回归中使用平方误差或二分之一平方误差来表达预测过程中的损失会使优化函数变成非凸函数问题,从而产生多个局部最优解,在此基础上使用梯度下降算法来寻找最小损失就无法找到全局最优解。

     总结:用平方误差表示损失函数—合理,但会对梯度下降算法起反作用,因此这里我们会定义一个不同的损失函数来充当平方误差。

在这里我们定义的损失函数为:

定义此损失函数的意义:

      -- 当我们在训练模型的过程中会尽可能的期望损失函数的值能越小越好,因此在这个公式当中:

     如果y的结果为1,将y=1代入,则损失函数L = - log ŷ, 因为我们的目标是得到损失函数的最小值,所以 ŷ 的值应越大越好。

     如果y的结果为0,将y=0代入,则损失函数L = - log(1- ŷ), 因为我们的目标是得到损失函数的最小值,所以 ŷ 的值应越小越好。

以上的损失函数是着眼于一个训练实例,检测一个训练实例的优化程度来定义的,下面我们定义一个代价函数来检测一整个训练集的优化情况。

代价函数(Cost Function)

损失函数如下:即计算所有训练样本总和的平均值,来 检测训练集的整体优化情况

公式展开即为:

其中w是ŷ函数中的权重即斜率,b为ŷ函数中的偏置值即截距

相关案例演示

1.1逻辑回归案例 -- 预测是否为癌症
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
#%%
# 癌症案例   数据中的缺失值用?代替  用Nan代替?方便数据操作
cancer = pd.read_csv('data/breast-cancer-wisconsin.csv')
# 基本数据处理  缺失值处理
cancer = cancer.replace(to_replace='?', value=np.NAN)
cancer = cancer.dropna()
# 确定特征值, 目标值
x = cancer.iloc[:, 1:-1]
y = cancer['Class']
# 分割数据集
X_train, X_test, y_train, y_test = train_test_split(x, y, random_state=22)
# 特征工程
transfer = StandardScaler()
X_train = transfer.fit_transform(X_train)
X_test = transfer.transform(X_test)

# 机器学习
estimator = LogisticRegression()
estimator.fit(X_train, y_train)

# 模型评估
y_pred = estimator.predict(X_test)
# 模型得分
score = estimator.score(X_test, y_test)
print(score)
1.2 分类问题评估
1.2.1 混淆矩阵(精确度,召回率, f1-score),准确度

    --  TN:True Negative 真实值为假例,被分类为假例的样本数量

    --  FN:False Negative 真实值为假例,被分类为假例的样本数量

    --  FP:False Positive 真实值为正例,被分类为假例的样本数量

    -- TP: True Positive 真实值为正例,被分类为正例的样本数量

    -- Precision:精确率, 对正例样本的预测准确率,即被预测为正例的样本中,真正的正例样本占多少

    -- Recall :召回率,预测为真正例的样本所占真实正例样本的比重

    -- F1 Score:预测模型在精确率和召回率两个方面的综合预测能力

    -- Accuracy:模型预测对了的样本的占比

from sklearn.metrics import confusion_matrix
import pandas as pd
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score
y_true = ['恶性', '恶性', '恶性', '恶性', '恶性', '恶性', '良性', '良性', '良性', '良性']
labels = ['恶性', '良性']
dataframe_labels = ['恶性(正例)', '良性(反例)']

# 预测值:预测对了3个恶性肿瘤,4个良性肿瘤
y_pred1 = ['恶性', '恶性', '恶性', '良性', '良性', '良性', '良性', '良性', '良性', '良性']
# 混淆矩阵
cm = confusion_matrix(y_true = y_true, y_pred = y_pred1,  labels=labels)
# 打印矩阵
print(pd.DataFrame(cm, columns=dataframe_labels, index=dataframe_labels))

# 本混淆矩阵的精确度为
ps = precision_score(y_true, y_pred1, pos_label='恶性')
print(ps)

# 召回率为
rs = recall_score(y_true, y_pred1, pos_label='恶性')
print(rs)

# f1-score为
fs = f1_score(y_true, y_pred1, pos_label='恶性')
print(fs)

# 准确率为
ac = accuracy_score(y_true, y_pred1)
print(ac)
1.2.2 ROC曲线、AUC指标

    -- 真正率TPR与假正率FPR

    1.正样本中被预测为正样本的概率TPR(True Positive Rate)

    2.负样本中被预测为正样本的概率FPR(False Positive Rate)

   -- ROC曲线(Receive Operating Characteristic curve)

       是一种常用于评估分类模型性能的可视化工具。ROC曲线以模型的真正率TPR为纵轴,假正.   率FPR为横轴,它将模型在不同阈值下的表现以曲线的形式表现出来。

   -- AUC指标(Area Under the ROC Curve)

      ROC曲线的优劣可以通过曲线下面积来衡量,AUC越大表示分类器性能越好,当AUC=0.5 时,表示分类器的性能等同于随机猜测,当AUC=1时表示分类器的性能完美,能完全正确的区分正负例。

# 电信客户流失案例
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, roc_auc_score
import pandas as pd

churn = pd.read_csv('data/churn.csv')
# 1.数据处理
# 1.1类别型的数据做one-hot编码
churn = pd.get_dummies(churn)
# 1.2在原始数据上删除Churn_no gender_Male
churn.drop(['Churn_No', 'gender_Male'], axis=1, inplace=True)
# 1.3重命名Churn_Yes列为flag
churn.rename(columns={'Churn_Yes':'flag'}, inplace=True)

# 2.特征处理
# 2.1确定目标值和特征值
x = churn[['Contract_Month', 'internet_other', 'PaymentElectronic']]
y = churn['flag']
# 2.2数据集划分
X_train, X_test, y_train, y_test = train_test_split(x, y, test_size=0.3, random_state=100)

# 3.实例化模型
estimator = LogisticRegression()
estimator.fit(X_train, y_train)

# 4.模型预测
y_pred = estimator.predict(X_test)

# 5.模型评估
# 5.1准确度
ac = accuracy_score(y_test, y_pred)
print(ac)
# 5.2 模型自己打分
score = estimator.score(X_test, y_test)
print(score)
# 5.3计算AUC值
auc_score = roc_auc_score(y_test, y_pred)
print(auc_score)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值