本集为专栏最后一集,本专栏的特点是短平快,聚焦重点,不长篇大论纠缠于理论,而是在介绍基础理论框架基础上,快速切入实战项目和代码,所有代码都经过实践检验,是读者入门和熟悉上手的上佳知识材料
在本集中,我们将通过 Kaggle 平台的经典糖尿病预测(Pima Indians Diabetes Dataset)数据集,系统回顾完整的机器学习流程。本文将涵盖以下内容:
本文将提供完整代码,并附有详细注释和图表,帮助你掌握从零开始构建一个端到端的机器学习项目的全过程。所有代码在基于python 3.9.5 版本上运行通过。
糖尿病是一种常见的慢性疾病,早期预测可以帮助医生采取预防措施。Pima Indians Diabetes 数据集是一个经典案例,用于预测患者是否患有糖尿病。该数据集包含多个医学指标(如血糖水平、BMI 等)以及目标变量(是否患有糖尿病)。
我们的目标是构建一个分类模型,根据患者的医学指标预测其是否患有糖尿病。具体任务包括:
首先,我们需要从 Kaggle 下载数据集并加载到 Python 环境中。
import pandas as pd
# 加载数据集
url = "https://raw.githubusercontent.com/jbrownlee/Datasets/master/pima-indians-diabetes.data.csv"
column_names = [
'Pregnancies', 'Glucose', 'BloodPressure', 'SkinThickness',
'Insulin', 'BMI', 'DiabetesPedigreeFunction', 'Age', 'Outcome'
]
data = pd.read_csv(url, names=column_names)
# 查看数据集前几行
print(data.head())
输出:
Pregnancies Glucose BloodPressure SkinThickness Insulin BMI \
0 6 148 72 35 0 33.6
1 1 85 66 29 0 26.6
2 8 183 64 0 0 23.3
3 1 89 66 23 94 28.1
4 0 137 40 35 168 43.1
DiabetesPedigreeFunction Age Outcome
0 0.627 50 1
1 0.351 31 0
2 0.672 32 1
3 0.167 21 0
4 2.288 33 1
# 查看数据集的统计信息
print(data.describe())
输出:
Pregnancies Glucose BloodPressure SkinThickness Insulin \
count 768.000000 768.000000 768.000000 768.000000 768.000000
mean 3.845052 120.894531 69.105469 20.536458 79.799479
std 3.369578 31.972618 19.355807 15.952218 115.244002
min 0.000000 0.000000 0.000000 0.000000 0.000000
25% 1.000000 99.000000 62.000000 0.000000 0.000000
50% 3.000000 117.000000 72.000000 23.000000 30.500000
75% 6.000000 140.250000 80.000000 32.000000 127.250000
max 17.000000 199.000000 122.000000 99.000000 846.000000
BMI DiabetesPedigreeFunction Age Outcome
count 768.000000 768.000000 768.000000 768.000000
mean 31.992578 0.471876 33.240885 0.348958
std 7.884160 0.331329 11.760232 0.476951
min 0.000000 0.078000 21.000000 0.000000
25% 27.300000 0.243750 24.000000 0.000000
50% 32.000000 0.372500 29.000000 0.000000
75% 36.600000 0.626250 41.000000 1.000000
max 67.100000 2.420000 81.000000 1.000000
检查数据集中是否存在缺失值或异常值。
# 检查缺失值
print(data.isnull().sum())
输出(该数据集比较完整,没有缺失值):
Pregnancies 0
Glucose 0
BloodPressure 0
SkinThickness 0
Insulin 0
BMI 0
DiabetesPedigreeFunction 0
Age 0
Outcome 0
dtype: int64
# 检查异常值(例如,Glucose、BMI 等不应为 0)
abnormal_columns = ['Glucose', 'BloodPressure', 'SkinThickness', 'Insulin', 'BMI']
for col in abnormal_columns:
print(f"{col} 中的异常值数量: {len(data[data[col] == 0])}")
输出:
Glucose 中的异常值数量: 5
BloodPressure 中的异常值数量: 35
SkinThickness 中的异常值数量: 227
Insulin 中的异常值数量: 374
BMI 中的异常值数量: 11
使用 Matplotlib 和 Seaborn 可视化数据分布。
import matplotlib.pyplot as plt
import seaborn as sns
# 目标变量分布
sns.countplot(x='Outcome', data=data)
plt.title("Outcome Distribution")
plt.show()
# 数值特征分布
data.hist(figsize=(12, 10))
plt.tight_layout()
plt.show()
图表说明:
Outcome
的分布显示正负样本比例不均衡。用中位数填充异常值(如 Glucose
、BMI
等为 0 的情况)。
for col in abnormal_columns:
median_value = data[col].median()
data[col] = data[col].replace(0, median_value)
对数值特征进行标准化处理。
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
scaled_features = scaler.fit_transform(data.drop('Outcome', axis=1))
X = pd.DataFrame(scaled_features, columns=data.columns[:-1])
y = data['Outcome']
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42, stratify=y)
我们尝试多种分类算法,包括逻辑回归、随机森林和支持向量机。
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score, classification_report
# 定义模型
models = {
"Logistic Regression 逻辑回顾模型": LogisticRegression(),
"Random Forest 随机森林模型": RandomForestClassifier(random_state=42),
"Support Vector Machine 支持向量机模型": SVC(probability=True)
}
# 训练与评估
for name, model in models.items():
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
print(f"Model: {name}")
print(f"Accuracy: {accuracy_score(y_test, y_pred):.4f}")
print(classification_report(y_test, y_pred))
输出:
Model: Logistic Regression 逻辑回顾模型
Accuracy: 0.7078
precision recall f1-score support
0 0.75 0.82 0.78 100
1 0.60 0.50 0.55 54
accuracy 0.71 154
macro avg 0.68 0.66 0.67 154
weighted avg 0.70 0.71 0.70 154
Model: Random Forest 随机森林模型
Accuracy: 0.7597
precision recall f1-score support
0 0.79 0.85 0.82 100
1 0.68 0.59 0.63 54
accuracy 0.76 154
macro avg 0.74 0.72 0.73 154
weighted avg 0.75 0.76 0.76 154
Model: Support Vector Machine 支持向量机模型
Accuracy: 0.7273
precision recall f1-score support
0 0.76 0.84 0.80 100
1 0.64 0.52 0.57 54
accuracy 0.73 154
macro avg 0.70 0.68 0.69 154
weighted avg 0.72 0.73 0.72 154
**可以发现三种模型的各项指标包括准确率差不多,随机森林模型稍微好一点点。
使用网格搜索优化随机森林模型。
from sklearn.model_selection import GridSearchCV
param_grid = {
'n_estimators': [50, 100, 200],
'max_depth': [None, 10, 20],
'min_samples_split': [2, 5, 10]
}
grid_search = GridSearchCV(RandomForestClassifier(random_state=42), param_grid, cv=5, scoring='accuracy')
grid_search.fit(X_train, y_train)
print("Best Parameters:", grid_search.best_params_)
print("Best Accuracy:", grid_search.best_score_)
输出:
Best Parameters: {'max_depth': 10, 'min_samples_split': 2, 'n_estimators': 100}
Best Accuracy: 0.7752632280421164
使用 joblib
保存训练好的模型。
import joblib
best_model = grid_search.best_estimator_
joblib.dump(best_model, "diabetes_model.pkl")
输出:
['diabetes_model.pkl']
loaded_model = joblib.load("diabetes_model.pkl")
new_data = [[6, 148, 72, 35, 0, 33.6, 0.627, 50]] # 示例输入
prediction = loaded_model.predict(new_data)
print("Prediction:", prediction)
输出:
Prediction: [1]
可见模型非常准确的预测出了结果。
定期重新训练模型,并使用 A/B 测试验证新模型的效果。
通过本项目,我们完成了一个端到端的机器学习流程,包括数据清洗、特征工程、模型训练与优化、部署与监控。以下是几点建议:
希望这篇文章对你有所帮助!如果你有任何问题或想法,欢迎在评论区留言讨论。
下个专栏预告 12集机器学习实战到此就结束了,下个专栏我们将聚焦于深度学习进阶,帮助读者从深度学习的基础知识逐步进阶到前沿技术,涵盖理论、实战和行业应用。每集聚焦一个核心知识点,并结合实际项目进行实践,确保内容既深入又实用。同时,我们将探讨与当下最流行的大模型(如 GPT、BERT、Diffusion Models 等)相关的技术和知识点。