专业的编程技术博客社区

网站首页 > 博客文章 正文

Python机器学习理论与实战 第二章 Logistic回归模型(下)

baijin 2024-10-29 13:05:52 博客文章 10 ℃ 0 评论

上一篇介绍了 Logistic 回归模型的理论和“泰坦尼克号生还预测”的特征工程部分,更多详细内容可以查看文章《Python机器学习理论与实战 第二章 Logistic 回归模型(上)》,本篇继续介绍模型建立模型评估部分。

建立预测模型

主要包括以下步骤:

  • 数据标准化

    • 使得预测结果不会被某些维度中过大的特征值而主导

  • 训练模型参数

    • fit( )函数/模块

  • 对测试集数据进行预测

    • predict( )函数/模块

    • predict_proba ( )函数/模块


  • 数据标准化

标准化数据,Z-Score方法,保证每个维度的特征数据方差为1均值为0使得预测结果不会被某些维度中过大的特征值而主导

# 从sklearn.preprocessing里导入StandardScaler
from sklearn.preprocessing import StandardScaler
# 标准化数据,保证每个维度的特征数据方差为1,均值为0。使得预测结果不会被某些维度中过大的特征值而主导
ss = StandardScaler()
LR_train = ss.fit_transform(X_train)
LR_test = ss.transform(X_test)
  • 模型训练

# 从sklearn.linear_model里导入LogisticRegression
from sklearn.linear_model import LogisticRegression
# 初始化LogisticRegression
lr = LogisticRegression()
# 调用LogisticRegression中的fit函数/模块用来训练模型参数
lr.fit(LR_train, y_train)
  • 模型预测

# 使用训练好的模型lr对LR_test进行预测,结果储存在变量lr_y_predict中
lr_y_predict = lr.predict(LR_test)
#返回概率
lr_y_predict_proba = lr.predict_proba(LR_test)

模型性能评估

主要使用准确性 Accuracy召回率Recall精确率PrecisionF1值,以及 ROC 曲线AUC 值作为模型性能评价指标。

分类结果

评价指标的计算

ROC曲线

ROC 曲线的全称为“接受者操作特性曲线” (receiver operating characteristic)。

模型预测的结果是得到每一个样本的响应变量取1的概率,为了得到分类结果,需要设定一个阈值 p0,当 p 大于 p0 时,认为该样本的响应变量为 1,否则为 0阈值大小对模型的预测效果有较大影响

    • TPR:True Positive Rate(Recall),将实际的 1 正确地预测为1的概率,TPR=d/(c+d)

    • FPR:False Positive Rate,将实际的 0 错误地预测为1的概率,FPR=b/(a+b)

TPRFPR相互影响,而我们希望能够使 TPR 尽量地大,而 FPR 尽量地小。影响 TPR 与 FPR 的重要因素就是“阈值” p0 。当阈值为0时,所有的样本都被预测为正例,因此 TPR=1,而 FPR=1。此时的 FPR 过大,无法实现分类的效果。随着阈值逐渐增大,被预测为正例的样本数逐渐减少,TPR 和 FPR各自减小,当阈值增大至 1 时,没有样本被预测为正例,此时 TPR=0,FPR=0

TPRFPR 存在同方向变化的关系(这种关系一般是非线性的),即,为了提升 TPR(通过降低阈值),意味着 FPR也将得到提升,两者之间存在类似相互制约的关系。希望能够在牺牲较少 FPR 的基础上尽可能地提高 TPR,由此画出ROC曲线

预测效果较好时,ROC曲线凸向左上角的顶点。平移图中对角线,与 ROC 曲线相切,可以得到 TPR 较大而 FPR 较小的点模型效果越好,则ROC曲线越远离对角线,极端的情形是 ROC 曲线经过(0,1)点,即将正例全部预测为正例而将负例全部预测为负例。ROC曲线下的面积可以定量地评价模型的效果,记作 AUCAUC 越大则模型效果越好

  • 准确性Accuracy/召回率Recall/精确率Precision/F1 Measure

# 从sklearn.metrics里导入classification_report模块
from sklearn.metrics import classification_report
# 使用逻辑斯蒂回归模型自带的评分函数score获得模型在测试集上的准确性结果
print ('Accuracy of LR Classifier:', lr.score(LR_test, y_test))
# 利用classification_report模块获得LogisticRegression其他三个指标的结果
print (classification_report(y_test, lr_y_predict, target_names=['Not Survived','Survived']))

计算结果

  • ROC曲线和 AUC

from sklearn.metrics import roc_curve

import numpy as np

y = np.array(y_test)

pred = np.array(lr_y_predict_proba[:,1])

fpr, tpr, thresholds = roc_curve(y, pred)

from sklearn.metrics import auc

roc_auc = auc(fpr, tpr)

print('AUC of LR Classifier:',auc(fpr, tpr))

plt.title('Receiver Operating Characteristic')

plt.plot(fpr, tpr, 'b',label='AUC = %0.2f'% roc_auc)

plt.legend(loc='lower right')

plt.plot([0,1],[0,1],'r--')

plt.xlim([0,1.0])

plt.ylim([0,1.0])

plt.ylabel('True Positive Rate')

plt.xlabel('False Positive Rate')

plt.show()

AUC of LR Classifier: 0.863317191283

ROC曲线

对于结果我就不做过多解释了,总体来说效果还可以,但是也存在很大的改进空间,未来我们将在特征工程模型融合方面做一些更深入的探索,以提高模型的精度。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表