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,模型区分能力越强。
模型优化建议
- 特征工程:进一步分析特征重要性,可能进行特征选择或构造新特征
- 数据预处理:考虑对数值特征进行标准化或归一化
- 处理类别不平衡:如果正负样本比例悬殊,可采用过采样或欠采样技术
- 尝试其他算法:如随机森林、支持向量机等,比较性能
- 超参数调优:使用网格搜索或随机搜索优化模型参数
通过本案例,我们完整展示了二元分类问题的解决流程,从数据探索到模型评估,为实际应用提供了可复用的模板。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考