提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
本学习笔记 仅为以防自己忘记了,顺便分享给一起学习的网友们参考。如有不同意见/建议,可以友好讨论。
本学习笔记 所有的代码和数据都可以从 陈强老师的个人主页 上下载
参考书目:陈强.机器学习及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