Lewati ke konten utama

Tutorial Seleksi Fitur Python: Panduan Pemula

Pelajari dasar-dasar seleksi fitur dan cara mengimplementasikan serta menyelidiki berbagai teknik seleksi fitur di Python.
Diperbarui 28 Sep 2026  · 14 mnt Baca

Jelajahi bersama AI

ChatGPTClaudePerplexity

banner

Jalankan dan edit kode dari Tutorial ini secara online

Jalankan kode

Jika Anda ingin belajar lebih banyak Python, ikuti kursus gratis DataCamp Intro to Python for Data Science.

Anda semua pernah melihat dataset. Terkadang kecil, tetapi sering kali ukurannya sangat besar. Menangani dataset yang sangat besar menjadi tantangan, setidaknya cukup besar hingga menyebabkan hambatan pemrosesan.

Lalu, apa yang membuat dataset tersebut begitu besar? Ya, fiturnya. Semakin banyak jumlah fitur, semakin besar datasetnya. Ya, tidak selalu. Anda akan menemukan dataset dengan jumlah fitur yang sangat banyak, tetapi tidak mengandung begitu banyak instance. Namun itu bukan pokok bahasan di sini. Jadi, Anda mungkin bertanya-tanya, dengan komputer standar di tangan, bagaimana memproses jenis dataset ini tanpa berputar-putar.

Sering kali, dalam dataset berdimensi tinggi, ada beberapa fitur yang sepenuhnya tidak relevan, tidak signifikan, dan tidak penting. Telah terlihat bahwa kontribusi jenis fitur ini sering kali lebih kecil terhadap pemodelan prediktif dibandingkan fitur kritis. Bahkan bisa jadi kontribusinya nol. Fitur-fitur ini menimbulkan sejumlah masalah yang pada gilirannya menghambat proses pemodelan prediktif yang efisien -

  • Alokasi sumber daya yang tidak perlu untuk fitur-fitur ini.
  • Fitur-fitur ini bertindak sebagai noise sehingga model machine learning dapat berkinerja sangat buruk.
  • Model membutuhkan waktu lebih lama untuk dilatih.

Lalu, apa solusinya? Solusi paling ekonomis adalah Seleksi Fitur.

Seleksi Fitur adalah proses memilih fitur-fitur paling signifikan dari suatu dataset. Dalam banyak kasus, Seleksi Fitur juga dapat meningkatkan kinerja model machine learning.

Menarik, bukan?

Anda telah mendapat pengenalan informal tentang Seleksi Fitur dan pentingnya dalam dunia Data Science dan Machine Learning. Dalam tulisan ini Anda akan membahas:

  • Pengenalan seleksi fitur dan memahami pentingnya
  • Perbedaan antara seleksi fitur dan reduksi dimensi
  • Berbagai jenis metode seleksi fitur
  • Implementasi berbagai metode seleksi fitur dengan scikit-learn

Pengenalan Seleksi Fitur

Seleksi fitur juga dikenal sebagai pemilihan variabel atau pemilihan atribut.

Pada dasarnya, ini adalah proses memilih fitur yang paling penting/relevan dari sebuah dataset.

Memahami Pentingnya Seleksi Fitur

Pentingnya seleksi fitur paling terasa ketika Anda berhadapan dengan dataset yang berisi sejumlah besar fitur. Tipe dataset ini sering disebut sebagai dataset berdimensi tinggi. Dengan dimensi yang tinggi ini, muncul banyak masalah seperti: waktu pelatihan model machine learning meningkat signifikan; model menjadi sangat rumit yang pada gilirannya dapat menyebabkan overfitting.

Sering kali dalam himpunan fitur berdimensi tinggi, terdapat beberapa fitur yang redundan, artinya fitur-fitur tersebut hanyalah perpanjangan dari fitur-fitur penting lainnya. Fitur yang redundan juga tidak berkontribusi efektif terhadap pelatihan model. Jadi, jelas ada kebutuhan untuk mengekstrak fitur paling penting dan paling relevan dari sebuah dataset guna memperoleh kinerja pemodelan prediktif yang paling efektif.

"Tujuan pemilihan variabel ada tiga: meningkatkan kinerja prediksi dari prediktor, menyediakan prediktor yang lebih cepat dan hemat biaya, serta memberikan pemahaman yang lebih baik tentang proses dasar yang menghasilkan data."

-An Introduction to Variable and Feature Selection

Sekarang mari pahami perbedaan antara reduksi dimensi dan seleksi fitur.

Terkadang, seleksi fitur disalahartikan sebagai reduksi dimensi. Padahal keduanya berbeda. Keduanya sama-sama mengurangi jumlah atribut dalam dataset, tetapi metode reduksi dimensi melakukannya dengan membuat kombinasi baru dari atribut (kadang disebut transformasi fitur), sedangkan metode seleksi fitur menyertakan atau mengecualikan atribut yang ada dalam data tanpa mengubahnya.

Beberapa contoh metode reduksi dimensi adalah Principal Component Analysis, Singular Value Decomposition, Linear Discriminant Analysis, dan sebagainya.

Izinkan saya merangkum pentingnya seleksi fitur untuk Anda:

  • Memampukan algoritma machine learning dilatih lebih cepat.
  • Mengurangi kompleksitas model dan membuatnya lebih mudah diinterpretasikan.
  • Meningkatkan akurasi model jika subset yang tepat dipilih.
  • Mengurangi overfitting.

Pada bagian berikutnya, Anda akan mempelajari berbagai jenis metode seleksi fitur umum - Metode Filter, Wrapper, dan Embedded.

Metode Filter

Gambar berikut paling tepat menggambarkan metode seleksi fitur berbasis filter:

metode seleksi fitur berbasis filter

Sumber Gambar: Analytics Vidhya

Metode filter bergantung pada kekhasan umum data yang dievaluasi untuk memilih subset fitur, tanpa menyertakan algoritma penambangan apa pun. Metode filter menggunakan kriteria penilaian seperti jarak, informasi, ketergantungan, dan konsistensi. Metode filter menggunakan kriteria utama teknik pemeringkatan dan menggunakan metode pengurutan peringkat untuk pemilihan variabel. Alasan menggunakan metode pemeringkatan adalah kesederhanaannya, menghasilkan fitur yang baik dan relevan. Metode pemeringkatan akan menyaring fitur yang tidak relevan sebelum proses klasifikasi dimulai.

Metode filter umumnya digunakan sebagai langkah prapemrosesan data. Pemilihan fitur independen dari algoritma machine learning mana pun. Fitur diberi peringkat berdasarkan skor statistik yang menentukan korelasi fitur dengan variabel keluaran. Korelasi adalah istilah yang sangat kontekstual, dan berbeda-beda sesuai pekerjaan. Anda dapat merujuk tabel berikut untuk mendefinisikan koefisien korelasi untuk berbagai jenis data (dalam hal ini kontinu dan kategorikal).

tabel untuk mendefinisikan koefisien korelasi untuk berbagai jenis data

Sumber Gambar: Analytics Vidhya

Beberapa contoh metode filter meliputi uji Chi-kuadrat, information gain, dan skor koefisien korelasi.

Berikutnya, Anda akan melihat metode Wrapper.

Metode Wrapper

Sama seperti metode filter, berikut infografik serupa yang akan membantu Anda memahami metode wrapper dengan lebih baik:

memahami metode wrapper

Sumber Gambar: Analytics Vidhya

Seperti yang terlihat pada gambar di atas, metode wrapper memerlukan satu algoritma machine learning dan menggunakan kinerjanya sebagai kriteria evaluasi. Metode ini mencari fitur yang paling cocok untuk algoritma machine learning dan bertujuan meningkatkan kinerja penambangan. Untuk mengevaluasi fitur, akurasi prediktif digunakan untuk tugas klasifikasi dan kualitas klaster dievaluasi menggunakan klastering.

Beberapa contoh tipikal metode wrapper adalah forward feature selection, backward feature elimination, recursive feature elimination, dan lain-lain.

  • Forward Selection: Prosedur dimulai dengan himpunan fitur kosong [himpunan tereduksi]. Fitur terbaik dari fitur asli ditentukan dan ditambahkan ke himpunan tereduksi. Pada setiap iterasi berikutnya, atribut terbaik dari atribut asli yang tersisa ditambahkan ke himpunan.

  • Backward Elimination: Prosedur dimulai dengan himpunan atribut penuh. Pada setiap langkah, atribut terburuk yang tersisa dalam himpunan dihapus.

  • Kombinasi forward selection dan backward elimination: Metode stepwise forward selection dan backward elimination dapat digabungkan sehingga pada setiap langkah, prosedur memilih atribut terbaik dan menghapus yang terburuk dari atribut yang tersisa.

  • Recursive Feature Elimination: Recursive feature elimination melakukan pencarian rakus untuk menemukan subset fitur dengan kinerja terbaik. Secara iteratif ia membuat model dan menentukan fitur terbaik atau terburuk pada setiap iterasi. Ia membangun model berikutnya dengan fitur tersisa hingga semua fitur dieksplorasi. Kemudian ia memberi peringkat fitur berdasarkan urutan eliminasi. Dalam kasus terburuk, jika sebuah dataset berisi N fitur, RFE akan melakukan pencarian rakus untuk 2N kombinasi fitur.

Cukup baik!

Sekarang mari pelajari metode embedded.

Metode Embedded

Metode embedded bersifat iteratif dalam arti memperhatikan setiap iterasi proses pelatihan model dan dengan cermat mengekstrak fitur-fitur yang paling berkontribusi pada pelatihan untuk iterasi tertentu. Metode regularisasi adalah metode embedded yang paling umum digunakan yang memberikan penalti pada fitur berdasarkan ambang koefisien.

Itulah mengapa metode regularisasi juga disebut metode penalization yang memperkenalkan kendala tambahan ke dalam optimisasi algoritma prediktif (seperti algoritma regresi) yang mengarahkan model ke kompleksitas yang lebih rendah (lebih sedikit koefisien).

Contoh algoritma regularisasi adalah LASSO, Elastic Net, Ridge Regression, dan lain-lain.

Perbedaan antara Metode Filter dan Wrapper

Memang kadang membingungkan membedakan metode filter dan wrapper dari segi fungsionalitasnya. Mari lihat poin-poin perbedaannya.

  • Metode filter tidak melibatkan model machine learning untuk menentukan apakah suatu fitur baik atau buruk, sedangkan metode wrapper menggunakan model machine learning dan melatihnya dengan fitur untuk memutuskan apakah fitur tersebut penting atau tidak.
  • Metode filter jauh lebih cepat dibandingkan metode wrapper karena tidak melibatkan pelatihan model. Di sisi lain, metode wrapper mahal secara komputasi, dan untuk dataset yang sangat besar, metode wrapper bukan pilihan seleksi fitur yang paling efektif untuk dipertimbangkan.
  • Metode filter mungkin gagal menemukan subset fitur terbaik ketika tidak ada cukup data untuk memodelkan korelasi statistik fitur, tetapi metode wrapper dapat selalu memberikan subset fitur terbaik karena sifatnya yang ekshaustif.
  • Menggunakan fitur dari metode wrapper dalam model machine learning akhir Anda dapat menyebabkan overfitting karena metode wrapper sudah melatih model dengan fitur-fitur tersebut dan ini memengaruhi kekuatan sejati pembelajaran. Namun fitur dari metode filter pada sebagian besar kasus tidak akan menyebabkan overfitting.

Sejauh ini Anda telah mempelajari pentingnya seleksi fitur, memahami perbedaannya dengan reduksi dimensi. Anda juga membahas berbagai jenis metode seleksi fitur. Sejauh ini, bagus!

Sekarang, mari lihat beberapa jebakan yang mungkin Anda temui saat melakukan seleksi fitur:

Pertimbangan Penting

Anda mungkin sudah memahami nilai seleksi fitur dalam pipeline machine learning dan manfaat yang diberikannya jika diintegrasikan. Namun sangat penting untuk memahami di mana tepatnya Anda harus mengintegrasikan seleksi fitur dalam pipeline Anda.

Sederhananya, Anda harus menyertakan langkah seleksi fitur sebelum memberikan data ke model untuk pelatihan, terutama ketika Anda menggunakan metode estimasi akurasi seperti cross-validation. Ini memastikan bahwa seleksi fitur dilakukan pada lipatan data tepat sebelum model dilatih. Namun jika Anda melakukan seleksi fitur terlebih dahulu untuk menyiapkan data, lalu melakukan pemilihan dan pelatihan model pada fitur yang dipilih, maka itu akan menjadi kesalahan besar.

Jika Anda melakukan seleksi fitur pada seluruh data lalu melakukan cross-validation, maka data uji pada setiap lipatan prosedur cross-validation juga telah digunakan untuk memilih fitur, dan ini cenderung menimbulkan bias pada kinerja model machine learning Anda.

Cukup teori! Sekarang langsung ke pengodean.

Studi Kasus di Python

Untuk studi kasus ini, Anda akan menggunakan dataset Pima Indians Diabetes. Deskripsi dataset dapat ditemukan di sini.

Dataset ini terkait tugas klasifikasi di mana Anda perlu memprediksi apakah seseorang menderita diabetes berdasarkan 8 fitur.

Terjadi total 768 observasi dalam dataset. Tugas pertama Anda adalah memuat dataset sehingga bisa lanjut. Namun sebelum itu, mari impor dependensi yang diperlukan. Anda bisa mengimpor yang lain sambil berjalan.

import pandas as pd
import numpy as np

Sekarang setelah dependensi diimpor, mari muat dataset Pima Indians ke dalam objek DataFrame dengan bantuan pustaka Pandas.

data = pd.read_csv("diabetes.csv")

Dataset berhasil dimuat ke objek DataFrame data. Sekarang, mari lihat datanya.

data.head()
Dataframe

Jadi Anda dapat melihat 8 fitur berbeda yang dilabelkan ke luaran 1 dan 0, di mana 1 berarti observasi tersebut menderita diabetes, dan 0 berarti tidak menderita diabetes. Dataset ini diketahui memiliki nilai hilang. Secara khusus, ada observasi yang hilang untuk beberapa kolom yang ditandai sebagai nilai nol. Anda dapat menyimpulkan ini dari definisi kolom-kolom tersebut, dan tidak masuk akal memiliki nilai nol untuk ukuran-ukuran tersebut, misalnya nol untuk body mass index atau tekanan darah adalah tidak valid.

Namun untuk tutorial ini, Anda akan langsung menggunakan versi praproses dari dataset.

# load data
url = "https://raw.githubusercontent.com/jbrownlee/Datasets/master/pima-indians-diabetes.data.csv"
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
dataframe = pd.read_csv(url, names=names)

Anda kini memuat data ke objek DataFrame bernama dataframe.

Mari konversi objek DataFrame menjadi array NumPy untuk komputasi yang lebih cepat. Juga, mari pisahkan data ke dalam variabel terpisah agar fitur dan label terpisah.

array = dataframe.values
X = array[:,0:8]
Y = array[:,8]

Hebat! Anda telah menyiapkan data Anda.

Pertama, Anda akan mengimplementasikan uji statistik Chi-Squared untuk fitur non-negatif guna memilih 4 fitur terbaik dari dataset. Anda sudah melihat uji Chi-Squared termasuk kelas metode filter. Jika ada yang penasaran ingin mengetahui internal Chi-Squared, video ini menjelaskannya dengan sangat baik.

Pustaka scikit-learn menyediakan kelas SelectKBest yang dapat digunakan dengan serangkaian uji statistik berbeda untuk memilih sejumlah fitur tertentu, dalam kasus ini Chi-Squared.

# Import the necessary libraries first
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2

Anda telah mengimpor pustaka untuk menjalankan eksperimen. Sekarang, mari lihat aksinya.

# Feature extraction
test = SelectKBest(score_func=chi2, k=4)
fit = test.fit(X, Y)

# Summarize scores
np.set_printoptions(precision=3)
print(fit.scores_)

features = fit.transform(X)
# Summarize selected features
print(features[0:5,:])
[ 111.52  1411.887   17.605   53.108 2175.565  127.669    5.393  181.304]
[[148.    0.   33.6  50. ]
 [ 85.    0.   26.6  31. ]
 [183.    0.   23.3  32. ]
 [ 89.   94.   28.1  21. ]
 [137.  168.   43.1  33. ]]

Interpretasi:

Anda dapat melihat skor untuk setiap atribut dan 4 atribut yang dipilih (dengan skor tertinggi): plas, test, mass, dan age. Skor ini akan membantu Anda lebih lanjut dalam menentukan fitur terbaik untuk melatih model.

Catatan: Baris pertama menunjukkan nama fitur. Untuk prapemrosesan dataset, nama telah dikodekan secara numerik.

Berikutnya, Anda akan mengimplementasikan Recursive Feature Elimination yang merupakan jenis metode seleksi fitur wrapper.

Recursive Feature Elimination (atau RFE) bekerja dengan secara rekursif menghapus atribut dan membangun model pada atribut yang tersisa.

Ia menggunakan akurasi model untuk mengidentifikasi atribut mana (dan kombinasi atribut) yang paling berkontribusi dalam memprediksi atribut target.

Anda dapat mempelajari lebih lanjut tentang kelas RFE di dokumentasi scikit-learn.

# Import your necessary dependencies
from sklearn.feature_selection import RFE
from sklearn.linear_model import LogisticRegression

Anda akan menggunakan RFE dengan pengklasifikasi Logistic Regression untuk memilih 3 fitur teratas. Pemilihan algoritma tidak terlalu penting selama cukup andal dan konsisten.

# Feature extraction
model = LogisticRegression()
rfe = RFE(model, 3)
fit = rfe.fit(X, Y)
print("Num Features: %s" % (fit.n_features_))
print("Selected Features: %s" % (fit.support_))
print("Feature Ranking: %s" % (fit.ranking_))
Num Features: 3
Selected Features: [ True False False False False  True  True False]
Feature Ranking: [1 2 3 5 6 1 1 4]

Anda dapat melihat bahwa RFE memilih 3 fitur teratas yaitu preg, mass, dan pedi.

Fitur-fitur ini ditandai True dalam array support dan ditandai dengan pilihan “1” dalam array ranking. Ini, pada gilirannya, menunjukkan kekuatan fitur-fitur tersebut.

Berikutnya Anda akan menggunakan Ridge regression yang pada dasarnya merupakan teknik regularisasi dan juga teknik seleksi fitur embedded.

Artikel ini memberikan penjelasan yang sangat baik tentang regresi Ridge. Pastikan untuk membacanya.

# First things first
from sklearn.linear_model import Ridge

Selanjutnya, Anda akan menggunakan regresi Ridge untuk menentukan koefisien R2.

Juga, lihat dokumentasi resmi scikit-learn tentang regresi Ridge.

ridge = Ridge(alpha=1.0)
ridge.fit(X,Y)
Ridge(alpha=1.0, copy_X=True, fit_intercept=True, max_iter=None,
   normalize=False, random_state=None, solver='auto', tol=0.001)

Untuk lebih memahami hasil regresi Ridge, Anda akan mengimplementasikan sedikit fungsi pembantu yang akan membantu Anda mencetak hasil dengan lebih baik sehingga mudah diinterpretasikan.

# A helper method for pretty-printing the coefficients
def pretty_print_coefs(coefs, names = None, sort = False):
    if names == None:
        names = ["X%s" % x for x in range(len(coefs))]
    lst = zip(coefs, names)
    if sort:
        lst = sorted(lst,  key = lambda x:-np.abs(x[0]))
    return " + ".join("%s * %s" % (round(coef, 3), name)
                                   for coef, name in lst)

Berikutnya, Anda akan memasukkan suku koefisien model Ridge ke fungsi kecil ini dan melihat hasilnya.

print ("Ridge model:", pretty_print_coefs(ridge.coef_))
Ridge model: 0.021 * X0 + 0.006 * X1 + -0.002 * X2 + 0.0 * X3 + -0.0 * X4 + 0.013 * X5 + 0.145 * X6 + 0.003 * X7

Anda dapat melihat semua suku koefisien yang dipasangkan dengan variabel fitur. Ini kembali membantu Anda memilih fitur yang paling esensial. Berikut beberapa poin yang perlu diingat saat menerapkan regresi Ridge:

  • Juga dikenal sebagai L2-Regularization.
  • Untuk fitur yang berkorelasi, artinya mereka cenderung mendapatkan koefisien yang serupa.
  • Fitur yang memiliki koefisien negatif tidak terlalu berkontribusi. Namun dalam skenario yang lebih kompleks dengan banyak fitur, skor ini pasti akan membantu Anda dalam proses pengambilan keputusan seleksi fitur.

Nah, bagian studi kasus selesai. Metode yang Anda implementasikan di atas akan membantu Anda memahami fitur dari suatu dataset secara komprehensif. Berikut beberapa poin penting tentang teknik-teknik ini:

  • Seleksi fitur pada dasarnya adalah bagian dari prapemrosesan data yang dianggap sebagai bagian paling memakan waktu dari setiap pipeline machine learning.
  • Teknik-teknik ini akan membantu Anda mendekatinya secara lebih sistematis dan ramah machine learning. Anda akan dapat menginterpretasikan fitur dengan lebih akurat.

Penutup!

Pada tulisan ini, Anda membahas salah satu topik statistik yang paling banyak dipelajari dan diteliti, yaitu seleksi fitur. Anda juga mengenal berbagai variannya dan menggunakannya untuk melihat fitur mana dalam suatu dataset yang penting.

Anda dapat melanjutkan tutorial ini dengan menggabungkan ukuran korelasi ke dalam metode wrapper dan melihat kinerjanya. Dalam prosesnya, Anda mungkin akan membuat mekanisme seleksi fitur Anda sendiri. Begitulah cara Anda membangun fondasi untuk riset kecil Anda. Para peneliti juga menggunakan berbagai prinsip soft computing untuk melakukan seleksi. Ini sendiri merupakan bidang studi dan riset yang luas. Selain itu, Anda sebaiknya mencoba algoritma seleksi fitur yang ada pada berbagai dataset dan menarik kesimpulan Anda sendiri.

Mengapa metode seleksi fitur tradisional ini masih relevan?

Ya, pertanyaan ini wajar. Karena ada arsitektur neural net (misalnya CNN) yang cukup mampu mengekstrak fitur paling signifikan dari data, tetapi itu pun memiliki keterbatasan. Menggunakan CNN untuk dataset tabular biasa yang tidak memiliki sifat khusus (sifat yang dimiliki citra pada umumnya seperti sifat translasi, tepi, sifat posisi, kontur, dll.) bukan keputusan paling bijak. Selain itu, ketika data dan sumber daya terbatas, melatih CNN pada dataset tabular biasa bisa menjadi sia-sia. Jadi, dalam situasi seperti itu, metode yang Anda pelajari pasti akan sangat berguna.

Berikut beberapa sumber jika Anda ingin menggali lebih dalam topik ini:

Di bawah ini adalah referensi yang digunakan untuk menulis tutorial ini.

Jangan ragu untuk menuliskan pertanyaan Anda di kolom komentar jika ada!

Topik
Python

Kursus Python

{count, plural, one {Kursus} other {Kursus}}

Pengantar Python

{hours} jam
7.1M
Kuasai dasar-dasar analisis data dengan Python dalam 4 jam. Kursus online ini memperkenalkan antarmuka Python dan pustaka populer.
Lihat DetailRight Arrow
Mulai Kursus
Lihat SelengkapnyaRight Arrow
Terkait

{count, plural, one {blog} other {blogs}}

Tutorial Korelasi di R

Dapatkan pengenalan dasar-dasar korelasi di R: pelajari lebih lanjut tentang koefisien korelasi, matriks korelasi, plotting korelasi, dan sebagainya.
David Woods's photo

David Woods

13 mnt

{count, plural, one {blog} other {blogs}}

40 Pertanyaan Wawancara DBMS Teratas di 2026

Kuasai pertanyaan wawancara basis data, dari konsep SQL dasar hingga skenario desain sistem tingkat lanjut. Panduan mendalam ini mencakup semua yang Anda perlukan untuk sukses di wawancara DBMS dan meraih peran berikutnya.
Dario Radečić's photo

Dario Radečić

15 mnt

{count, plural, one {blog} other {blogs}}

Spaghetti Plot dan Jalur Badai

Temukan alasan mengapa Anda sebaiknya (tidak) menggunakan spaghetti plot untuk menyampaikan ketidakpastian jalur prediksi badai serta dampaknya terhadap interpretasi.
Hugo Bowne-Anderson's photo

Hugo Bowne-Anderson

13 mnt

{count, plural, one {blog} other {blogs}}

12 Alternatif ChatGPT Terbaik yang Bisa Anda Coba pada 2026

Artikel ini menyajikan daftar alternatif ChatGPT yang akan meningkatkan produktivitas Anda.
Javier Canales Luna's photo

Javier Canales Luna

14 mnt

Lihat SelengkapnyaLihat Selengkapnya