Spaces:
Running
Running
import gradio as gr | |
import joblib | |
import numpy as np | |
import pandas as pd | |
from propy import AAComposition | |
from sklearn.preprocessing import MinMaxScaler | |
from fastapi import FastAPI | |
from gradio.routes import mount_gradio_app | |
# Load trained SVM model and scaler | |
model = joblib.load("SVM.joblib") | |
scaler = joblib.load("norm.joblib") | |
# FastAPI instance | |
app = FastAPI() | |
# Selected features used in the model | |
selected_features = [ | |
"A", "R", "N", "D", "C", "E", "Q", "G", "H", "I", "L", "K", "M", "F", "P", "S", "T", "W", "Y", "V" | |
] # (Shortened for brevity) | |
def extract_features(sequence): | |
"""Extract only the required features and normalize them.""" | |
all_features = AAComposition.CalculateAADipeptideComposition(sequence) | |
feature_values = list(all_features.values()) | |
feature_array = np.array(feature_values).reshape(-1, 1)[:420] # Ensure correct shape | |
normalized_features = scaler.transform(feature_array.T).flatten() | |
selected_feature_dict = { | |
feature: normalized_features[i] | |
for i, feature in enumerate(selected_features) | |
if feature in all_features | |
} | |
selected_feature_df = pd.DataFrame([selected_feature_dict]) | |
return selected_feature_df.to_numpy() | |
def predict(sequence): | |
"""Predict AMP vs Non-AMP""" | |
features = extract_features(sequence) | |
prediction = model.predict(features.T)[0] | |
return {"prediction": "AMP" if prediction == 0 else "Non-AMP"} | |
# FastAPI endpoint | |
async def predict_api(request: dict): | |
sequence = request.get("sequence", "") | |
if not sequence or len(sequence) < 10 or len(sequence) > 100: | |
return {"error": "Sequence length must be between 10 and 100."} | |
return predict(sequence) | |
# Gradio Interface (optional if you want UI access) | |
iface = gr.Interface( | |
fn=predict, | |
inputs=gr.Textbox(label="Enter Protein Sequence"), | |
outputs=gr.Label(label="Prediction"), | |
title="AMP Classifier", | |
description="Enter an amino acid sequence to predict AMP or Non-AMP." | |
) | |
app = mount_gradio_app(app, iface, path="/gradio") | |
# Run the server with: `uvicorn filename:app --host 0.0.0.0 --port 7860` | |