Kita telah menentukan variabel mana yang bagus mana yang jelek. Kita juga sudah membersihkan data sehingga akhirnya siap untuk digunakan dalam pengembangan model. Sekarang saatnya kita memprediksi harga mobil berdasarkan data yang ada.
Buka hands-on di github atau langsung buka di colab
Ini hanya untuk dua variabel saja, satu prediktor satu target.
\[Y=a+bX\]Dimana:
Anggaplah highway-mpg
punya relasi linear dengan price
.
Jika highway
-nya 20 maka pricenya sekian.
Nah untuk membuat garisnya. Diambil titik data untuk di latih (fit).
Hasil dari fitting adalah parameter \((a,b)\).
Titik data disimpan dalam numpy array. Array y
untuk target, array x
untuk predictor.
Banyak faktor yang dapat mempengaruhi prediksi. Ketidakpastian ini disertakan dengan mengasumsikan nilai acak kecil ditambahkan pada titik data di garis regresi. Inilah yang disebut noise.
Gambar di atas adalah distribusi noisenya
Jika masih penasaran dengan cara kerja linear regression, video dibawah mungkin bisa membantu
from sklearn.linear_model import LinearRegression
Kemudian bikin objek
lm = LinearRegression
Tentukan variabel prediktor dan target nya
X = df[['highway-mpg']]
Y = df['price']
Kemudian fit the model
lm.fit(X,Y)
Sekarang kita bisa memperoleh prediksi
Yhat = lm.predict(new_predictor)
\(a\) dan \(b\) dapat diakses sebagai atribut.
Z = df[['horsepower', 'curb-weight', 'engine-size', 'highway-mpg']]
lm.fit(Z, df['price'])
Yhat = lm.predict(new_predictor)
Kenapa pakai regression plot?. Karena bisa memberi estimasi yang bagus pada:
Regression plot dapat menampilkan kombinasi dari scatter plot dan garis regresi linear yang sudah dilatih. Garis regresi linear merepresentasikan nilai yang diprediksi.
Cara menggunakannya
import seaborn as sns
sns.regplot(x="highway-mpg", y="price", data=df)
Residual plot merepresentasikan error antara nilai aktualnya.
Kurangkan nilai actualnya dengan nilai predicted-nya sehingga dapat nilai error. Kemudian plot kembali hasilnya.
Hasil yang diinginkan adalah plot nya (titik-titiknya) tersebar secara random disekitar sumbu x.
Ini berarti linear modelnya bagus.
Disini plotnya membentuk kurva, tidak tersebar secara random. Mungkin lebih baik menggunakan nonlinear model.
Disini variance dari residualnya meningkat dengan x. Maka model nya salah
import seaborn as sns
sns.residplot(df['highway-mpg'], df['price'])
Distribution plot menghitung nilai actual versus nilai predicted.
import seaborn as sns
ax1 = sns.distplot(df['price'], hist=False, color="r", label='Actual value')
sns.distplot(Yhat, hist=False, color='b', label='Fitted Values', ax=ax1)
Bagaimana jika linear regression bukan model yang tepat. Kita ubah data kita menjadi polinomial (suku banyak) kemudian gunakan linear regression untuk melatih parameter
Polynomial regression berguna untuk relasi yang berbentuk kurva (curvilinier relationship). Curvilinier relationship didapat dari mengkuadratkan atau menetapkan derajat suku tinggi ke variabel prediktor. Berarti harus transforming data.
Walaupun variabel prediktor dari Polynomial Regression tidak linear, hubungan antara parameter atau koefisien nya tetap linear.
Menghitung polynomial derajat 3
f = np.polyfit(x,y,3)
p = np.polyfit(f)
Dimensi banyak
\[\hat{Y} = b_0 + b_1 X_1 + b_2 X_2 + b_3 X_1 X_2 + b_4 (X_1)^2 + b_5(X_2)^2 + \dots\]from sklearn.preprocessing import PolynomialFeatures
pr = PolynomialFeatures(degree=2, include_bias=False)
x_polly = pr.fit_transform(x[['horsepower', 'curb-weight']])
Semakin besar dimensinya (variabel yang digunakan), kita mungkin mau menormalisasikan fitur-fitur (variabel) nya sekaligus.
from sklearn.preprocessing import StandardScaler
scale = StandardScaler()
scale.fit(x_data[['horsepower', 'highway-mpg']])
x_scale = scale.transform(x_data[['horsepower', 'highway-mpg']])
Pipeline digunakan untuk menyederhanakan proses
from sklearn.preprocessing import PolynomialFeatures, StandardScaler
from sklearn.linear_model import LinearRegression
from sklearn.pipeline import Pipeline
# buat list of tuple
# elemen pertama adalah namanya
# elemen kedua adalah constructornya
input = [('scale', StandardScaler()), ('polynomial', PolynomialFeatures(degree=2)), ..., ('model', LinearRegression())]
#pipline constructor
pipe = Pipeline(input)
# we can train the pipeline object
pipe.train(x[['horsepower', 'highway-mpg', 'curb-weight', 'engine-size']], y)
yhat = pipe.predict(X[['horsepower', 'highway-mpg', 'curb-weight', 'engine-size']])
Metode ini menormalisasi data, transformasi polinomial, dan menghasilkan prediksi.
Pengukuran ini adalah salah satu cara untuk mengukur secara numerik seberapa bagus modelnya untuk dataset. Ada dua metrik pengukur penting:
Langkahnya:
from sklearn.metrics import mean_squared_error
mean_squared_error(df['price'], Y_predict_simple_fit)
Disebut juga Coefficient of Determination adalah pengukuran untuk menentukan seberapa dekat data dengan garis regresi.
\[R^2=1-\frac{MSE\ of\ regression\ line}{MSE\ of\ the\ average\ of\ the\ data}\]1 artinya bagus, 0 jelek
R-Squared di python dapat diakses dari atribut score
model object setelah di fit
Prediksi bisa dilakukan dengan memasukkan nilai X yang mau diprediksi ke dalam method predict
yhat=lm.predict(new_input)
Supaya tau model ini adalah best fit, lihat:
Evaluasi model dibutuhkan untuk mengukur akurasi. Akurasi model dapat ditingkatkan dengan banyak metode.
Buka hands-on model evaluation di github atau langsung buka di colab