|
2 weeks ago | |
---|---|---|
.. | ||
solution | 2 weeks ago | |
README.md | 2 weeks ago | |
assignment.md | 2 weeks ago | |
notebook.ipynb | 3 weeks ago |
README.md
Regresi Logistik untuk Memprediksi Kategori
Kuis Pra-Pelajaran
Pelajaran ini tersedia dalam R!
Pendahuluan
Dalam pelajaran terakhir tentang Regresi ini, salah satu teknik ML klasik dasar, kita akan mempelajari Regresi Logistik. Anda dapat menggunakan teknik ini untuk menemukan pola guna memprediksi kategori biner. Apakah permen ini cokelat atau bukan? Apakah penyakit ini menular atau tidak? Apakah pelanggan ini akan memilih produk ini atau tidak?
Dalam pelajaran ini, Anda akan mempelajari:
- Perpustakaan baru untuk visualisasi data
- Teknik untuk regresi logistik
✅ Perdalam pemahaman Anda tentang bekerja dengan jenis regresi ini di modul pembelajaran ini
Prasyarat
Setelah bekerja dengan data labu, kita sekarang cukup familiar untuk menyadari bahwa ada satu kategori biner yang dapat kita gunakan: Color
.
Mari kita bangun model regresi logistik untuk memprediksi, berdasarkan beberapa variabel, warna apa yang kemungkinan besar dimiliki oleh labu tertentu (oranye 🎃 atau putih 👻).
Mengapa kita membahas klasifikasi biner dalam pelajaran tentang regresi? Hanya untuk kenyamanan linguistik, karena regresi logistik sebenarnya adalah metode klasifikasi, meskipun berbasis linear. Pelajari cara lain untuk mengklasifikasikan data di kelompok pelajaran berikutnya.
Tentukan Pertanyaan
Untuk tujuan kita, kita akan mengekspresikan ini sebagai biner: 'Putih' atau 'Bukan Putih'. Ada juga kategori 'striped' dalam dataset kita, tetapi jumlahnya sedikit, jadi kita tidak akan menggunakannya. Kategori ini juga akan hilang setelah kita menghapus nilai null dari dataset.
🎃 Fakta menyenangkan, kita kadang-kadang menyebut labu putih sebagai labu 'hantu'. Mereka tidak mudah diukir, jadi tidak sepopuler labu oranye, tetapi mereka terlihat keren! Jadi kita juga bisa merumuskan ulang pertanyaan kita sebagai: 'Hantu' atau 'Bukan Hantu'. 👻
Tentang Regresi Logistik
Regresi logistik berbeda dari regresi linear, yang telah Anda pelajari sebelumnya, dalam beberapa cara penting.
🎥 Klik gambar di atas untuk video singkat tentang regresi logistik.
Klasifikasi Biner
Regresi logistik tidak menawarkan fitur yang sama seperti regresi linear. Regresi logistik memberikan prediksi tentang kategori biner ("putih atau bukan putih"), sedangkan regresi linear mampu memprediksi nilai kontinu, misalnya berdasarkan asal labu dan waktu panen, berapa harga labu akan naik.
Infografik oleh Dasani Madipalli
Klasifikasi Lainnya
Ada jenis regresi logistik lainnya, termasuk multinomial dan ordinal:
- Multinomial, yang melibatkan lebih dari satu kategori - "Oranye, Putih, dan Striped".
- Ordinal, yang melibatkan kategori yang terurut, berguna jika kita ingin mengurutkan hasil secara logis, seperti labu kita yang diurutkan berdasarkan sejumlah ukuran tertentu (mini, sm, med, lg, xl, xxl).
Variabel TIDAK Harus Berkorelasi
Ingat bagaimana regresi linear bekerja lebih baik dengan variabel yang lebih berkorelasi? Regresi logistik adalah kebalikannya - variabel tidak harus sejajar. Ini cocok untuk data ini yang memiliki korelasi yang agak lemah.
Anda Membutuhkan Banyak Data yang Bersih
Regresi logistik akan memberikan hasil yang lebih akurat jika Anda menggunakan lebih banyak data; dataset kecil kita tidak optimal untuk tugas ini, jadi ingatlah hal itu.
✅ Pikirkan jenis data yang cocok untuk regresi logistik
Latihan - rapikan data
Pertama, bersihkan data sedikit, hapus nilai null, dan pilih hanya beberapa kolom:
-
Tambahkan kode berikut:
columns_to_select = ['City Name','Package','Variety', 'Origin','Item Size', 'Color'] pumpkins = full_pumpkins.loc[:, columns_to_select] pumpkins.dropna(inplace=True)
Anda selalu dapat melihat sekilas dataframe baru Anda:
pumpkins.info
Visualisasi - plot kategorikal
Sekarang Anda telah memuat notebook awal dengan data labu sekali lagi dan membersihkannya sehingga hanya menyisakan dataset yang berisi beberapa variabel, termasuk Color
. Mari kita visualisasikan dataframe di notebook menggunakan pustaka yang berbeda: Seaborn, yang dibangun di atas Matplotlib yang kita gunakan sebelumnya.
Seaborn menawarkan beberapa cara menarik untuk memvisualisasikan data Anda. Misalnya, Anda dapat membandingkan distribusi data untuk setiap Variety
dan Color
dalam plot kategorikal.
-
Buat plot seperti itu dengan menggunakan fungsi
catplot
, menggunakan data labu kitapumpkins
, dan menentukan pemetaan warna untuk setiap kategori labu (oranye atau putih):import seaborn as sns palette = { 'ORANGE': 'orange', 'WHITE': 'wheat', } sns.catplot( data=pumpkins, y="Variety", hue="Color", kind="count", palette=palette, )
Dengan mengamati data, Anda dapat melihat bagaimana data Color berhubungan dengan Variety.
✅ Berdasarkan plot kategorikal ini, eksplorasi menarik apa yang dapat Anda bayangkan?
Pra-pemrosesan Data: Pengkodean Fitur dan Label
Dataset labu kita berisi nilai string untuk semua kolomnya. Bekerja dengan data kategorikal intuitif bagi manusia tetapi tidak bagi mesin. Algoritma pembelajaran mesin bekerja dengan baik dengan angka. Itulah mengapa pengkodean adalah langkah yang sangat penting dalam fase pra-pemrosesan data, karena memungkinkan kita mengubah data kategorikal menjadi data numerik, tanpa kehilangan informasi apa pun. Pengkodean yang baik menghasilkan model yang baik.
Untuk pengkodean fitur, ada dua jenis pengkode utama:
-
Pengkode ordinal: cocok untuk variabel ordinal, yaitu variabel kategorikal di mana datanya mengikuti urutan logis, seperti kolom
Item Size
dalam dataset kita. Pengkode ini membuat pemetaan sehingga setiap kategori diwakili oleh angka, yang merupakan urutan kategori dalam kolom.from sklearn.preprocessing import OrdinalEncoder item_size_categories = [['sml', 'med', 'med-lge', 'lge', 'xlge', 'jbo', 'exjbo']] ordinal_features = ['Item Size'] ordinal_encoder = OrdinalEncoder(categories=item_size_categories)
-
Pengkode kategorikal: cocok untuk variabel nominal, yaitu variabel kategorikal di mana datanya tidak mengikuti urutan logis, seperti semua fitur selain
Item Size
dalam dataset kita. Ini adalah pengkodean one-hot, yang berarti bahwa setiap kategori diwakili oleh kolom biner: variabel yang dikodekan sama dengan 1 jika labu termasuk dalam Variety tersebut dan 0 jika tidak.from sklearn.preprocessing import OneHotEncoder categorical_features = ['City Name', 'Package', 'Variety', 'Origin'] categorical_encoder = OneHotEncoder(sparse_output=False)
Kemudian, ColumnTransformer
digunakan untuk menggabungkan beberapa pengkode ke dalam satu langkah dan menerapkannya ke kolom yang sesuai.
from sklearn.compose import ColumnTransformer
ct = ColumnTransformer(transformers=[
('ord', ordinal_encoder, ordinal_features),
('cat', categorical_encoder, categorical_features)
])
ct.set_output(transform='pandas')
encoded_features = ct.fit_transform(pumpkins)
Di sisi lain, untuk mengkodekan label, kita menggunakan kelas LabelEncoder
dari scikit-learn, yang merupakan kelas utilitas untuk membantu menormalkan label sehingga hanya berisi nilai antara 0 dan n_classes-1 (di sini, 0 dan 1).
from sklearn.preprocessing import LabelEncoder
label_encoder = LabelEncoder()
encoded_label = label_encoder.fit_transform(pumpkins['Color'])
Setelah kita mengkodekan fitur dan label, kita dapat menggabungkannya ke dalam dataframe baru encoded_pumpkins
.
encoded_pumpkins = encoded_features.assign(Color=encoded_label)
✅ Apa keuntungan menggunakan pengkode ordinal untuk kolom Item Size
?
Analisis Hubungan Antar Variabel
Sekarang kita telah memproses data kita, kita dapat menganalisis hubungan antara fitur dan label untuk mendapatkan gambaran seberapa baik model akan dapat memprediksi label berdasarkan fitur.
Cara terbaik untuk melakukan analisis semacam ini adalah dengan memplot data. Kita akan menggunakan kembali fungsi catplot
dari Seaborn, untuk memvisualisasikan hubungan antara Item Size
, Variety
, dan Color
dalam plot kategorikal. Untuk memplot data dengan lebih baik, kita akan menggunakan kolom Item Size
yang telah dikodekan dan kolom Variety
yang belum dikodekan.
palette = {
'ORANGE': 'orange',
'WHITE': 'wheat',
}
pumpkins['Item Size'] = encoded_pumpkins['ord__Item Size']
g = sns.catplot(
data=pumpkins,
x="Item Size", y="Color", row='Variety',
kind="box", orient="h",
sharex=False, margin_titles=True,
height=1.8, aspect=4, palette=palette,
)
g.set(xlabel="Item Size", ylabel="").set(xlim=(0,6))
g.set_titles(row_template="{row_name}")
Gunakan Plot Swarm
Karena Color adalah kategori biner (Putih atau Tidak), kategori ini membutuhkan 'pendekatan khusus untuk visualisasi'. Ada cara lain untuk memvisualisasikan hubungan kategori ini dengan variabel lainnya.
Anda dapat memvisualisasikan variabel secara berdampingan dengan plot Seaborn.
-
Cobalah plot 'swarm' untuk menunjukkan distribusi nilai:
palette = { 0: 'orange', 1: 'wheat' } sns.swarmplot(x="Color", y="ord__Item Size", data=encoded_pumpkins, palette=palette)
Perhatikan: kode di atas mungkin menghasilkan peringatan, karena seaborn gagal merepresentasikan sejumlah besar titik data ke dalam plot swarm. Solusi yang mungkin adalah mengurangi ukuran penanda, dengan menggunakan parameter 'size'. Namun, perlu diingat bahwa ini memengaruhi keterbacaan plot.
🧮 Tunjukkan Matematikanya
Regresi logistik bergantung pada konsep 'maximum likelihood' menggunakan fungsi sigmoid. Fungsi 'Sigmoid' pada plot terlihat seperti bentuk 'S'. Fungsi ini mengambil nilai dan memetakannya ke antara 0 dan 1. Kurvanya juga disebut 'kurva logistik'. Rumusnya terlihat seperti ini:
di mana titik tengah sigmoid berada di titik 0 x, L adalah nilai maksimum kurva, dan k adalah kemiringan kurva. Jika hasil fungsi lebih dari 0.5, label yang dimaksud akan diberi kelas '1' dari pilihan biner. Jika tidak, akan diklasifikasikan sebagai '0'.
Bangun Model Anda
Membangun model untuk menemukan klasifikasi biner ini ternyata cukup sederhana di Scikit-learn.
🎥 Klik gambar di atas untuk video singkat tentang membangun model regresi linear
-
Pilih variabel yang ingin Anda gunakan dalam model klasifikasi Anda dan bagi set pelatihan dan pengujian dengan memanggil
train_test_split()
:from sklearn.model_selection import train_test_split X = encoded_pumpkins[encoded_pumpkins.columns.difference(['Color'])] y = encoded_pumpkins['Color'] X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
-
Sekarang Anda dapat melatih model Anda, dengan memanggil
fit()
dengan data pelatihan Anda, dan mencetak hasilnya:from sklearn.metrics import f1_score, classification_report from sklearn.linear_model import LogisticRegression model = LogisticRegression() model.fit(X_train, y_train) predictions = model.predict(X_test) print(classification_report(y_test, predictions)) print('Predicted labels: ', predictions) print('F1-score: ', f1_score(y_test, predictions))
Lihatlah skor model Anda. Tidak buruk, mengingat Anda hanya memiliki sekitar 1000 baris data:
precision recall f1-score support 0 0.94 0.98 0.96 166 1 0.85 0.67 0.75 33 accuracy 0.92 199 macro avg 0.89 0.82 0.85 199 weighted avg 0.92 0.92 0.92 199 Predicted labels: [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1] F1-score: 0.7457627118644068
Pemahaman Lebih Baik melalui Matriks Kebingungan
Meskipun Anda dapat mendapatkan laporan skor istilah dengan mencetak item di atas, Anda mungkin dapat memahami model Anda lebih mudah dengan menggunakan matriks kebingungan untuk membantu kita memahami bagaimana model bekerja.
🎓 'Matriks kebingungan' (atau 'matriks kesalahan') adalah tabel yang mengekspresikan positif dan negatif sejati vs. salah model Anda, sehingga mengukur akurasi prediksi.
-
Untuk menggunakan matriks kebingungan, panggil
confusion_matrix()
:from sklearn.metrics import confusion_matrix confusion_matrix(y_test, predictions)
Lihatlah matriks kebingungan model Anda:
array([[162, 4], [ 11, 22]])
Di Scikit-learn, baris (axis 0) adalah label aktual dan kolom (axis 1) adalah label yang diprediksi.
0 | 1 | |
---|---|---|
0 | TN | FP |
1 | FN | TP |
Apa yang terjadi di sini? Misalnya model kita diminta untuk mengklasifikasikan labu antara dua kategori biner, kategori 'putih' dan kategori 'bukan putih'.
- Jika model Anda memprediksi labu sebagai bukan putih dan sebenarnya termasuk kategori 'bukan putih', kita menyebutnya negatif sejati, ditunjukkan oleh angka kiri atas.
- Jika model Anda memprediksi labu sebagai putih dan sebenarnya termasuk kategori 'bukan putih', kita menyebutnya negatif palsu, ditunjukkan oleh angka kiri bawah.
- Jika model Anda memprediksi labu sebagai bukan putih dan sebenarnya termasuk kategori 'putih', kita menyebutnya positif palsu, ditunjukkan oleh angka kanan atas.
- Jika model Anda memprediksi labu sebagai putih dan sebenarnya termasuk kategori 'putih', kita menyebutnya positif sejati, ditunjukkan oleh angka kanan bawah.
Seperti yang mungkin Anda duga, lebih baik memiliki jumlah positif sejati dan negatif sejati yang lebih besar serta jumlah positif palsu dan negatif palsu yang lebih kecil, yang menunjukkan bahwa model bekerja lebih baik. Bagaimana matriks kebingungan berhubungan dengan presisi dan recall? Ingat, laporan klasifikasi yang dicetak di atas menunjukkan presisi (0.85) dan recall (0.67).
Presisi = tp / (tp + fp) = 22 / (22 + 4) = 0.8461538461538461
Recall = tp / (tp + fn) = 22 / (22 + 11) = 0.6666666666666666
✅ Q: Berdasarkan matriks kebingungan, bagaimana performa model? A: Tidak buruk; ada sejumlah besar true negatives tetapi juga beberapa false negatives.
Mari kita tinjau kembali istilah-istilah yang telah kita lihat sebelumnya dengan bantuan pemetaan TP/TN dan FP/FN dari matriks kebingungan:
🎓 Presisi: TP/(TP + FP) Fraksi dari instance yang relevan di antara instance yang diambil (misalnya, label mana yang diberi label dengan baik)
🎓 Recall: TP/(TP + FN) Fraksi dari instance yang relevan yang diambil, baik diberi label dengan baik atau tidak
🎓 f1-score: (2 * presisi * recall)/(presisi + recall) Rata-rata tertimbang dari presisi dan recall, dengan nilai terbaik adalah 1 dan terburuk adalah 0
🎓 Support: Jumlah kemunculan setiap label yang diambil
🎓 Akurasi: (TP + TN)/(TP + TN + FP + FN) Persentase label yang diprediksi dengan akurat untuk sebuah sampel.
🎓 Macro Avg: Perhitungan rata-rata metrik yang tidak berbobot untuk setiap label, tanpa memperhatikan ketidakseimbangan label.
🎓 Weighted Avg: Perhitungan rata-rata metrik untuk setiap label, dengan memperhatikan ketidakseimbangan label dengan memberi bobot berdasarkan support (jumlah instance yang benar untuk setiap label).
✅ Bisakah Anda memikirkan metrik mana yang harus diperhatikan jika Anda ingin model Anda mengurangi jumlah false negatives?
Visualisasi kurva ROC dari model ini
🎥 Klik gambar di atas untuk video singkat tentang kurva ROC
Mari kita lakukan satu visualisasi lagi untuk melihat apa yang disebut 'kurva ROC':
from sklearn.metrics import roc_curve, roc_auc_score
import matplotlib
import matplotlib.pyplot as plt
%matplotlib inline
y_scores = model.predict_proba(X_test)
fpr, tpr, thresholds = roc_curve(y_test, y_scores[:,1])
fig = plt.figure(figsize=(6, 6))
plt.plot([0, 1], [0, 1], 'k--')
plt.plot(fpr, tpr)
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('ROC Curve')
plt.show()
Menggunakan Matplotlib, plot Receiving Operating Characteristic atau ROC dari model. Kurva ROC sering digunakan untuk mendapatkan gambaran keluaran dari sebuah classifier dalam hal true positives vs. false positives. "Kurva ROC biasanya menampilkan true positive rate pada sumbu Y, dan false positive rate pada sumbu X." Oleh karena itu, kemiringan kurva dan ruang antara garis tengah dan kurva menjadi penting: Anda menginginkan kurva yang cepat naik dan melewati garis. Dalam kasus kita, ada false positives di awal, dan kemudian garis naik dan melewati dengan baik:
Akhirnya, gunakan roc_auc_score
API dari Scikit-learn untuk menghitung 'Area Under the Curve' (AUC) yang sebenarnya:
auc = roc_auc_score(y_test,y_scores[:,1])
print(auc)
Hasilnya adalah 0.9749908725812341
. Mengingat bahwa AUC berkisar dari 0 hingga 1, Anda menginginkan skor yang besar, karena model yang 100% benar dalam prediksinya akan memiliki AUC sebesar 1; dalam kasus ini, modelnya cukup baik.
Dalam pelajaran klasifikasi di masa depan, Anda akan belajar bagaimana mengiterasi untuk meningkatkan skor model Anda. Tetapi untuk saat ini, selamat! Anda telah menyelesaikan pelajaran regresi ini!
🚀Tantangan
Masih banyak yang bisa dipelajari tentang logistic regression! Tetapi cara terbaik untuk belajar adalah dengan bereksperimen. Temukan dataset yang cocok untuk analisis jenis ini dan bangun model dengannya. Apa yang Anda pelajari? tip: coba Kaggle untuk dataset yang menarik.
Kuis setelah kuliah
Tinjauan & Studi Mandiri
Baca beberapa halaman pertama dari makalah ini dari Stanford tentang beberapa penggunaan praktis logistic regression. Pikirkan tentang tugas-tugas yang lebih cocok untuk salah satu jenis regresi yang telah kita pelajari sejauh ini. Apa yang akan bekerja paling baik?
Tugas
Penafian:
Dokumen ini telah diterjemahkan menggunakan layanan penerjemahan AI Co-op Translator. Meskipun kami berusaha untuk memberikan hasil yang akurat, harap diingat bahwa terjemahan otomatis mungkin mengandung kesalahan atau ketidakakuratan. Dokumen asli dalam bahasa aslinya harus dianggap sebagai sumber yang otoritatif. Untuk informasi yang bersifat kritis, disarankan menggunakan jasa penerjemahan profesional oleh manusia. Kami tidak bertanggung jawab atas kesalahpahaman atau penafsiran yang keliru yang timbul dari penggunaan terjemahan ini.