机器学习分类算法实践:Scikit-learn逻辑回归示例

部署运行你感兴趣的模型镜像

scikit-learn逻辑回归示例

学习目标

在本课程中你将通过预测甲状腺功能减退的例子来学习并掌握逻辑回归的基本概念和工作原理。

相关知识点

  • scikit-learn逻辑回归

学习内容

1 scikit-learn逻辑回归

逻辑回归(Logistic Regression)是一种广泛应用于分类任务中的统计学习方法,尤其适用于二分类问题。尽管其名称中包含“回归”二字,但它本质上是一个概率模型,通过将线性回归的输出映射到 [0,1] 区间来预测样本属于某一类别的概率。

该方法的核心在于使用了 Sigmoid 函数(也称为 Logistic 函数),将线性组合的结果转化为事件发生的概率。这使得我们可以对输入特征与输出类别之间的关系进行建模,并根据设定的阈值(通常为0.5)进行类别判断。

逻辑回归具有良好的可解释性和计算效率,是许多实际应用中的首选模型,例如信用评分、疾病预测、广告点击率预估等场景。它也可以通过引入正则化项(如 L1 或 L2 正则化)来防止过拟合,从而提升模型的泛化能力。

虽然逻辑回归是一种线性模型,不能直接处理复杂的非线性关系,但它是理解更复杂分类算法(如神经网络和支持向量机)的重要基础,在机器学习的学习路径中占据着关键位置。

1.1 配置运行环境

在开始实验之前,需要确保开发环境中已安装以下Python库:

  • numpy:科学计算库,用于数值运算。
  • pandas:数据处理与分析工具。
  • scikit-learn:机器学习库,提供分类、回归、聚类等功能。
  • statsmodels:用于统计建模与检验。
  • matplotlib/seaborn:可视化工具,用于绘制图表。
%pip install seaborn
%pip install statsmodels
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
1.2 读取数据集

本课程以一个模拟的甲状腺功能减退数据集为例,该数据集中包含多个临床指标(如TSH、T3、T4等),以及一个二元标签(是否患有甲状腺功能减退)。

names = 'response age sex on_thyroxine query_on_thyroxine antithyroid_medication thyroid_surgery query_hypothyroid query_hyperthyroid pregnant \
sick tumor lithium goitre TSH_measured TSH T3_measured \
T3 TT4_measured TT4 T4U_measured T4U FTI_measured FTI TBG_measured TBG'
names = names.split(' ')
!wget https://model-community-picture.obs.cn-north-4.myhuaweicloud.com/ascend-zone/notebook_datasets/3278e712da3511efb356fa163edcddae/hypothyroid.zip

!unzip hypothyroid.zip
!mkdir Data
!mv hypothyroid.csv Data/
df = pd.read_csv('Data/hypothyroid.csv',index_col=False,names=names,na_values=['?'])
df.head()
to_drop=[]
for c in df.columns:
    if 'measured' in c or 'query' in c:
        to_drop.append(c)
to_drop
to_drop.append('TBG')
df.drop(to_drop,axis=1,inplace=True)
df.head()
1.3 查看数据集的基本统计信息
df.describe().T
是否有任何数据点缺失?我们可以使用df.isna()方法来检查

df.isna()方法会返回一个与原数据框结构相同的布尔值数据框,其中数据存在位置为 False,缺失数据位置为 True。我们可以在该布尔值数据框上使用sum()方法来查看并计算每一列中缺失值的数量

df.isna().sum()
使用 df.dropna()方法来删除那些包含缺失值的行
df.dropna(inplace=True)
df.shape
1.4 创建一个转换函数,将 +-的响应分别转换为 1 和 0。

由于逻辑回归要求因变量是数值形式,我们需要将原始数据中的类别标签转换为数字:

def class_convert(response):
    if response=='hypothyroid':
        return 1
    else:
        return 0

df['response']=df['response'].apply(class_convert)
df.head()
df.columns

1.5 探索性数据分析
for var in ['age','TSH','T3','TT4','T4U','FTI']:
    sns.boxplot(x='response',y=var,data=df)
    plt.show()
sns.pairplot(data=df[df.columns[1:]],diag_kws={'edgecolor':'k','bins':25},plot_kws={'edgecolor':'k'})
plt.show()
创建虚拟变量用于分类变量
df_dummies = pd.get_dummies(data=df)
df_dummies.shape
df_dummies.sample(10)
测试/训练集划分
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(df_dummies.drop('response',axis=1), 
                                                    df_dummies['response'], test_size=0.30, 
                                                    random_state=42)
print("Training set shape",X_train.shape)
print("Test set shape",X_test.shape)
1.6 使用 Scikit-learn 中的 LogisticRegression估计器

Scikit-learn 提供了简洁高效的逻辑回归实现,默认使用 L2 正则化

from sklearn.linear_model import LogisticRegression
clf1 = LogisticRegression(penalty='l2',solver='newton-cg')
clf1.fit(X_train,y_train)

截距,系数,评分
clf1.intercept_
clf1.coef_
clf1.score(X_test,y_test)

对于 LogisticRegression 估计器,确实存在一个特殊的predict_proba 方法,它用于计算原始概率值
prob_threshold = 0.5
prob_df=pd.DataFrame(clf1.predict_proba(X_test[:10]),columns=['Prob of NO','Prob of YES'])
prob_df['Decision']=(prob_df['Prob of YES']>prob_threshold).apply(int)
prob_df
y_test[:10]
分类报告和混淆矩阵

评估模型性能常用的指标包括精确率、召回率、F1分数等:

  • 精确率(Precision)
    精确率是指所有被预测为正类别的样本中,实际上确实是正类别的比例。公式如下:

Precision=TP/(TP+FP)Precision= TP/(TP+FP)Precision=TP/(TP+FP)

高精确率意味着模型在预测正类别时具有较高的准确性,即少有误报(False Positives)

  • 召回率(Recall):
    召回率也被称为灵敏度或真正例率,是指所有实际为正类别的样本中,被正确识别出来的比例。公式如下:

Recall=TP/(TP+FN)Recall= TP/(TP+FN)Recall=TP/(TP+FN)

高召回率意味着模型能够捕捉到大多数的实际正类别样本,即少有漏报(False Negatives)。

  • F1分数(F1 Score)
    F1分数是精确率和召回率的调和平均值,提供了一个单一的指标来衡量分类器的准确性和完整性。当精确率和召回率都很重要时使用F1分数特别有用。其计算公式如下:

F1Score=2Precision×Recall/(Precision+Recall)F1 Score=2 Precision×Recall / (Precision+Recall)F1Score=2Precision×Recall/(Precision+Recall)

F1分数取值范围从0到1,数值越大表示模型性能越好。它是精确率和召回率之间的一个平衡点,尤其适用于不平衡数据集的情况。

  • 混淆矩阵
    混淆矩阵是一种特定格式的表格,用于描述分类模型的表现。对于二分类问题,它通常是一个2x2的矩阵,如下所示:

实际/预测 正例(Predicted Positive) 反例(Predicted Negative)

正例(Actual Positive) 真正例(True Positive, TP) 假反例(False Negative, FN)

反例(Actual Negative) 假正例(False Positive, FP) 真反例(True Negative, TN)

  • 真正例(TP):模型正确预测为正类别的样本数
  • 假反例(FN):模型错误地预测为负类别的正类别样本数
  • 假正例(FP):模型错误地预测为正类别的负类别样本数
  • 真反例(TN):模型正确预测为负类别的样本数

通过这些指标,我们可以更好地了解模型在不同方面的表现,从而做出相应的调整以优化模型性能。

from sklearn.metrics import classification_report, confusion_matrix
print(classification_report(y_test, clf1.predict(X_test)))
pd.DataFrame(confusion_matrix(y_test, clf1.predict(X_test)),columns=['Predict-YES','Predict-NO'],index=['YES','NO'])
1.7 使用statsmodels

Statsmodels 提供了更贴近统计学视角的建模方式,支持公式输入。

import statsmodels.formula.api as smf
import statsmodels.api as sm
df_dummies.columns
创建一个类似于 R 语言风格的 公式
formula = 'response ~ ' + '+'.join(df_dummies.columns[1:])
formula
拟合一个广义线性模型并选择 Binomial 作为函数族
model = smf.glm(formula = formula, data=df_dummies, family=sm.families.Binomial())
result=model.fit()
summary 方法展示一个 R 风格的表格,包含各种统计信息
print(result.summary())
predict方法为测试数据集计算概率
result.predict(X_test[:10])
为了创建二元预测,你需要应用一个阈值概率,并将布尔值转换为整数
y_pred=(result.predict(X_test)>prob_threshold).apply(int)
print(classification_report(y_test,y_pred))
pd.DataFrame(confusion_matrix(y_test, y_pred),columns=['Predict-YES','Predict-NO'],index=['YES','NO'])
1.8 构建较小模型:移除不显著变量

我们发现逻辑回归模型中大多数变量的 p 值非常高,因此它们在统计上并不显著。我们创建了另一个较小的模型,移除了这些变量。

formula = 'response ~ ' + '+'.join(df_dummies.columns[1:7])
formula
model = smf.glm(formula = formula, data=df_dummies, family=sm.families.Binomial())
result=model.fit()
print(result.summary())
y_pred=(result.predict(X_test)>prob_threshold).apply(int)
print(classification_report(y_pred,y_test))
pd.DataFrame(confusion_matrix(y_test, y_pred),columns=['Predict-YES','Predict-NO'],index=['YES','NO'])
1.9 Scikit-learnStatsmodels 预测的概率之间如何比较?

两种方法在实现细节上略有不同,但都可用于预测概率。我们可以通过绘制散点图来直观比较两者的预测结果:

  • 正值系数:表明该特征越大,目标类别(y=1)的概率越高
  • 负值系数:特征越大,目标类别概率越低
  • 绝对值大小:反映特征对预测结果的影响程度
  • p值:判断变量是否具有统计显著性
sklearn_prob = clf1.predict_proba(X_test)[...,1][:10]
statsmodels_prob =  result.predict(X_test[:10])
prob_comp_df=pd.DataFrame(data={'Scikit-learn Prob':list(sklearn_prob),'Statsmodels Prob':list(statsmodels_prob)})
prob_comp_df
系数解释

ageFTI的系数值应如何解读?

  • 对于每增加一岁,甲状腺功能减退症的对数几率增加 0.0248,或者说,甲状腺功能减退症的几率增加了一个 exp(0.0248) = 1.025 的因子,即大约增加了 2.5%。
  • 对于每增加一个单位的 FTI(游离甲状腺素指数),甲状腺功能减退症的对数几率减少 0.1307,或者说,甲状腺功能减退症的几率减少了一个 exp(-0.1307) ≈ 0.876 的因子,即大约减少了 12.4%。

您可能感兴趣的与本文相关的镜像

Yolo-v5

Yolo-v5

Yolo

YOLO(You Only Look Once)是一种流行的物体检测和图像分割模型,由华盛顿大学的Joseph Redmon 和Ali Farhadi 开发。 YOLO 于2015 年推出,因其高速和高精度而广受欢迎

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值