【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

本学习笔记 仅为以防自己忘记了,顺便分享给一起学习的网友们参考。如有不同意见/建议,可以友好讨论。

本学习笔记 所有的代码和数据都可以从 陈强老师的个人主页 上下载

参考书目:陈强.机器学习及Python应用. 北京:高等教育出版社, 2021.

数学原理等 详见陈强老师的 PPT

注意:
理论上,大家都用的是SAheart.csv 进行逻辑回归,结果应该都是一样的。但是,但是!我的结果和网友小浪要学习【机器学习实战】南非心脏病数据——基于逻辑回归 )的结果不太一样!!o(╥﹏╥)o


一、SAheart.csv

南非心脏病数据 SAheart.csv

sbp: 收缩压 (Systolic Blood Pressure)
tobacco: 吸烟量 (Total Tobacco, in units of 10^9)
ldl: 低密度脂蛋白胆固醇 (Low-Density Lipoprotein Cholesterol)
adiposity: 脂肪率 (Adiposity)
famhist: 家族心脏病史 (Family History of Heart Disease, Yes/No)
typea: A 型行为 (Type A Behavior, a measure of stress)
obesity: 肥胖度 (Obesity)
alcohol: 酒精消费 (Alcohol consumption)
age: 年龄 (Age)
chd: 冠心病 (Coronary Heart Disease, Binary outcome: 1 = presence, 0 = absence)

1. 导入数据

import pandas as pd
import numpy as np

csv_path = r'D:\桌面文件\Python\【陈强-机器学习】MLPython-PPT-PDF\MLPython_Data\SAheart.csv'
SAheart = pd.read_csv(csv_path)
SAheart

在这里插入图片描述

2. 计算样本中有冠心病的比例

chd_count = SAheart['chd'].sum() # 计算有冠心病的样本数量
total_count = len(SAheart) # 计算总样本数量
chd_proportion = chd_count / total_count # 计算比例
print(f'冠心病的比例: {chd_proportion:.2%}')

结果输出: 冠心病的比例: 34.63%

二、处理变量

# 1. 将分类变量转换为虚拟变量:pd.get_dummies(X)
SAheart = pd.get_dummies(SAheart, drop_first=True) 
        # pd.get_dummies(data, columns=None, prefix=None, prefix_sep='_', drop_first=True/False, dtype=np.uint8)
            # drop_first=True 丢弃第一个类别列,用于避免虚拟变量陷阱(即多重共线性)。
            # columns: 需要进行独热编码的列。如果为 None,则会对所有对象类型的列进行编码。
            # prefix: 新生成的列名前缀。
            # dtype: 新列的数据类型,默认是 np.uint8。

# 2. 分离特征和目标变量
X = SAheart.drop('chd', axis=1)
y = SAheart['chd']

# 3. 将数据集分割为训练集和测试集
from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X, y, 
                                                    test_size=100,  # test_size=100 指定了测试集的观测值数量为 100。
                                                    random_state=0)  # random_state=0 保证了结果的可重复性。
            
# 4. 查看 数据集信息
X_train

在这里插入图片描述

三、进行 逻辑回归(Logit)

# 1. 导入LogisticRegression类
from sklearn.linear_model import LogisticRegression
# 2. 创建 LogisticRegression 对象
model = LogisticRegression(
    C=1e10,                 # 正则化强度的倒数 (C=1e10 意味着几乎没有正则化) 
    fit_intercept=False,    # 不包含截距项
    solver='lbfgs', #指定优化算法的参数'lbfgs': 适用于小到中等规模的数据,使用拟牛顿法进行优化,通常效果较好。
    max_iter=1000 # 增加最大迭代次数
)

# 3. 拟合模型
model.fit(X_train, y_train)

# 4. 查看系数和截距
print("Coefficients:", model.coef_)
print("Intercept:", model.intercept_)

结果输出: Coefficients: [[-0.01251471 0.10065951 0.1089968 0.08299478 0.0250039 -0.19136139
-0.0012462 0.03033612 0.74619607]]
Intercept: [0.]

四、预测

1. 在测试集中 预测

# 在测试集中 预测
y_pred = model.predict(X_test)
y_pred[:5] #显示预测结果中的前五个值。

结果输出: array([1, 0, 0, 1, 0], dtype=int64)

2. 计算准确率、错分率、灵敏度、特异度、召回度

# 计算准确率、错分率、灵敏度、特异度、召回度
from sklearn.metrics import classification_report, accuracy_score, confusion_matrix
# 计算准确率
accuracy = accuracy_score(y_test, y_pred)

# 计算混淆矩阵
cm = confusion_matrix(y_test, y_pred)
tn, fp, fn, tp = cm.ravel()

# 打印混淆矩阵
print("Confusion Matrix:")
print(cm)

# 计算并打印分类报告
report = classification_report(y_test, y_pred)
print("\nClassification Report:")
print(report)

# 计算错分率
misclassification_rate = 1 - accuracy

# 计算灵敏度 (召回率)
sensitivity = tp / (tp + fn)

# 计算特异度
specificity = tn / (tn + fp)

# 计算召回度(通常指灵敏度)
recall = sensitivity

print(f"准确率: {accuracy:.4f}")
print(f"错分率: {misclassification_rate:.4f}")
print(f"灵敏度: {sensitivity:.4f}")
print(f"特异度: {specificity:.4f}")
print(f"召回度: {recall:.4f}")

结果输出:
Confusion Matrix:
[[59 7]
[20 14]]
在这里插入图片描述

准确率: 0.7300
错分率: 0.2700
灵敏度: 0.4118
特异度: 0.8939
召回度: 0.4118

五、绘制ROC + 计算AUC

# 1.导入 类
from sklearn.metrics import roc_curve, roc_auc_score, auc
import matplotlib.pyplot as plt

# 2.预测 测试集中的概率
y_prob = model.predict_proba(X_test)[:, 1]

# 3.计算ROC曲线的真正率(True Positive Rate, TPR/sensitivity)和假正率(False Positive Rate, FPR)
fpr, tpr, _ = roc_curve(y_test, y_prob)

# 4.计算auc
roc_auc = auc(fpr, tpr)
print(f"AUC: {roc_auc:.4f}")

# 5.画出ROC
plt.figure(figsize=(8, 6))
plt.plot(fpr, tpr, color='blue', lw=2, label=f'ROC Curve (AUC = {roc_auc:.4f})')
plt.plot([0, 1], [0, 1], color='gray', linestyle='--') 
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate (FPR)')
plt.ylabel('True Positive Rate (TPR)')
plt.title('Receiver Operating Characteristic (ROC) Curve')
plt.legend(loc="lower right")
plt.show()

在这里插入图片描述

六、计算kappa (cohen_kappa_score)

# 1.导入cohen_kappa_score类
from sklearn.metrics import cohen_kappa_score
# 2.将概率转换为二进制预测(设阈值为0.5)
y_pred = (y_prob > 0.5).astype(int)
# 3.计算Kappa
kappa = cohen_kappa_score(y_test, y_pred)
print(f"Cohen's Kappa: {kappa}")

结果输出: Cohen’s Kappa: 0.3369351669941061

  • 30
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值