Load data Titanic-Dataset.csv menggunakan pandas. Selanjutnya, kita akan memisahkan variabel target, yaitu Survived dan mengelompokkan data berdasarkan data numerik dan kategorikal.
Langkah 3 - Ekstraksi Fitur
Pada tahap ini, kita akan melakukan ekstraksi fitur berdasarkan jenis data untuk setiap variabel. Selain itu, kita akan mencoba menggunakan Pipeline dari scikit-learn untuk proses ekstraksi fiturnya. Pipeline merupakan model proses yang dapat kita gunakan berkali kali sehingga memudahkan proses pembuatan model. Stategi ekstraksi fitur yang digunakan adalah imputasi dan penyekalaan. Proses ini juga sebenernya dapat dilakukan pada saat EDA dan proprocessing. Ingat, fitur pada data tabular sebenarnya adalah kolom-kolom dari data tabular.
Langkah 3.1 - Feature Construction
Selain menggunakan variabel-variabel yang sudah ada, sebetulnya kita dapat membuat fitur baru dalam data tabular berdasarkan proses agregasi atau penggabungan dari variabel-variabel yang lain. Langkah ini disebut sebagai feature construction.
Kita akan membuat fitur bernama FamiliSize yang merupakan jumlah keluarga yang dapat dihitung berdasarkan SibSp + Parch + 1. SipSp merupakan data terkait dengan jumlah siblings dan spouse. Sedangkan Parch adalah data terkait dengan jumlah orang tua atau anak.
Langkah 4 - Seleksi Fitur
Kita akan melakukan proses seleksi fitur sederhana dengan menggunakan fungsi SelectKBest. Fungsi ini menggunakan metode univariate statistics dalam proses pemilihan fiturnya. Jumlah fitur yang digunakan sesuai dengan jumlah k yang digunakan.
Dalam konteks data Titanic, kita akan menggunakan analisis ANOVA.
Selanjutnya, buat pipeline final untuk keseleuruhan proses.
Langkah 5 - Uji dengan Model
Pada langkah ini kita akan melakukan uji langsung dengan melakukan proses pelatihan menggunakan model Logistic Regression untuk mengetahui hasil dari proses ekstraksi dan seleksi fitur terhadap nilai akurasi.
Anda akan mendapatkan hasil seperti berikut,
NB: Anda mungkin mendapatkan hasil yang berbeda.
Berdasarkan informasi tersebut, kita mengetahui tingkat akurasi yang didapatkan sekitar 0.78 atau 78%. Hasilnya cukup baik namun tidak terlalu baik untuk mengetahui penumpang yang meninggal atau tidak. Hal ini erat kaitannya dengan fitur yang digunakan.
Lalu fitur apa yang sebenarnya digunakan? Kita perlu melakukan inspeksi!
Hasilnya,
Kita dapat mengetahui bahwa akurasi 78% didapatkan dari fitur,
Sex_female
Sex_make
P_class_3
P_class_1
Fare
Selanjutnya, Anda dapat melakukan percobaan dengan menggunakan konfigurasi k yang berbeda atau metode yang berbeda untuk mendapatkan fitur dengan hasil terbaik.
# Load Data
df = pd.read_csv("Titanic-Dataset.csv")
# Pisahkan Survived
y = df["Survived"].astype(int)
X = df.drop(columns=["Survived"])
# Buat list variabel numerik dan kategorikal
# Akan digunakan untuk proses seleksi fitur
# Name tidak akan digunakan karena tidak relevan
num_cols = ["Age", "SibSp", "Parch", "Fare"]
cat_cols = ["Pclass", "Sex", "Embarked"]
# Ekstaksi Fitur dengan Pipeline
# Data Numerik
num_tf = Pipeline([
("imputer", SimpleImputer(strategy="median")),
("scaler", StandardScaler())
])
# Data Kategorikal
cat_tf = Pipeline([
("imputer", SimpleImputer(strategy="most_frequent")),
("onehot", OneHotEncoder(handle_unknown="ignore"))
])
# Buat Fitur FamilySize
X["FamilySize"] = X["SibSp"].fillna(0) + X["Parch"].fillna(0) + 1
# Tambahkan FamilySize pada kelompok numerikal
preprocess = ColumnTransformer([
("num", num_tf, num_cols + ["FamilySize"]),
("cat", cat_tf, cat_cols),
])
from sklearn.feature_selection import f_classif
selector_filter = SelectKBest(score_func=f_classif, k=5)
# Seleksi fitur dengan SelectKBest
# Fungsi tersebut akan menggunakan analisis variance
# Baca: https://scikit-learn.org/stable/modules/feature_selection.html#univariate-feature-selection
from sklearn.feature_selection import f_classif
selector_filter = SelectKBest(score_func=f_classif, k=5)
# Buat pipeline final (INGAT INI HANYA PIPELINE, BELUM MEMPROSES DATA)
pipe_filter = Pipeline([
("prep", preprocess), # menjalankan pipeline preprocessing
("sel", selector_filter), # menjalankan pipeline seleksi fitur
("clf", LogisticRegression(max_iter=1000)) # uji dengan model sederhana -> Logistic Regression
])
# Lakukan pelatihan dan uji model
X_train, X_test, y_train, y_test = train_test_split(X, y, stratify=y, test_size=0.2, random_state=42)
pipe_filter.fit(X_train, y_train)
pred = pipe_filter.predict(X_test)
print("=== Filter (ANOVA) + LR ===")
print("Accuracy:", accuracy_score(y_test, pred))
print(classification_report(y_test, pred))