# 2 pelatihan model SVM, KNN dan ensemble import joblib import os from sklearn.svm import SVC from sklearn.neighbors import KNeighborsClassifier from sklearn.ensemble import VotingClassifier from sklearn.model_selection import GridSearchCV, cross_val_score print("šŸ‹ļø [TAHAP 2] Training: DATA ASLI (Mode TURBO Aktif šŸš€)...") # --- PENYESUAIAN FOLDER --- BASE_DIR = os.path.dirname(os.path.abspath(__file__)) FOLDER_OUTPUT = os.path.join(BASE_DIR, 'output') FOLDER_MODELS = os.path.join(BASE_DIR, 'models') # 0. CEK KEAMANAN: Pastikan folder dan file Tahap 1 sudah ada file_xtrain = f'{FOLDER_OUTPUT}/X_train.pkl' if not os.path.exists(file_xtrain): raise FileNotFoundError(f"āŒ File '{file_xtrain}' tidak ditemukan! Pastikan kamu sudah menjalankan '1_preprocessing.py' terlebih dahulu.") # Jaga-jaga kalau folder models belum ada, otomatis dibikin os.makedirs(FOLDER_MODELS, exist_ok=True) # 1. AMBIL DATA DARI TAHAP 1 print(" - Memuat data latih...") X_train = joblib.load(f'{FOLDER_OUTPUT}/X_train.pkl') y_train = joblib.load(f'{FOLDER_OUTPUT}/y_train.pkl') print(f" - Jumlah Data Latih Asli: {len(y_train)} baris") print(f" - Komposisi Label: {y_train.value_counts().to_dict()}") # --------------------------------------------------------- # 2. LATIH SVM (MODEL UTAMA) # --------------------------------------------------------- print("\nšŸš€ Melatih SVM (Mencari Settingan Terbaik)...") print(" (Menggunakan seluruh inti CPU laptop...)") param_svm = { 'C': [0.01, 0.1, 1, 10, 100], 'kernel': ['linear'], } svm_grid = GridSearchCV(SVC(probability=True, random_state=42), param_svm, cv=5, scoring='f1_macro', verbose=1, n_jobs=-1) svm_grid.fit(X_train, y_train) best_svm = svm_grid.best_estimator_ joblib.dump(best_svm, f'{FOLDER_MODELS}/model_svm.pkl') # ⭐ TAMBAHAN: Print akurasi validasi & parameter terbaik SVM svm_acc_val = svm_grid.best_score_ * 100 print(f" āœ… SVM Selesai (Akurasi Validasi: {svm_acc_val:.2f}%)") print(f" šŸ“Œ Parameter Terbaik SVM: {svm_grid.best_params_}") # --------------------------------------------------------- # 3. LATIH KNN (METRIC COSINE) # --------------------------------------------------------- print("\nšŸš€ Melatih KNN (Wajib Cosine)...") param_knn = { 'n_neighbors': [3, 5, 7, 9, 11, 13, 15], 'metric': ['cosine'], 'weights': ['uniform', 'distance'] } knn_grid = GridSearchCV(KNeighborsClassifier(algorithm='brute'), param_knn, cv=5, scoring='f1_macro', verbose=1, n_jobs=-1) knn_grid.fit(X_train, y_train) best_knn = knn_grid.best_estimator_ joblib.dump(best_knn, f'{FOLDER_MODELS}/model_knn.pkl') # ⭐ TAMBAHAN: Print akurasi validasi & parameter terbaik KNN knn_acc_val = knn_grid.best_score_ * 100 print(f" āœ… KNN Selesai (Best K: {knn_grid.best_params_['n_neighbors']})") print(f" šŸ“Œ Parameter Terbaik KNN: {knn_grid.best_params_}") print(f" šŸ“Œ Akurasi Validasi KNN: {knn_acc_val:.2f}%") # --------------------------------------------------------- # 4. LATIH ENSEMBLE (SVM + KNN) # --------------------------------------------------------- print("\nšŸš€ Melatih ENSEMBLE (Voting SVM + KNN)...") # Gabungkan dua model terbaik ensemble_model = VotingClassifier( estimators=[ ('svm', best_svm), ('knn', best_knn) ], voting='soft', weights=[2, 1] # SVM kita beri bobot suara lebih tinggi ) ensemble_model.fit(X_train, y_train) joblib.dump(ensemble_model, f'{FOLDER_MODELS}/model_ensemble.pkl') print(" āœ… Ensemble Selesai.") # ⭐ TAMBAHAN: Hitung akurasi validasi Ensemble pakai cross_val_score print(" šŸ“Œ Menghitung Akurasi Validasi Ensemble (5-fold CV)...") print(" (Sabar ya, ini agak lama karena ensemble = SVM + KNN x 5 fold)") ensemble_scores = cross_val_score(ensemble_model, X_train, y_train, cv=5, scoring='f1_macro', n_jobs=-1) ensemble_acc_val = ensemble_scores.mean() * 100 print(f" šŸ“Œ Akurasi Validasi Ensemble: {ensemble_acc_val:.2f}%") # --------------------------------------------------------- # 5. RINGKASAN AKHIR # --------------------------------------------------------- print("\n" + "="*60) print("šŸ“Š RINGKASAN HASIL TRAINING") print("="*60) print(f"\nšŸ”¹ SVM") print(f" Parameter : {svm_grid.best_params_}") print(f" Akurasi Validasi : {svm_acc_val:.2f}%") print(f"\nšŸ”¹ KNN") print(f" Parameter : {knn_grid.best_params_}") print(f" Akurasi Validasi : {knn_acc_val:.2f}%") print(f"\nšŸ”¹ Ensemble (SVM + KNN)") print(f" Voting : soft, weights=[2, 1]") print(f" Akurasi Validasi : {ensemble_acc_val:.2f}%") print("\n" + "="*60) print("šŸŽ‰ TRAINING DATA MURNI SELESAI!") print("šŸ‘‰ Silakan jalankan '3_evaluasi.py' untuk melihat hasil akhirnya.") print("="*60)