Dalam tugas machine learning, classification (klasifikasi) adalah metode supervised learning untuk memprediksi label berdasarkan input data. Misalnya, kita ingin memprediksi apakah seseorang tertarik pada sales offering menggunakan fitur historis mereka. Dengan melatih model machine learning menggunakan data training yang tersedia, kita dapat melakukan tugas klasifikasi pada data yang akan datang.
Kita sering menemukan tugas klasifikasi klasik seperti binary classification (dua label) dan multiclass classification (lebih dari dua label). Dalam hal ini, kita akan melatih classifier dan model akan mencoba memprediksi salah satu label dari semua label yang tersedia. Dataset yang digunakan untuk klasifikasi mirip seperti gambar di bawah ini.
Gambar di atas menunjukkan bahwa target (Sales Offering) mengandung dua label dalam Binary Classification dan tiga dalam Multiclass Classification. Model akan dilatih dari fitur yang tersedia dan kemudian menghasilkan satu label saja.
Multilabel Classification berbeda dengan Binary Classification atau Multiclass Classification. Dalam Multilabel Classification, kita tidak hanya mencoba memprediksi dengan satu label output. Sebaliknya, Multilabel Classification akan mencoba memprediksi data dengan sebanyak mungkin label yang sesuai dengan data input. Output-nya bisa berupa tanpa label hingga jumlah maksimal label yang tersedia.
Multilabel Classification sering digunakan dalam tugas klasifikasi data teks. Misalnya, berikut ini adalah contoh dataset untuk Multilabel Classification.
Pada contoh di atas, bayangkan Teks 1 hingga Teks 5 adalah kalimat yang dapat dikategorikan ke dalam empat kategori: Event, Sport, Pop Culture, dan Nature. Dengan data training di atas, tugas Multilabel Classification adalah memprediksi label mana yang berlaku pada kalimat yang diberikan. Setiap kategori tidak saling bertentangan karena mereka tidak saling eksklusif; setiap label dapat dianggap independen.
Lebih detailnya, kita bisa melihat bahwa Teks 1 berlabel Sport dan Pop Culture, sementara Teks 2 berlabel Pop Culture dan Nature. Ini menunjukkan bahwa setiap label tidak saling eksklusif, dan Multilabel Classification dapat menghasilkan output prediksi berupa tidak ada label atau semua label sekaligus.
Dengan pengantar tersebut, mari kita coba membangun Multiclass Classifier dengan Scikit-Learn.
Multilabel Classification dengan Scikit-Learn
Tutorial ini akan menggunakan Biomedical PubMed Multilabel Classification dataset yang tersedia secara publik dari Kaggle. Dataset ini berisi berbagai fitur, tetapi kita hanya akan menggunakan fitur abstrakTeks dengan klasifikasi MeSH mereka (A: Anatomy, B: Organism, C: Diseases, dst). Data sampel ditunjukkan pada gambar di bawah ini.
Dataset di atas menunjukkan bahwa setiap paper dapat diklasifikasikan ke dalam lebih dari satu kategori, seperti halnya kasus Multilabel Classification. Dengan dataset ini, kita bisa membangun Multilabel Classifier dengan Scikit-Learn. Mari kita siapkan dataset sebelum kita melatih modelnya.
import pandas as pd
from sklearn.feature_extraction.text import TfidfVectorizer
df = pd.read_csv('PubMed Multi Label Text Classification Dataset Processed.csv')
df = df.drop(['Title', 'meshMajor', 'pmid', 'meshid', 'meshroot'], axis =1)
X = df["abstractText"]
y = np.asarray(df[df.columns[1:]])
vectorizer = TfidfVectorizer(max_features=2500, max_df=0.9)
vectorizer.fit(X)
Pada kode di atas, kita mengubah data teks menjadi representasi TF-IDF agar model Scikit-Learn dapat menerima data training. Saya tidak melakukan langkah-langkah data prepocessing, seperti penghapusan stopword, untuk menyederhanakan tutorial.
Setelah transformasi data, kita membagi dataset menjadi dataset training dan testing.
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=101)
X_train_tfidf = vectorizer.transform(X_train)
X_test_tfidf = vectorizer.transform(X_test)
Setelah semua persiapan ini, kita akan mulai melatih Multilabel Classifier. Di Scikit-Learn, kita akan menggunakan objek MultiOutputClassifier untuk melatih model Multilabel Classifier. Strategi di balik model ini adalah melatih satu classifier per label. Pada dasarnya, setiap label memiliki classifier sendiri.
Kita akan menggunakan Logistic Regression dalam contoh ini, dan MultiOutputClassifier akan memperluasnya ke semua label.
from sklearn.multioutput import MultiOutputClassifier
from sklearn.linear_model import LogisticRegression
clf = MultiOutputClassifier(LogisticRegression()).fit(X_train_tfidf, y_train)
Kita bisa mengganti model dan mengubah parameter model yang diberikan ke MultiOutputClassifier, jadi sesuaikan dengan kebutuhan Anda. Setelah training, mari kita gunakan model untuk memprediksi data testing.
prediction = clf.predict(X_test_tfidf)
prediction
Hasil prediksinya berupa label array untuk setiap kategori MeSH. Setiap baris mewakili kalimat, dan setiap kolom mewakili label.
Terakhir, kita perlu mengevaluasi Multilabel Classifier. Kita bisa menggunakan metrik akurasi untuk mengevaluasi model.
from sklearn.metrics import accuracy_score
print('Accuracy Score: ', accuracy_score(y_test, prediction))
Accuracy Score: 0.145
Hasil skor akurasinya adalah 0.145, yang menunjukkan bahwa model hanya dapat memprediksi kombinasi label yang tepat dalam kurun waktu kurang dari 14,5%. Namun skor akurasi mengandung kelemahan untuk evaluasi prediksi multilabel. Skor akurasi mengharuskan setiap kalimat memiliki semua label pada posisi yang tepat, atau akan dianggap salah.
Misalnya, pada prediksi baris pertama hanya berbeda satu label antara prediksi dan data testing.
Ini akan dianggap sebagai prediksi yang salah pada skor akurasi karena kombinasi label berbeda. Itulah mengapa model kita memiliki skor metrik yang rendah.
Untuk mengatasi masalah ini, kita harus mengevaluasi prediksi label, bukan kombinasi labelnya. Dalam hal ini, kita bisa mengandalkan metrik evaluasi Hamming Loss. Hamming Loss dihitung dengan mengambil sebagian kecil dari prediksi yang salah dengan jumlah total label. Karena Hamming Loss adalah fungsi kerugian, semakin rendah skornya maka semakin baik (0 menunjukkan tidak ada prediksi yang salah dan 1 menunjukkan semua prediksi salah).
from sklearn.metrics import hamming_loss
print('Hamming Loss: ', round(hamming_loss(y_test, prediction),2))
Hamming Loss: 0.13
Hamming Loss pada Model Multilabel Classifier kita adalah 0.13, yang berarti bahwa model akan memiliki prediksi yang salah sebesar 13% secara independen. Ini berarti setiap prediksi label mungkin salah sebesar 13%.
Kesimpulan
Multilabel Classification adalah tugas machine learning di mana output-nya bisa berupa tidak ada label atau semua label yang mungkin diberikan data input. Ini berbeda dengan binary classification atau multiclass classification, di mana output label saling eksklusif.
Dengan menggunakan Scikit-Learn MultiOutputClassifier, kita bisa mengembangkan Multilabel Classifier di mana kita melatih satu classifier untuk setiap label. Untuk evaluasi model, lebih baik menggunakan metrik Hamming Loss karena skor Akurasi mungkin tidak memberikan gambaran lengkap dengan benar.
Comments