import streamlit as st import pandas as pd from sklearn.model_selection import train_test_split from sklearn.svm import SVC from sklearn.ensemble import StackingClassifier, VotingClassifier from sklearn.linear_model import LogisticRegression from sklearn.tree import DecisionTreeClassifier from sklearn.ensemble import RandomForestClassifier from sklearn.metrics import accuracy_score # 定義每個分類方法的模型 def get_classifier(classifier_name): if classifier_name == 'SVM': clf = SVC(kernel='linear', probability=True) elif classifier_name == '堆疊法': estimators = [ ('lr', LogisticRegression()), ('rf', RandomForestClassifier()), ('dt', DecisionTreeClassifier()) ] clf = StackingClassifier(estimators=estimators, final_estimator=SVC()) elif classifier_name == '軟投票': clf1 = LogisticRegression() clf2 = RandomForestClassifier() clf3 = SVC(probability=True) clf = VotingClassifier(estimators=[('lr', clf1), ('rf', clf2), ('svc', clf3)], voting='soft') else: # 硬投票 clf1 = LogisticRegression() clf2 = RandomForestClassifier() clf3 = SVC() clf = VotingClassifier(estimators=[('lr', clf1), ('rf', clf2), ('svc', clf3)], voting='hard') return clf # 加載數據集 def load_data(file): data = pd.read_csv(file) X = data.iloc[:, :-1].values # 特徵變量 y = data.iloc[:, -1].values # 目標變量 return X, y # 設定 Streamlit 標題 st.title("分類模型選擇器") # 上傳 CSV 文件 uploaded_file = st.file_uploader("上傳 CSV 文件作為數據集", type="csv") if uploaded_file is not None: # 加載數據集 X, y = load_data(uploaded_file) # 分割數據集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42) # 選擇分類器 classifier_name = st.selectbox( '選擇分類器', ('SVM', '堆疊法', '軟投票', '硬投票') ) # 獲取並訓練模型 clf = get_classifier(classifier_name) clf.fit(X_train, y_train) # 預測結果 y_pred = clf.predict(X_test) # 計算準確率 acc = accuracy_score(y_test, y_pred) # 顯示結果 st.write(f'分類器 = {classifier_name}') st.write(f'準確率 = {acc:.2f}')