MicrosoftDocs/ml-basics 项目中的分类算法实践指南

MicrosoftDocs/ml-basics 项目中的分类算法实践指南

分类算法基础概念

监督学习是机器学习中最常见的技术之一,其核心思想是通过已知特征(X)和标签(y)的数据集训练模型,使其能够预测新数据的标签。分类问题是监督学习的一个重要分支,其目标是预测离散的类别标签。

分类问题可以表示为:y = f([x₁, x₂, x₃, ...]),其中y是我们要预测的类别标签,x₁, x₂等是特征变量。最简单的分类形式是二元分类,标签只有两个可能的值(通常表示为0和1),例如"是/否"、"真/假"等判断。

糖尿病预测案例实践

数据探索与准备

我们使用一个糖尿病诊断数据集来演示二元分类。该数据集包含患者的多种医学指标:

import pandas as pd
diabetes = pd.read_csv('data/diabetes.csv')
diabetes.head()

数据集包含以下特征:

  • Pregnancies:怀孕次数
  • PlasmaGlucose:血浆葡萄糖浓度
  • DiastolicBloodPressure:舒张压
  • TricepsThickness:三头肌皮褶厚度
  • SerumInsulin:血清胰岛素
  • BMI:身体质量指数
  • DiabetesPedigree:糖尿病谱系功能
  • Age:年龄

标签列"Diabetic"表示是否患有糖尿病(0为阴性,1为阳性)。

特征与标签分离

将特征与标签分开是建模前的标准步骤:

features = ['Pregnancies','PlasmaGlucose','DiastolicBloodPressure',
           'TricepsThickness','SerumInsulin','BMI','DiabetesPedigree','Age']
label = 'Diabetic'
X, y = diabetes[features].values, diabetes[label].values

特征分布分析

通过箱线图比较不同类别下特征的分布差异:

from matplotlib import pyplot as plt
for col in features:
    diabetes.boxplot(column=col, by='Diabetic', figsize=(6,6))
    plt.title(col)
plt.show()

分析发现,怀孕次数(Pregnancies)和年龄(Age)在糖尿病患者和非患者间的分布差异明显,这些特征可能对预测糖尿病有较大帮助。

数据分割

为了评估模型性能,我们将数据分为训练集和测试集:

from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.30, random_state=0)

这里使用70%数据训练,30%数据测试,random_state参数确保每次分割结果一致。

逻辑回归模型构建与评估

模型训练

逻辑回归是二元分类的经典算法:

from sklearn.linear_model import LogisticRegression

reg = 0.01  # 正则化参数
model = LogisticRegression(C=1/reg, solver="liblinear").fit(X_train, y_train)

正则化参数C控制模型复杂度,防止过拟合。较大的C值意味着较弱的正则化。

模型预测与初步评估

使用测试集进行预测并计算准确率:

predictions = model.predict(X_test)
from sklearn.metrics import accuracy_score
print('Accuracy:', accuracy_score(y_test, predictions))

但准确率单独使用可能产生误导,特别是在类别不平衡时。

分类报告

更全面的评估指标:

from sklearn.metrics import classification_report
print(classification_report(y_test, predictions))

分类报告包含:

  • 精确率(Precision):预测为正类中实际为正类的比例
  • 召回率(Recall):实际正类中被正确预测的比例
  • F1分数:精确率和召回率的调和平均
  • 支持数(Support):每个类的样本数

混淆矩阵

直观展示预测结果:

from sklearn.metrics import confusion_matrix
cm = confusion_matrix(y_test, predictions)
print(cm)

混淆矩阵形式:

[[TN FP]
 [FN TP]]

ROC曲线与AUC

评估模型在不同阈值下的表现:

from sklearn.metrics import roc_curve, roc_auc_score

y_scores = model.predict_proba(X_test)
fpr, tpr, thresholds = roc_curve(y_test, y_scores[:,1])

plt.plot([0, 1], [0, 1], 'k--')
plt.plot(fpr, tpr)
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('ROC Curve')

auc = roc_auc_score(y_test,y_scores[:,1])
print('AUC:', auc)

ROC曲线越靠近左上角,模型性能越好。AUC(曲线下面积)越接近1,模型区分能力越强。

模型优化建议

  1. 特征工程:进一步分析特征重要性,可能进行特征选择或构造新特征
  2. 数据预处理:考虑对数值特征进行标准化或归一化
  3. 处理类别不平衡:如果正负样本比例悬殊,可采用过采样或欠采样技术
  4. 尝试其他算法:如随机森林、支持向量机等,比较性能
  5. 超参数调优:使用网格搜索或随机搜索优化模型参数

通过本案例,我们完整展示了二元分类问题的解决流程,从数据探索到模型评估,为实际应用提供了可复用的模板。

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

成旭涛Strange

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值