基于Django实现机器学习医学指标概率预测网站
一、引言
在当今数字化医疗的大背景下,利用机器学习模型结合Web应用进行医学指标的概率预测具有重要的实际意义。本文将详细介绍一个基于Django框架构建的医学指标概率预测系统,通过结合随机森林模型,实现根据用户输入的多项医学指标预测特定事件发生的概率。
二、项目结构概述
项目主要由以下几个核心部分组成:
- 模板文件(templates):负责页面的展示和用户交互。
- 视图文件(views.py):处理用户请求和业务逻辑。
- URL配置文件(urls.py):定义URL路由规则。
- 模型文件(models.py):定义数据库模型(本项目暂未涉及数据库操作)。
- 应用配置文件(apps.py):配置应用信息。
- 项目设置文件(settings.py):配置项目的全局设置。
三、详细代码分析
1. 模板文件 project/templates/app/index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>概率预测</title>
<style>
body {
font-family: Arial, sans-serif;
background-color: #f4f4f9;
margin: 0;
padding: 20px;
}
h1 {
color: #333;
text-align: center;
margin-bottom: 20px;
}
form {
background-color: #fff;
padding: 20px;
border-radius: 8px;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
max-width: 800px;
margin: 0 auto;
display: flex;
flex-wrap: wrap;
justify-content: space-between;
}
.form-group {
width: 48%;
margin-bottom: 10px;
}
label {
display: block;
margin-bottom: 5px;
}
input[type="text"] {
width: 100%;
padding: 8px;
border: 1px solid #ccc;
border-radius: 4px;
}
button {
background-color: #007BFF;
color: white;
padding: 10px 20px;
border: none;
border-radius: 4px;
cursor: pointer;
width: 100%;
margin-top: 20px;
}
button:hover {
background-color: #0056b3;
}
p {
color: red;
margin-bottom: 10px;
width: 100%;
}
</style>
</head>
<body>
<h1>概率预测</h1>
{% if error %}
<p>{{ error }}</p>
{% endif %}
{% if probability %}
<p>发生概率: {{ probability }}</p>
{% endif %}
<form method="post">
{% csrf_token %}
<!-- 第一排 -->
<div class="form-group">
<label for="wbc">白细胞计数 (wbc):</label>
<input type="text" id="wbc" name="wbc" required>
</div>
<div class="form-group">
<label for="d_dimer">D - 二聚体 (d_dimer):</label>
<input type="text" id="d_dimer" name="d_dimer" required>
</div>
<!-- 其他输入字段省略 -->
<button type="submit">计算概率</button>
</form>
</body>
</html>
代码解释:
- HTML结构:定义了一个简单的HTML页面,包含标题、表单和错误信息显示区域。
- 样式设置:使用内联CSS样式对页面进行美化,包括背景颜色、字体、表单样式等。
- 表单部分:通过
<form>
标签创建一个POST请求的表单,包含多个输入字段,每个字段对应一个医学指标。使用{% csrf_token %}
防止跨站请求伪造。 - 条件判断:使用Django模板语法
{% if %}
判断是否有错误信息或预测概率,并进行相应的显示。
2. 视图文件 project/app/views.py
import joblib
from django.shortcuts import render
from django.views import View
import os
# 加载本地 RF 模型
model_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), '../random_forest_model.pkl')
model = joblib.load(model_path)
class PredictionView(View):
def get(self, request):
return render(request, 'app/index.html')
def post(self, request):
# 定义所有需要的输入字段
fields = [
'wbc', 'd_dimer', 'crp', 'hbdh', 'ast', 'ck_mb', 'plt', 'hba1c',
'creatinine', 'bilirubin', 'alt', 'tco2', 'bua', 'ldh',
'nihss', 'hypertension', 'age', 'gender', 'coronary_disease'
]
data = []
for field in fields:
try:
value = float(request.POST.get(field))
data.append(value)
except (ValueError, TypeError):
return render(request, 'app/index.html', {'error': f'请为 {field} 输入有效的数字'})
# 进行预测
try:
probability = model.predict_proba([data])[:, 1][0]
return render(request, 'app/index.html', {'probability': probability})
except Exception as e:
return render(request, 'app/index.html', {'error': f'预测出错: {str(e)}'})
代码解释:
- 模型加载:使用
joblib
库加载本地的随机森林模型random_forest_model.pkl
。 - 视图类
PredictionView
:继承自View
类,包含get
和post
方法。get
方法:处理GET请求,返回app/index.html
模板页面。post
方法:处理POST请求,首先获取表单中的所有输入字段,将其转换为浮点数并存储在data
列表中。如果输入不是有效的数字,返回错误信息。然后使用加载的模型进行概率预测,如果预测过程中出现异常,也返回错误信息。最后将预测结果或错误信息传递给模板页面进行显示。
3. URL配置文件
project/app/urls.py
from django.urls import path
from .views import PredictionView
urlpatterns = [
path('', PredictionView.as_view(), name='prediction'),
]
project/project/urls.py
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('app.urls')),
]
代码解释:
app/urls.py
:定义了应用级别的URL路由,将根路径''
映射到PredictionView
视图类。project/urls.py
:定义了项目级别的URL路由,将admin/
路径映射到Django的管理界面,将根路径''
包含app/urls.py
中的路由规则。
4. 应用配置文件 project/app/apps.py
from django.apps import AppConfig
class AppConfig(AppConfig):
default_auto_field = "django.db.models.BigAutoField"
name = "app"
代码解释:
定义了应用的配置信息,设置默认的自动字段类型为BigAutoField
,应用名称为app
。
5. 项目设置文件 project/project/settings.py
# 部分代码省略
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'app',
]
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
DATABASES = {
"default": {
"ENGINE": "django.db.backends.sqlite3",
"NAME": BASE_DIR / "db.sqlite3",
}
}
# 部分代码省略
代码解释:
INSTALLED_APPS
:列出了项目中安装的应用,包括Django自带的应用和自定义的app
应用。TEMPLATES
:配置模板引擎,指定模板文件的查找路径为project/templates
目录。DATABASES
:配置数据库,使用SQLite作为默认数据库。
四、总结
通过以上代码的详细分析,我们实现了一个基于Django框架的医学指标概率预测系统。用户可以在网页上输入多项医学指标,系统将使用随机森林模型进行概率预测,并将结果显示在页面上。该系统不仅展示了Django框架的强大功能,还体现了机器学习模型在实际应用中的价值。
希望本文能帮助你更好地理解和实现类似的Web应用项目。如果你有任何问题或建议,欢迎在评论区留言讨论。