Spaces:
Sleeping
Sleeping
| import streamlit as st | |
| import pandas as pd | |
| import warnings | |
| # Filter out warnings | |
| warnings.filterwarnings("ignore") | |
| from sklearn.pipeline import Pipeline | |
| from sklearn.svm import SVC | |
| from sklearn.model_selection import train_test_split | |
| from sklearn.impute import SimpleImputer | |
| from sklearn.preprocessing import StandardScaler, OneHotEncoder | |
| from sklearn.compose import ColumnTransformer | |
| # --- Define your preprocessing pipeline --- | |
| def create_preprocessing_pipeline(): | |
| # Define numerical and categorical feature names based on your dataset | |
| numerical_features = ['Age', 'Tumor_Size'] | |
| categorical_features = ['Gender', 'Tumor_Grade', 'Symptoms_Severity', | |
| 'Family_History', 'Smoking_History', | |
| 'Alcohol_Consumption', 'Exercise_Frequency'] | |
| # Pipeline for numerical features: impute missing values and scale | |
| numerical_pipeline = Pipeline(steps=[ | |
| ('imputer', SimpleImputer(strategy='mean')), | |
| ('scaler', StandardScaler()) | |
| ]) | |
| # Pipeline for categorical features: impute missing values and encode | |
| categorical_pipeline = Pipeline(steps=[ | |
| ('imputer', SimpleImputer(strategy='most_frequent')), | |
| ('encoder', OneHotEncoder(handle_unknown='ignore')) | |
| ]) | |
| preprocessor = ColumnTransformer( | |
| transformers=[ | |
| ('num', numerical_pipeline, numerical_features), | |
| ('cat', categorical_pipeline, categorical_features) | |
| ] | |
| ) | |
| return preprocessor | |
| # --- Load dataset using st.cache_data --- | |
| def load_data(): | |
| data = pd.read_csv('cancer_prediction_data (2).csv') | |
| return data | |
| data = load_data() | |
| st.title("Cancer Prediction App") | |
| #st.write("This app uses an SVM model to predict the presence of cancer based on patient data.") | |
| #if st.checkbox("Show Data Preview"): | |
| #st.write(data.head()) | |
| # Assume the target column is 'Cancer_Present' | |
| target_col = 'Cancer_Present' | |
| if target_col not in data.columns: | |
| st.error(f"Target column '{target_col}' not found in data!") | |
| st.stop() | |
| # Split features and target | |
| X = data.drop(columns=[target_col]) | |
| y = data[target_col] | |
| # Create preprocessing pipeline | |
| preprocess = create_preprocessing_pipeline() | |
| # Split into training and test sets | |
| X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) | |
| # --- Create and train the SVM model pipeline --- | |
| svm_pipeline = Pipeline([ | |
| ('preprocessing', preprocess), | |
| ('svm', SVC()) | |
| ]) | |
| svm_pipeline.fit(X_train, y_train) | |
| svm_accuracy = svm_pipeline.score(X_test, y_test) | |
| #st.write(f"**Model Training Complete!** SVM Accuracy on Test Data: {svm_accuracy * 100:.2f}%") | |
| # --- Sidebar for user input --- | |
| st.sidebar.header("Enter Patient Data") | |
| def user_input_features(): | |
| age = st.sidebar.number_input("Age", min_value=0, max_value=120, value=50) | |
| tumor_size = st.sidebar.number_input("Tumor Size", min_value=0.0, max_value=100.0, value=5.0) | |
| gender = st.sidebar.selectbox("Gender", options=["Male", "Female"]) | |
| tumor_grade = st.sidebar.selectbox("Tumor Grade", options=["Low", "Medium", "High"]) | |
| symptoms_severity = st.sidebar.selectbox("Symptoms Severity", options=["Mild", "Moderate", "Severe"]) | |
| family_history = st.sidebar.selectbox("Family History", options=["Yes", "No"]) | |
| smoking_history = st.sidebar.selectbox("Smoking History", options=["Current Smoker", "Non-Smoker"]) | |
| alcohol_consumption = st.sidebar.selectbox("Alcohol Consumption", options=["Low", "Moderate", "High"]) | |
| exercise_frequency = st.sidebar.selectbox("Exercise Frequency", options=["Never", "Rarely", "Occasionally", "Often"]) | |
| # Create a dictionary of features. Keys must match dataset columns. | |
| data_dict = { | |
| 'Age': age, | |
| 'Tumor_Size': tumor_size, | |
| 'Gender': gender, | |
| 'Tumor_Grade': tumor_grade, | |
| 'Symptoms_Severity': symptoms_severity, | |
| 'Family_History': family_history, | |
| 'Smoking_History': smoking_history, | |
| 'Alcohol_Consumption': alcohol_consumption, | |
| 'Exercise_Frequency': exercise_frequency | |
| } | |
| return pd.DataFrame(data_dict, index=[0]) | |
| st.sidebar.markdown("### Patient Data Input") | |
| input_df = user_input_features() | |
| st.subheader("User Input Data") | |
| st.write(input_df) | |
| # --- Make Prediction --- | |
| if st.button("Predict Cancer Presence"): | |
| prediction = svm_pipeline.predict(input_df) | |
| result = "Cancer Detected" if prediction[0] == 1 else "No Cancer Detected" | |
| st.write(f"### Prediction: {result}") | |