VPA_predict / CNN_model.py
wjc23's picture
Upload 4 files
edff4f8 verified
# -*- coding: utf-8 -*-
"""
Created on Mon Apr 1 22:06:46 2024
@author: admin
"""
import tensorflow as tf
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from storage import result_output,preprocess_data,process_train_data,turn_back,result_output,draw_acc,cal_accuracy
filepath='data/VPA10.8.xlsx'
df=pd.read_excel(filepath)
df.columns = df.columns.str.replace('[{}:]', '')
# 示例:确保有效标识符
df.columns = df.columns.str.replace(' ', '_') # 将空格替换为下划线
df.columns = df.columns.str.replace('^[0-9]', 'X') # 如果以数字开头,则在前面添加字符 'X'
# 示例:删除特殊字符
df.columns = df.columns.str.replace('[^a-zA-Z0-9_]', '')
result = df.groupby('ID')['DV'].count().reset_index(name='Count')
# 过滤出Count大于1的记录的ID
filtered_ids = result[result['Count'] >= 1]['ID']
# 保留ID在filtered_ids中的记录,并将AMT值设为上一行的AMT值
filtered_df = df[df['ID'].isin(filtered_ids)]
filtered_df['AMT'] = filtered_df['AMT'].fillna(filtered_df.groupby('ID')['AMT'].shift())
filtered_df = filtered_df.dropna(subset=['DV'])
samples_train = []
samples_val = []
samples_tr = []
# 获取 'AMT' 特征的最小值和最大值
min_amt = filtered_df['AMT'].min()
max_amt = filtered_df['AMT'].max()
min_dv = filtered_df['DV'].min()
max_dv = filtered_df['DV'].max()
filtered_df['BSA_square'] = filtered_df['BSA'] ** 2
filtered_df['BSA_cubic'] = filtered_df['BSA'] ** 3
filtered_df['AMT'] = np.log(filtered_df['AMT'])
for id_value, group in filtered_df.groupby('ID'):
count = group['DV'].count()
if count >= 1:
# for i in range(count - 1):
i=count - 2
input_features = group.iloc[i + 1][['AMT', 't','BSA','BW','age','height']].tolist()
output_feature = group.iloc[i+1]['DV']
if group.iloc[i + 1]['ID']>290:
samples_val.append((input_features, output_feature))
else:
samples_train.append((input_features, output_feature))
# 提取输入特征和输出特征
X = [input_features for input_features, _ in samples_train]
y = [output_feature for _, output_feature in samples_train]
val_x = [input_features for input_features, _ in samples_val]
val_y = [output_feature for _, output_feature in samples_val]
train_x, test_x, train_y, test_y = train_test_split(X, y, test_size=0.1)
save_path = 'model/model_CNN'
# save_path = 'C:/Users/admin/Desktop/药物建模/VPA手稿/model/model_CNN'
loaded_model = tf.saved_model.load(save_path)
model_pre = loaded_model.signatures['serving_default']
train_x = np.array(train_x).reshape(-1, 6, 1)
test_x = np.array(test_x).reshape(-1, 6, 1)
val_x = np.array(val_x).reshape(-1, 6, 1)
train_predictions = model_pre(tf.constant(train_x, dtype=tf.float32))
train_predictions = train_predictions['dense_5'].numpy()
test_predictions = model_pre(tf.constant(test_x, dtype=tf.float32))
val_predictions = model_pre(tf.constant(val_x, dtype=tf.float32))
val_predictions = val_predictions['dense_5'].numpy()
train_y = np.reshape(train_y,(-1,1))
test_y = np.reshape(test_y,(-1,1))
val_y = np.reshape(val_y,(-1,1))
cal_accuracy(train_predictions,train_y)
cal_accuracy(val_predictions,val_y)
import gradio as gr
import tensorflow as tf
import numpy as np
# 加载 TensorFlow 模型
model_path = 'model/model_CNN'
loaded_model = tf.saved_model.load(model_path)
model_predict = loaded_model.signatures['serving_default']
def predict(AMT, t, BSA, BW, age, height):
# 格式化输入数据以匹配模型的输入格式
input_features = np.array([[np.log(AMT), t, BSA, BW, age, height]], dtype=float).reshape(1, 6, 1)
predictions = model_predict(tf.constant(input_features, dtype=tf.float32))['dense_5'].numpy()
return predictions.flatten()[0]
# 创建 Gradio 界面
iface = gr.Interface(
fn=predict,
inputs=[gr.Number(label='AMT', default=1.0),
gr.Number(label='t', default=1.0),
gr.Number(label='BSA', default=1.0),
gr.Number(label='BW', default=1.0),
gr.Number(label='age', default=30),
gr.Number(label='height', default=160)],
outputs='text',
title="Drug Response Prediction",
description="Enter the values for AMT, t, BSA, BW, age, and height to predict the drug response."
)
iface.launch()