Inilah Penggunaan Regresi Linear dengan Python (Untuk Machine Learning dan Data Science)

Assalamu‘alaikum wr. wb.

Halo gais! Jika sebelumnya sudah membahas tentang Regresi Linear dengan menggunakan SPSS, kali ini kita akan membahas tentang Regresi Linear dengan menggunakan Python untuk Machine Learning dan Data Science.

Penggunaan Regresi Linear dengan Python (Untuk Machine Learning dan Data Science)


PENGERTIAN REGRESI LINEAR

Sumber Materi : Intellipaat.com (Blog) dan Analyticsvidhya.com (Blog)

A. Pengertian Regresi Linear

Sebelumnya sudah pernah membahas Regresi Linear, kali ini kita akan lebih mendalam lagi.

Seperti yang disebutkan di atas, regresi linear adalah teknik pemodelan prediktif. Ini digunakan setiap kali ada hubungan linear antara variabel dependen dan independen.

Ini digunakan untuk memperkirakan seberapa banyak y akan berubah ketika x berubah sejumlah tertentu.

Seperti yang terlihat pada gambar, panjang sepal bunga dipetakan ke sumbu x, dan panjang kelopak dipetakan ke sumbu y. Mari mencoba memahami bagaimana panjang kelopak berubah sehubungan dengan panjang sepal dengan bantuan regresi linear. Mari memahami regresi linear dengan lebih baik dengan contoh lain yang diberikan di bawah ini.

B. Rumus dan Jenis-jenis Regresi Linear

Regresi linear adalah metode regresi statistik yang tenang dan sederhana yang digunakan untuk analisis prediktif dan menunjukkan hubungan antara variabel kontinu. Regresi linear menunjukkan hubungan linear antara variabel independen (sumbu X) dan variabel dependen (sumbu Y), oleh karena itu disebut regresi linear. Jika ada satu variabel input (x), regresi linear tersebut disebut regresi linear sederhana. Dan jika ada lebih dari satu variabel input, regresi linear tersebut disebut regresi linear berganda. Model regresi linear memberikan garis lurus yang miring yang menggambarkan hubungan antar variabel.

Grafik di atas menunjukkan hubungan linear antara variabel dependen dan variabel independen. Ketika nilai x (variabel independen) meningkat, nilai y (variabel dependen) juga meningkat. Garis merah disebut sebagai garis lurus terbaik. Berdasarkan titik data yang diberikan, kami mencoba menggambar garis yang paling baik merepresentasikan titik-titik tersebut.

Untuk menghitung garis terbaik, regresi linear menggunakan bentuk slope-intercept tradisional.

  • y = Variabel Dependen.
  • x = Variabel Independen
  • a0 = Titik Potong Garis
  • a1 = Koefisien Regresi Linier

​Keperluan dari Regresi Linear

Seperti yang disebutkan sebelumnya, Regresi Linear memperkirakan hubungan antara variabel dependen dan variabel independen. Mari pahami ini dengan contoh sederhana:

Misalkan kita ingin memperkirakan gaji seorang karyawan berdasarkan tahun pengalaman. Anda memiliki data perusahaan terbaru, yang menunjukkan hubungan antara pengalaman dan gaji. Di sini, tahun pengalaman adalah variabel independen, dan gaji seorang karyawan adalah variabel dependen, karena gaji seorang karyawan bergantung pada pengalaman karyawan. Dengan menggunakan wawasan ini, kita dapat memprediksi gaji masa depan karyawan berdasarkan informasi saat ini dan masa lalu.

Garis regresi dapat berupa Hubungan Linear Positif atau Hubungan Linear Negatif.

1. Hubungan Linear Positif

Jika variabel dependen memperluas pada sumbu Y dan variabel independen berkembang pada sumbu X, maka hubungan tersebut disebut sebagai Hubungan Linear Positif.

2. Hubungan Linear Negatif

Jika variabel dependen menurun pada sumbu Y dan variabel independen meningkat pada sumbu X, hubungan tersebut disebut sebagai Hubungan Linear Negatif.

Tujuan dari algoritma Regresi Linear adalah untuk mendapatkan nilai terbaik untuk a0 dan a1 untuk menemukan garis terbaik. Garis terbaik harus memiliki kesalahan terkecil, yang berarti kesalahan antara nilai yang diprediksi dan nilai sebenarnya harus diminimalkan.

3. Cost Function

Fungsi Biaya (Cost Function) membantu menentukan nilai-nilai terbaik yang mungkin untuk a0 dan a1, yang memberikan garis terbaik untuk titik-titik data.

Fungsi Biaya mengoptimalkan koefisien atau bobot regresi dan mengukur seberapa baik model regresi linear berperforma. Fungsi biaya digunakan untuk menemukan akurasi fungsi pemetaan yang memetakan variabel input ke variabel output. Fungsi pemetaan ini juga dikenal sebagai fungsi Hipotesis.

Dalam Regresi Linear, digunakan fungsi biaya Mean Squared Error (MSE), yang merupakan rata-rata dari kesalahan kuadrat yang terjadi antara nilai yang diprediksi dan nilai sebenarnya.

Dengan Persamaan Linear sederhana y = mx+b, kita dapat menghitung MSE sebagai :

Misalkan y = nilai sebenarnya, yi = nilai yang diprediksi

Dengan menggunakan fungsi MSE, kita akan mengubah nilai-nilai a0 dan a1 sedemikian rupa sehingga nilai MSE berada pada minimum. Parameter-model xi, b (a0a1) dapat dimanipulasi untuk meminimalkan fungsi biaya. Parameter ini dapat ditentukan menggunakan metode gradien descent agar nilai fungsi biaya minimal.

4. Gradient Descent

Gradient descent adalah metode pembaruan a0 dan a1 untuk meminimalkan fungsi biaya (MSE). Model regresi menggunakan gradient descent untuk memperbarui koefisien garis (a0a1 => xi, b) dengan mengurangi fungsi biaya dengan pemilihan nilai koefisien secara acak dan kemudian secara iteratif memperbarui nilai-nilai tersebut untuk mencapai fungsi biaya minimum.

Bayangkan suatu lubang berbentuk U. Anda berdiri di titik paling atas di lubang tersebut, dan tujuan Anda adalah mencapai dasar lubang. Ada sebuah harta karun, dan Anda hanya dapat mengambil sejumlah langkah diskrit untuk mencapai dasar. Jika Anda memutuskan untuk mengambil satu langkah setiap kali, Anda pada akhirnya akan mencapai dasar lubang, tetapi ini akan memakan waktu lebih lama. Jika Anda memilih untuk mengambil langkah-langkah yang lebih panjang setiap kali, Anda mungkin akan sampai lebih cepat, tetapi ada kemungkinan Anda akan melewatkan dasar lubang dan tidak mendekati dasar. Dalam algoritma gradien descent, jumlah langkah yang Anda ambil adalah tingkat pembelajaran, dan ini menentukan seberapa cepat algoritma akan konvergen ke minimum.

Untuk memperbarui a0 dan a1, kita mengambil gradien dari fungsi biaya. Untuk menemukan gradien ini, kita mengambil turunan parsial untuk a0 dan a1.

Turunan parsial tersebut adalah gradien, dan mereka digunakan untuk memperbarui nilai a0 dan a1. Alpha adalah tingkat pembelajaran.

Untuk selengkapnya tentang Regresi Linear (dan menggunakan SPSS), silakan lihat di sini (Inzaghi's Blog Legacy).


REGRESI LINEAR DENGAN PYTHON

Sumber Materi : W3schools.comSFU.ca, dan Geeksforgeeks.org

A. Metode Umum (Dalam Machine Learning)

Kita kehilangan satu variabel penting yang memengaruhi Calorie_Burnage, yaitu Durasi sesi pelatihan.

Durasi, bersama dengan Average_Pulse, akan menjelaskan Calorie_Burnage dengan lebih tepat.

Regresi Linear

Istilah regresi digunakan ketika Anda mencoba menemukan hubungan antar variabel.

Dalam Pembelajaran Mesin dan pemodelan statistik, hubungan tersebut digunakan untuk memprediksi hasil kejadian.

Dalam modul ini, kita akan menjawab pertanyaan-pertanyaan berikut :

  • Dapatkah kita menyimpulkan bahwa Average_Pulse dan Durasi terkait dengan Calorie_Burnage?
  • Dapatkah kita menggunakan Average_Pulse dan Durasi untuk memprediksi Calorie_Burnage?

Pada contoh ini, kita akan mencoba memprediksi Kalori_Pembakaran dengan Denyut_Rata-rata menggunakan Regresi Linier :

import pandas as pd
import matplotlib.pyplot as plt
from scipy import stats

full_health_data = pd.read_csv("data.csv", header=0, sep=",")

x = full_health_data["Average_Pulse"]
y = full_health_data ["Calorie_Burnage"]

slope, intercept, r, p, std_err = stats.linregress(x, y)

def myfunc(x):
 return slope * x + intercept

mymodel = list(map(myfunc, x))

plt.scatter(x, y)
plt.plot(x, slope * x + intercept)
plt.ylim(ymin=0, ymax=2000)
plt.xlim(xmin=0, xmax=200)
plt.xlabel("Average_Pulse")
plt.ylabel ("Calorie_Burnage")
plt.show()

Contoh dijelaskan :

  • Impor modul yang Anda butuhkan : Pandas, matplotlib, dan Scipy
  • Isolasikan Average_Pulse sebagai x. Isolasikan Calorie_burnage sebagai y
  • Dapatkan nilai kunci penting dengan: slope, intercept, r, p, std_err = stats.linregress(x, y)
  • Buat fungsi yang menggunakan nilai slope dan intercept untuk mengembalikan nilai baru. Nilai baru ini mewakili di mana pada sumbu y nilai x yang sesuai akan ditempatkan
  • Jalankan setiap nilai dari larik x melalui fungsi. Ini akan menghasilkan larik baru dengan nilai-nilai baru untuk sumbu y: mymodel = list(map(myfunc, x))
  • Gambar plot sebaran asli: plt.scatter(x, y)
  • Gambar garis regresi linear: plt.plot(x, mymodel)
  • Tentukan nilai maksimum dan minimum dari sumbu
  • Beri label pada sumbu: "Average_Pulse" dan "Calorie_Burnage"

Hasil Output :

B. Menggunakan Statsmodel (Dalam Data Science)

Sebuah Model Regresi Linear menjelaskan hubungan antara variabel dependen (y) dan setidaknya satu variabel independen (x) sebagai berikut :

Dalam metode OLS (Ordinary Least Squares), kita harus memilih nilai-nilai b1 dan b0 sedemikian rupa sehingga total jumlah kuadrat perbedaan antara nilai yang dihitung dan nilai yang diamati dari y, diminimalkan.


Dimana :

  • \hat{y_i}  = nilai yang diprediksi untuk observasi ke-i
  • yi  = nilai aktual untuk observasi ke-i
  • \epsilon_i  = error/residual untuk observasi ke-i
  • n = jumlah total observasi

Untuk mendapatkan nilai b₀ dan b₁ yang meminimalkan S, kita dapat mengambil turunan parsial untuk setiap koefisien dan menyamakannya dengan nol.

Studi kasus yang sangat sederhana ini dirancang untuk membantu Anda segera memahami penggunaan Statsmodels.

Dimulai dari data mentah, kami akan menunjukkan langkah-langkah yang diperlukan untuk memperkirakan model statistik dan menggambar plot diagnostik.

Kami hanya akan menggunakan fungsi yang disediakan oleh statsmodels atau dependensinya pada pandas dan patsy.

1. Instalasi Library Statsmodels

Pertama, lakukanlah Instalasi Library Package statsmodels dengan mengetik :

pip install statsmodels

2. Prediksi OLS

Berikut ini adalah Prediksi OLS (Termasuk Package Library) :

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import statsmodels.api as sm

np.random.seed(9876789)

nsample = 100
x = np.linspace(0, 10, 100)
X= np.column_stack((x, x ** 2))
beta = np.array([1, 0.1, 10])
e = np.random.normal(size=nsample)

X = sm.add_constant(X)
y = np.dot(X, beta) + e

Ini adalah untuk menampilkan Nilai Fit dan Ringkasan :

# Fits and Summary

model = sm.OLS(y, X)
results = model.fit()
print(results.summary())

Output :

3. Ekstraksi Parameter

Kuantitas yang diinginkan dapat diambil langsung dari model yang dipasang. Ketik dir(results) untuk daftar lengkap. Berikut beberapa contohnya :

# Parameter Extraction

print("Parameters: ", results.params)
print("R2: ", results.rsquared)

Output :

Parameters:  [ 1.34233516 -0.04024948 10.01025357]
R2:  0.9999879365025871

4. Kurva OLS Non-Linear (Linear dalam Parameter)

Kita menyimulasikan data buatan dengan hubungan non-linier antara x dan y :

# OLS non-linear curve but linear in parameters

nsample = 50
sig = 0.5
x = np.linspace(0, 20, nsample)
X= np.column_stack((x, np.sin(x), (x-5) ** 2,np.ones(nsample)))
beta = [0.5, 0.5, -0.02, 5.0]
y_true = np.dot(X, beta)
y = y_true + sig * np.random.normal(size=nsample)

Ini adalah untuk menampilkan Nilai Fit dan Ringkasan :

# Fits and Summary

res = sm.OLS(y, X).fit()
print(res.summary())

Output :

5. Ekstraksi Kuantitas

Inilah Ekstraksi Kuantitas :

# Quantities Extraction

print("Parameters: ", res.params)
print("Standard errors: ", res.bse)
print("Predicted values: ", res.predict())

Output :

Parameters:  [ 0.46872448  0.48360119 -0.01740479  5.20584496]
Standard errors:  [0.02640602 0.10380518 0.00231847 0.17121765]
Predicted values:  [ 4.77072516  5.22213464  5.63620761  5.98658823  6.25643234  6.44117491
  6.54928009  6.60085051  6.62432454  6.6518039   6.71377946  6.83412169
  7.02615877  7.29048685  7.61487206  7.97626054  8.34456611  8.68761335
  8.97642389  9.18997755  9.31866582  9.36587056  9.34740836  9.28893189
  9.22171529  9.17751587  9.1833565   9.25708583  9.40444579  9.61812821
  9.87897556 10.15912843 10.42660281 10.65054491 10.8063004  10.87946503
 10.86825119 10.78378163 10.64826203 10.49133265 10.34519853 10.23933827
 10.19566084 10.22490593 10.32487947 10.48081414 10.66779556 10.85485568
 11.01006072 11.10575781]

6. Plotting

Jika ingin menampilkan Kurva/Plot, inilah tambahannya untuk membandingkan hubungan sebenarnya dengan prediksi OLS :

pred_ols = res.get_prediction()
iv_l = pred_ols.summary_frame()["obs_ci_lower"]
iv_u = pred_ols.summary_frame()["obs_ci_upper"]

fig, ax = plt.subplots(figsize=(8, 6))

ax.plot(x, y, "o", label="data")
ax.plot(x, y_true, "b-", label="True")
ax.plot(x, res.fittedvalues, "r--.", label="OLS")
ax.plot(x, iv_u, "r--")
ax.plot(x, iv_l, "r--")  # Corrected this line to use iv_l
ax.legend(loc="best")

Output :

7. Data Buatan (Heteroskedastisitas 2 Golongan)

Dalam contoh ini, w adalah simpangan baku kesalahan. WLS mengharuskan bobotnya proporsional dengan kebalikan dari varian kesalahan :

# Artificial Data

nsample = 50
x = np.linspace(0, 20, nsample)
X = np.column_stack((x, (x-5) ** 2))
X = sm.add_constant(X)
beta = [5.0, 0.5, -0.01]
sig = 0.5
w = np.ones(nsample)
w[nsample * 6 // 10 :] = 3
y_true = np.dot(X, beta)
e = np.random.normal(size=nsample)
y = y_true + sig * w * e
X = X[:, [0, 1]]

mod_wls=sm.WLS(y, X,weights=1.0/ (w ** 2))
res_wls= mod_wls.fit()
print(res_wls.summary())

Output :

8. OLS vs WLS

Perkirakan Model OLS untuk Perbandingan :

# OLS vs WLS

res_ols=sm.OLS(y, X).fit()
print(res_ols.params)
print(res_wls.params)

Output :

[5.51462323 0.38392656]
[5.21898662 0.44075899]

Bandingkan Kesalahan standar WLS dengan Kesalahan Standar OLS yang dikoreksi Heteroskedastisitas :

import numpy as np
from statsmodels.iolib.table import SimpleTable

# Assuming you have a format string defined like this
default_txt_fmt = 'l'

se = np.vstack(
  [
    [res_wls.bse],
    [res_ols.bse],
    [res_ols.HC0_se],
    [res_ols.HC1_se],
    [res_ols.HC2_se],
    [res_ols.HC3_se],
  ]
)

se = np.round(se, 4)
colnames = ["x1", "const"]
rownames = ["WLS", "OLS", "OLS_HC0", "OLS_HC1", "OLS_HC3", "OLS_HC3"]
tabl = SimpleTable(se, colnames, rownames, txt_fmt={'data': default_txt_fmt})
print(tabl)

Output :

=====================
          x1   const 
---------------------
WLS     0.1642 0.0208
OLS     0.2857 0.0246
OLS_HC0 0.1904 0.0238
OLS_HC1 0.1943 0.0243
OLS_HC3 0.1959 0.0245
OLS_HC3 0.2017 0.0251
---------------------

9. Hitung Interval Prediksi OLS

import numpy as np
from scipy import stats  # Add this import line

# Assuming you have X and res_ols defined before this point
covb = res_ols.cov_params()
prediction_var = res_ols.mse_resid + (X * np.dot(covb, X.T).T).sum(1)
prediction_std = np.sqrt(prediction_var)
tppf = stats.t.ppf(0.975, res_ols.df_resid)

pred_ols = res_ols.get_prediction()
iv_l_ols = pred_ols.summary_frame()["obs_ci_lower"]
iv_u_ols = pred_ols.summary_frame()["obs_ci_upper"]

Perbandingan Plot (Plotting Comparisons) :

pred_wls = res_wls.get_prediction()
iv_1=pred_wls.summary_frame()["obs_ci_lower"]
iv_u = pred_wls.summary_frame()["obs_ci_upper"]

fig, ax = plt.subplots(figsize=(8, 6))
ax.plot(x, y, "o", label="Data")
ax.plot(x, y_true, "b-", label="True")

# OLS
ax.plot(x, res_ols.fittedvalues, "r--", label="OLS")
ax.plot(x, iv_u_ols, "r--")
ax.plot(x, iv_l_ols, "r--")

# WLS
ax.plot(x, res_wls.fittedvalues, "g--", label="WLS")
ax.plot(x, iv_u, "g--")
ax.plot(x, iv_1, "g--")
ax.legend(loc="best")

Output :


Itulah Penggunaan Regresi Linear dengan Python dalam Machine Learning (ML) dan Data Science. Mohon maaf apabila ada kesalahan apapun. 

Terima Kasih 😄😘👌👍 :)

Wassalamu‘alaikum wr. wb. 

Post a Comment

Previous Post Next Post