用随机森林预测糖尿病:从数据到模型
用随机森林预测糖尿病:从数据到模型
引言
随着医疗数据的不断积累,人工智能技术在疾病预测和健康管理中的应用越来越广泛。今天我们将使用云服务器来探索一种强大的机器学习算法——随机森林,通过它来构建一个简单的糖尿病预测模型。
一、搭建项目
1. 创建实例
首先进入平台首页进行创建实例。我已经创建好了,怎么创建看我往期博客
点击之后来到这个页面
二、数据集简介
我们使用的是 Pima Indians Diabetes 数据集,它包含了 768 名女性患者的相关生理指标,如:
怀孕次数(Pregnancies)
血糖水平(Glucose)
血压(BloodPressure)
BMI(体质指数)
年龄(Age)
目标是预测患者是否患有糖尿病(0 表示未患病,1 表示患病)。
三.项目实现
1. 数据加载与预处理
首先加载数据,并将其分为训练集和测试集。以下是数据的基本处理流程:
import pandas as pd
from sklearn.model_selection import train_test_split
# 加载数据
data = pd.read_csv("https://raw.githubusercontent.com/jbrownlee/Datasets/master/pima-indians-diabetes.data.csv", header=None)
columns = ["Pregnancies", "Glucose", "BloodPressure", "SkinThickness", "Insulin", "BMI", "DiabetesPedigreeFunction", "Age", "Outcome"]
data.columns = columns
# 特征与目标分离
X = data.drop("Outcome", axis=1)
y = data["Outcome"]
# 数据划分
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
2. 构建随机森林模型
随机森林模型由多棵决策树组成,通过投票机制选择最终分类结果。以下是模型训练和预测的核心代码:
from sklearn.ensemble import RandomForestClassifier
# 初始化模型
rf_model = RandomForestClassifier(n_estimators=100, max_depth=5, random_state=42)
# 模型训练
rf_model.fit(X_train, y_train)
# 模型预测
y_pred = rf_model.predict(X_test)
y_pred_proba = rf_model.predict_proba(X_test)[:, 1]
3. 模型评估
模型的性能是衡量其实际应用价值的关键。我们可以使用准确率(Accuracy)、精确率(Precision)、召回率(Recall)和 ROC-AUC 指标来评估模型表现:
from sklearn.metrics import accuracy_score, precision_score, recall_score, roc_auc_score, classification_report
# 计算评估指标
accuracy = accuracy_score(y_test, y_pred)
precision = precision_score(y_test, y_pred)
recall = recall_score(y_test, y_pred)
roc_auc = roc_auc_score(y_test, y_pred_proba)
print(f"Accuracy: {accuracy:.2f}")
print(f"Precision: {precision:.2f}")
print(f"Recall: {recall:.2f}")
print(f"ROC-AUC: {roc_auc:.2f}")
4. 特征重要性分析
随机森林的一个重要特性是可以提供特征重要性分数,帮助我们理解哪些特征对预测影响最大。例如,以下代码展示了每个特征的重要性,并绘制柱状图:
import matplotlib.pyplot as plt
# 提取特征重要性
importances = rf_model.feature_importances_
feature_names = X.columns
# 可视化特征重要性
plt.figure(figsize=(10, 6))
plt.barh(feature_names, importances, color="skyblue")
plt.xlabel("Feature Importance")
plt.ylabel("Features")
plt.title("Random Forest Feature Importance")
plt.show()
5 完整的代码
import numpy as np
import pandas as pd
from sklearn.datasets import load_diabetes
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, precision_score, recall_score, roc_auc_score, classification_report
import matplotlib.pyplot as plt
# ==========================
# 1. 数据加载与预处理
# ==========================
# 使用Pima Indians Diabetes数据集
data = pd.read_csv("https://raw.githubusercontent.com/jbrownlee/Datasets/master/pima-indians-diabetes.data.csv", header=None)
columns = ["Pregnancies", "Glucose", "BloodPressure", "SkinThickness", "Insulin", "BMI", "DiabetesPedigreeFunction", "Age", "Outcome"]
data.columns = columns
# 特征与标签
X = data.drop("Outcome", axis=1) # 特征
y = data["Outcome"] # 标签
# 数据划分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# ==========================
# 2. 构建随机森林模型
# ==========================
# 初始化随机森林
rf_model = RandomForestClassifier(n_estimators=100, max_depth=5, random_state=42)
# 模型训练
rf_model.fit(X_train, y_train)
# 模型预测
y_pred = rf_model.predict(X_test)
y_pred_proba = rf_model.predict_proba(X_test)[:, 1]
# ==========================
# 3. 模型评估
# ==========================
# 评估指标
accuracy = accuracy_score(y_test, y_pred)
precision = precision_score(y_test, y_pred)
recall = recall_score(y_test, y_pred)
roc_auc = roc_auc_score(y_test, y_pred_proba)
print("Model Performance:")
print(f"Accuracy: {accuracy:.2f}")
print(f"Precision: {precision:.2f}")
print(f"Recall: {recall:.2f}")
print(f"ROC-AUC: {roc_auc:.2f}")
print("\nClassification Report:")
print(classification_report(y_test, y_pred))
# ==========================
# 4. 特征重要性分析
# ==========================
# 提取特征重要性
importances = rf_model.feature_importances_
feature_names = X.columns
# 可视化特征重要性
plt.figure(figsize=(10, 6))
plt.barh(feature_names, importances, color="skyblue")
plt.xlabel("Feature Importance")
plt.ylabel("Features")
plt.title("Random Forest Feature Importance")
plt.show()
# ==========================
# 5. 测试单个样本预测
# ==========================
# 随机选择测试集中的一个样本
sample = X_test.iloc[0:1]
actual = y_test.iloc[0]
prediction = rf_model.predict(sample)
prediction_proba = rf_model.predict_proba(sample)[:, 1]
print(f"\nActual Outcome: {actual}")
print(f"Predicted Outcome: {prediction[0]}")
print(f"Prediction Probability: {prediction_proba[0]:.2f}")
6 最后结果
总结
通过随机森林模型,我们成功实现了糖尿病的预测,整体准确率达到 79%,精确率为 72%,召回率为 65%,ROC-AUC 分数为 84%,表现出良好的分类能力。特征重要性分析表明,血糖(Glucose) 是对糖尿病预测影响最大的因素,其次是 BMI 和 年龄(Age),与医学常识一致。随机森林的高准确性和解释性使其成为处理此类健康数据的理想工具,同时通过特征重要性分析可以为医学决策提供有价值的参考。
- 点赞
- 收藏
- 关注作者
评论(0)