Algoritma Pembelajaran Mesin Bagian 1: Regresi Linear

Jan 06 2023
Prediksikan Harga Berlian Menggunakan Regresi Linier
Regresi linier adalah alat yang ampuh namun relatif sederhana yang dapat digunakan untuk memahami hubungan antar variabel. Tutorial ini akan mengeksplorasi dasar-dasar regresi linier dengan cara yang ramah bagi pemula.
Foto oleh Bas van den Eijkhof di Unsplash

Regresi linier adalah alat yang ampuh namun relatif sederhana yang dapat digunakan untuk memahami hubungan antar variabel. Tutorial ini akan mengeksplorasi dasar-dasar regresi linier dengan cara yang ramah bagi pemula. Di akhir tutorial ini, Anda akan memiliki pemahaman yang kuat tentang regresi linier dan cara mengimplementasikannya menggunakan data dunia nyata.

Apa itu Regresi Linier?

Regresi linier, metode statistik yang pertama kali digunakan pada tahun 1877, memprediksi nilai dependen dari variabel independen. Pada dasarnya, ini "cocok" dengan garis linier untuk paling akurat mencocokkan hubungan variabel dependen dan independen berdasarkan banyak poin yang disediakan untuk model, mirip dengan plot pencar. Paling mudah untuk mengamati dengan grafik:

Sumber: Wikipedia.

Regresi linier bekerja dengan membuat garis linier (dalam bentuk y=mx+b) untuk paling akurat memprediksi nilai variabel dependen dengan menyelesaikan nilai m(kemiringan) dan b(perpotongan y).

Kuadrat Terkecil

Untuk melakukan ini, model menggunakan metode yang dikenal sebagai kuadrat terkecil untuk menemukan garis yang paling cocok dengan paling akurat. Tujuan dari metode ini adalah untuk mengurangi kuadrat total dari deviasi titik data tertentu ke garis yang paling sesuai sebanyak mungkin. Garis yang paling pas akan memiliki nilai resultan terendah dari fungsi kuadrat terkecil. Kami dapat menghitung penyimpangan dari setiap titik yang disediakan ke garis yang paling pas menggunakan persamaan:

Gambar oleh penulis.

Pada dasarnya, nilai dependen keluaran fungsi linear (nilai y) dikurangi dari variabel dependen titik data tertentu. Nilai ini bisa positif atau negatif tergantung pada apakah nilai fungsi lebih besar atau lebih rendah dari titik data. Namun, apakah deviasinya positif atau negatif tidak relevan — angkanya dikuadratkan.

Sederhananya, kita dapat menggunakan penjumlahan untuk mencari nilai total kuadrat dari semua simpangan:

Gambar oleh penulis.

Metode kuadrat terkecil mengklaim bahwa garis yang paling akurat/cocok dengan data akan memiliki jumlah terkecil ( S).

Contoh

Menggunakan poin : (1,2), (3,5), (5,2).

Gambar oleh penulis.

Sekarang adalah saat yang tepat untuk menyebutkan mengapa nilai dalam kuadrat terkecil dikuadratkan. Pertama-tama, seperti yang disebutkan sebelumnya, ini memastikan semua penyimpangannya positif. Lebih penting lagi, bagaimanapun, ini memastikan bahwa penyimpangan yang lebih tinggi diberi bobot lebih. Hal ini memungkinkan saluran yang dipasang untuk melayani lebih banyak ke arah outlier daripada biasanya.

Ambil, misalnya, grafik paling kiri. Kita dapat melihat bahwa penyimpangan dari garis ke dua titik data pertama adalah 0 atau dapat diabaikan. Sebaliknya, 2 garis grafik lainnya rata-rata lebih dekat ke titik data. Saat membandingkan nilai deviasi mentah (bukan kuadrat), kita dapat melihat bahwa semuanya cukup dekat satu sama lain. Saat membandingkan nilai deviasi kuadrat, kita dapat melihat bahwa deviasi grafik paling kiri lebih dari 600% lebih besar daripada grafik kanan. Ini karena penyimpangan yang lebih besar akan lebih banyak dihukum, yang berarti outlier memiliki dampak yang lebih besar pada garis akhir.

Menggunakan Kuadrat Terkecil

Ada dua cara di mana kuadrat terkecil dapat digunakan. Meskipun menggunakan operasi matriks adalah metode yang paling efisien secara komputasi dan digunakan secara luas, kita akan menjelajahi menggunakan penurunan gradien untuk mencari garis terbaik. Penurunan gradien adalah algoritme pengoptimalan di mana kita akan menghitung turunan dari penjumlahan dan kemudian mengubah nilai koefisien berdasarkan arah yang ditunjukkan oleh turunan tersebut. Proses ini akan diulang hingga solusi yang paling optimal ditemukan. Ini hanyalah gambaran singkat tentang penurunan gradien; nantikan artikel yang menjelaskan penurunan gradien bagi mereka yang tidak tahu kalkulus.

MSE vs SSE

Kita akan menggunakan fungsi biaya MSE ( Mean of S quared E rrors) sebagai fungsi biaya kita. Pada dasarnya, kami ingin meminimalkan nilai fungsi biaya ini untuk menghasilkan garis yang paling pas. Sebelumnya, kami menggunakan SSE (Sum of Squared Errors) untuk menentukan garis mana yang paling sesuai dengan titik-titiknya. MSE cukup jelas — identik dengan SSE, tetapi kami membagi jumlah akhir dengan jumlah titik data yang dijumlahkan:

Gambar oleh penulis.

MSE lebih populer daripada SSE karena sejumlah alasan.

Pertama, MSE kurang rentan terhadap outlier dibandingkan SSE. Karena MSE menormalkan kesalahan dengan jumlah poin data, outlier memiliki dampak yang lebih kecil. Mari kita asumsikan kumpulan data dengan error 1, 4, 1, 25. Outlier (25) hanya akan menjelaskan 25% dari kesalahan yang dihitung melalui MSE. Akibatnya, UMK akan menjadi 7.75. SSE akan menjadi 31.

Kedua, menggunakan MSE juga memungkinkan kesesuaian garis yang berbeda untuk dibandingkan satu sama lain, bahkan jika mereka menggunakan jumlah titik data yang berbeda. Misalnya, pertimbangkan dua model yang menggunakan jumlah titik data yang berbeda, Model A dan Model B. Jika Model A menggunakan 100 titik data dan Model B menggunakan 50 titik data, sering kali Model A akan memiliki SSE yang lebih tinggi. Namun, jika error dinormalisasi dengan menggunakan MSE, model dapat dibandingkan secara langsung terlepas dari berapa banyak titik data yang digunakan.

Faktor gabungan yang disebutkan di atas berarti bahwa MSE lebih dapat ditafsirkan daripada SSE. Outlier dalam kumpulan data mungkin membuat satu model tampak jauh lebih baik daripada yang lain jika dibandingkan menggunakan SSE, meskipun model tersebut mungkin lebih cocok dengan sebagian besar poin data.

Waktu Kode!

Dengan semua pengetahuan yang telah kita peroleh tentang regresi linier, kita sekarang dapat mengimplementasikannya sendiri menggunakan Python!

Mulai

Untuk tutorial ini, Anda memerlukan:

  • Python (versi 3.7 atau lebih tinggi) — direkomendasikan pengalaman dasar

Kemudian, instal tiga paket menggunakan pipdi terminal Anda:

  • pip install notebook
  • pip install numpy
  • pip install matplotlib
Gambar oleh penulis.

Anda dapat mengganti nama file dengan mengklik "Tanpa Judul".

Data Awal

Kami akan mulai dengan mengimpor pustaka Python NumPy, yang sangat berharga karena kemampuannya untuk dengan mudah melakukan operasi matematika pada larik angka. Kami kemudian akan mendefinisikan larik NumPy untuk titik-titik kami, serta menginisialisasi variabel kemiringan dan mencegat ke 0. Melihat titik-titik tersebut, mudah untuk menyimpulkan bahwa garis yang paling cocok untuk titik-titik ini adalah y=1x+0. Kami menggunakan nilai yang dapat diprediksi sehingga kami dapat membandingkan model.

# Importing numpy for number processing
import numpy as np

# Define the data points as a matrix, where each row represents a data point
# and each column represents a variable
points = np.array([(1, 1), (2, 2), (3, 3)])

# Defining initial values for the slope and y-intercept of the line
slope = 0
intercept = 0

Fungsi linear

Saat kita melakukan regresi linier, ada gunanya memiliki fungsi yang dapat mengevaluasi fungsi linier:

def result_of_function(independent_variable, slope, intercept):
    """
    Function to model y=mx+b

    :param slope: the slope of the linear function (m)
    :param intercept: the y-intercept of the linear function (b)
    :param independent_variable: the independent variable (x value) being inputted into the linear function (x)

    :returns: the value of the dependent variable of the function (y)
    """
    return independent_variable * slope + intercept

Fungsi Biaya

Ini juga akan membantu untuk memasukkan fungsi biaya untuk mengukur efektivitas regresi kami:

def cost_function(x, y, slope, intercept):
    """
    Calculate the mean squared error of a linear function with given parameters.
    
    :param x: The independent variable (x-values) of the data points.
    :param y: The dependent variable (y-values) of the data points.
    :param slope: The slope of the linear function.
    :param intercept: The y-intercept of the linear function.
    
    :returns: The mean squared error of the linear function.
    """
    
    # Predict the y-values using the given slope and intercept
    y_preds = result_of_function(x, slope, intercept)
    
    # Calculate the squared errors between the predicted and actual y-values
    squared_errors = (y_preds - y)**2
    
    # Return the mean of the squared errors
    return squared_errors.mean()

Turunan Gradien

Kita akan mulai dengan mendefinisikan nilai masukan dan keluaran (koordinat x dan koordinat y):

# Define the input and output data
X = np.array(points[:, 0])
Y = np.array(points[:, 1])

alpha = 0.01
    
# Iterate for a 1000 of epochs
for i in range(1000):
  # Calculate the gradients of J with respect to the slope and intercept
  grad_slope = -2 * ((Y - result_of_function(X, slope, intercept)) * X).mean()
  grad_intercept = -2 * ((Y - result_of_function(X, slope, intercept))).mean()
  
  # Update m and b using the gradients and the learning rate
  slope -= alpha * grad_slope
  intercept -= alpha * grad_intercept

  print(cost_function(X, Y, slope, intercept))

# Print the final values of m and b
print(f'Final values: slope = {slope}, intercept = {intercept}')

Namun, penting bagi Anda untuk memahami zaman. Yaitu, baris ini:

for i in range(1000):
  # code

Setelah menjalankan program ini, Anda akan mendapatkan nilai berikut untuk kemiringan dan perpotongan:

Final values: slope = 0.98539125301466, intercept = 0.033209115678908344

Secara grafis, seperti inilah hasilnya:

Gambar oleh penulis.

Menganalisis Hasil

MSE terakhir adalah 0.00015821003618271694— nilai yang sangat rendah. Namun, jika kita membuat grafik MSE setiap zaman (atau iterasi), kita akan mendapatkan grafik berikut:

Gambar oleh penulis.

Ini tampaknya merupakan pengembalian yang sangat, sangat berkurang. Nyatanya, setelah epoch 25 atau lebih, sepertinya MSE tidak berubah sama sekali! Mari kita lihat grafik ini dari perspektif yang berbeda, dengan mengabaikan 50 zaman pertama:

Gambar oleh penulis.

Apa yang tampak seperti garis lurus bukanlah — MSE menjadi hampir 100 kali lebih kecil dari zaman 50 hingga zaman 1000. Anda mungkin bertanya pada diri sendiri — bukankah MSE ~0,015 sudah cukup rendah? Mari coba jalankan lagi penurunan gradien, tetapi kali ini hanya dengan 50 epoch:

Final values: slope = 0.8539016923117737, intercept = 0.32575579906831564

Gambar oleh penulis.

Sebaliknya, mari jalankan penurunan gradien dengan 100.000 zaman:

Gambar oleh penulis.

Sempurna! Tampaknya menjalankan model dengan 100.000 zaman memberi kita hasil yang hampir sempurna. Meskipun menjalankan lebih banyak zaman dengan regresi linier ini memberi kita lebih banyak akurasi dengan model ini, penting untuk mempertimbangkan keseimbangan antara akurasi dan waktu. Secara umum, Anda harus bertujuan untuk menggunakan epoch yang cukup agar sesuai dengan data model, tetapi tidak terlalu banyak sehingga model membutuhkan waktu yang tidak perlu untuk dilatih. Sebuah teknik yang disebut penghentian awal umumnya digunakan dalam semua jenis model, di mana model dihentikan secara otomatis setelah mencapai akurasi tertentu. Hal ini memungkinkan model untuk dilatih secepat mungkin, namun tetap memastikan beberapa tingkat akurasi.

Menerapkan Regresi Linier

Terakhir, namun tidak kalah pentingnya, inilah saatnya menerapkan pengetahuan regresi linier kita ke beberapa data nyata!

Menemukan Kumpulan Data

Mari kita mulai dengan mencari kumpulan data. Kaggle adalah sumber yang bagus untuk menemukan kumpulan data gratis yang berkualitas tinggi dan bervariasi dalam hal struktur atau topiknya. Untuk proyek mini ini, saya memilih untuk menggunakan Data Analysis on Diamonds Dataset , untuk mengembangkan hubungan linier antara karat berlian (variabel independen) dan harganya (variabel dependen).

Memilih Kumpulan Data

Secara umum, ketika memilih atau membuat kumpulan data untuk menjalankan regresi linier, penting untuk mempertimbangkan faktor-faktor berikut:

  1. Korelasi linier yang kuat antara variabel independen dan dependen — jika variabel tampaknya tidak berkorelasi sama sekali atau korelasinya tidak linier, mungkin lebih baik memilih metode regresi yang berbeda.
  2. Outlier — kumpulan data yang baik harus relatif bebas dari outlier, karena dapat sangat memengaruhi kinerja regresi.
  3. Kesesuaian — kumpulan data harus relevan dengan masalah yang Anda coba selesaikan. Misalnya, jika Anda ingin memprediksi harga sebuah rumah di New York City berdasarkan kaki perseginya, melatih model pada data dari pertanian di pedesaan Montana tidak akan sesuai.

Mengunduh kumpulan data cukup intuitif di Kaggle. Tekan tombol unduh hitam di sudut kanan atas layar, dan simpan .zipfile ke komputer Anda. Anda kemudian dapat mengekstrak file dan memindahkan .csvfile di dalamnya ke direktori yang sama dengan file Notebook Jupyter Anda.

Penerapan

Sekarang, yang perlu dilakukan hanyalah menggunakan data dalam model regresi linier. Sekali lagi, dalam contoh ini, kami akan memprediksi harga berlian berdasarkan karatnya. Komentari baris berikut:

X = np.array(points[:, 0])
Y = np.array(points[:, 1])

diamond_data = np.genfromtxt('diamonds.csv', delimiter=',')
Y = diamond_data[1:][:, 7] # Costs of the diamonds
X = diamond_data[1:][:, 1] # Carats of the diamonds

Final values: slope = 7756.425617968576, intercept = -2256.3605800455275

2397955.0500126793

Gambar oleh penulis.

Ambil contoh, harga berlian 1 karat yang bervariasi. Ini dapat berkisar dari ~ $1000 hingga hampir $20.000! Ini adalah contoh utama dari kumpulan data ini yang tidak memiliki cukup hubungan linier antara dua variabel. Dalam hal ini, potongan, warna, dan kejernihan berlian juga berkontribusi besar terhadap harga. Penting juga untuk mempertimbangkan bahwa dengan data dunia nyata, MSE 0 secara praktis tidak mungkin. Fenomena dunia nyata dipengaruhi oleh sejumlah besar faktor, dan menangkap semuanya dalam model regresi secara praktis tidak mungkin dilakukan. Itu diserahkan sebagai latihan kepada pembaca untuk menjelajahi lebih banyak kumpulan data di Kaggle di mana korelasi linier antara dua variabel yang diberikan lebih kuat.

Pengujian

Mari kita uji model kita. Menurut CreditDonkey , nilai terbaik untuk berlian 1 karat berkisar antara $4.500—$6.000. Menggunakan kode berikut:

carat = 1
function_result = result_of_function(carat, slope, intercept)

print(f"A {carat}-carat diamond will cost: ${round(function_result, 2)}")

A 1-carat diamond will cost: $5488.47

Kesimpulan

Mari kita rekap — regresi linier adalah metode statistik yang digunakan untuk memahami hubungan antara dua variabel yang berkorelasi secara linier. Ini dilakukan dengan memasang garis dalam bentuk y=mx+bke variabel independen dan dependen yang disediakan. Garis yang paling pas dapat ditemukan dengan menggunakan metode yang dikenal sebagai kuadrat terkecil, yang meminimalkan jumlah simpangan kuadrat dari setiap titik ke titik yang bersesuaian pada garis tersebut. Kuadrat terkecil dapat diimplementasikan menggunakan operasi matriks dan penurunan gradien, dengan artikel ini berfokus pada penggunaan penurunan gradien. Fungsi biaya MSE (yaitu rata-rata kesalahan kuadrat) digunakan untuk menentukan keakuratan model. Dengan meminimalkan MSE, kita dapat mengoptimalkan model dan meningkatkan akurasinya.

Saya meninggalkan Anda dengan GIF yang memuaskan dari model yang perlahan-lahan menyatu pada garis yang paling pas:

Gambar oleh penulis.

Terima kasih telah membaca!