Python : Prediksi Value dengan Machine Learning



Berikut adalah contoh program sederhana prediksi harga rumah menggunakan python. Library yang dipakai adalah panda, numpy dan scikit.

Dikarenakan tidak tersedia data penjualan rumah, maka pada catatan ini diandaikan kita memilik data penjualan rumah dengan field seperti berikut:

luas_tanah, luas_bangunan, kamar_tidur, kamar_mandi, tipe_garasi, nama_jalan, no_rumah, kodepos, kota

Kita load data penjualan rumah diatas, dengan asumsi file adalah tipe csv dengan menggunakan library panda.

df = pd.read_csv("nama_file_data_set.csv")

Lalu seperti yang sudah kita bahas sebelumnya, tidak semua field (feature) dari data penjualan rumah diperlukan oleh model. Maka akan kita hapus.

del df['nama_jalan']
del df['no_rumah']
del df['kodepos']

Seperti sudah dibahas di artikel feature engineering, tipe data string tidak dipahami oleh model yang akan kita training, maka digunakan one-hot coding untuk data tipe_garasi dan kota.

Panda sudah menyediakan fungsi yang sangat mudah digunakan untuk melakukan itu

features_df = pd.get_dummies(df, columns=['tipe_garasi', 'kota'])

Berikutnya jangan lupa menghapus data harga jual, karena ini adalah nilai yang akan dicari (Y).

del features_df['harga_jual']

Lalu kita buat array X dan y (X untuk matriks data features, y untuk data nilai yang dicari). Disini diubah menjadi matrix data array dari numpy, karena scikit menerima data dalam type array numpy.

X = features_df.as_matrix()
y = df['harga_jual'].as_matrix()

Berikutnya adalah memastikan data training kita random, dan membagi menjadi 2 dataset, training dan testing (biasanya 70 : 30)

Untuk membuat data menjadi random, sudah ada fungsi dari scikit

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)

Berikutnya adalah membuat model. Model akan menggunakan gradient boosting regressor dari scikit. Kemudian save model.

Yang perlu dilakukan adalah mengisi hyperparameters dari model, dan melakukan tuning agar model akurat dalam melakukan prediksi.

model = ensemble.GradientBoostingRegressor(
    n_estimators=1000,
    learning_rate=0.1,
    max_depth=6,
    min_sample_leaf=9,
    max_features=0.1
    loss='hubber'
)
model.fit(X_train, y_train)

joblib.dump.(model, 'nama_file.pkl')

  • n_estimators: berapa decision tree yang akan dibuat, makin besar, makin akurat, namun proses training akan makin lama.
  • learning_rate: mengatur seberapa influence dari setiap decision tree terhadap total prediksi. Makin rendah makin akurat jika angka n_estimators besar. Defaultnya adalah 0.1.
  • max_depth: berapa layer kedalaman per decision tree.
  • min_sample_leaf: mengatur berapa kali sebuah value (pada data training set) muncul agar dapat digunakan sebagai patokan untuk membuat decision tree. Pada contoh diisi 9, berarti minimal 9 rumah harus memiliki karakteristik yang sama baru nilainya dapat digunakan sebagai patokan untuk membuat decision tree. Parameter ini akan mengurangi pengaruhi outliers pada model.
  • max_features: persentase dari features pada model yang kita pilih secara random setiap kita membuat cabang decision tree.
  • loss: mengatur model error rate atau cost. Hubber cocok digunakan karena tidak terlalu dipengaruhi oleh data outlier. 
Setelah kita melatih model dan menyimpannya menjadi file agar bisa digunakan. Pengukuran seberapa akurat model juga perlu dilakukan.

Mean absolute error adalah cara untuk melihat seberapa akurat model kita. Dengan menggunakan fungsi mse dari scikit, kita akan mengetahui rata-rata error kesalahan dari prediksi yang dihasilkan model.

mse = mean_absolute_error(y_train, model.predict(X_train))
mse = mean_absolute_error(y_test, model.predict(X_test))




import panda as pd
import numpy
from sklearn.model_selection import train_test_split
from sklearn import ensemble

df = pd.read_csv("nama_file_data_set.csv")

del df["no_rumah"]
del df["nama_jalan"]
del df["kodepos"]

features_df = pd.get_dummies(df, columns=['tipe_garasi', 'kota'])

del features_df['harga_jual']

X = features_df.as_matrix()
y = df['harga_jual'].as_matrix()

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)

model = ensemble.GradientBoostingRegressor(
    n_estimators=1000,
    learning_rate=0.1,
    max_depth=6,
    min_sample_leaf=9,
    max_features=0.1
    loss='hubber'
)
model.fit(X_train, y_train)

joblib.dump.(model, 'nama_file.pkl')

mse = mean_absolute_error(y_train, model.predict(X_train))

mse = mean_absolute_error(y_test, model.predict(X_test))


Menggunakan Model
Model yang sudah dibuat dapat digunakan dengan perintah joblib.load.  kita pasing feature rumah yang akan diprediksi, harus sama urutannya dengan urutan feature training model.

Scikit memerlukan input array of array of features, jika hanya satu, kita cukup passing 1 array saja.

Untuk memprediksi, gunakan fungsi model.predict(array of array of features).


from sklearn.externals import joblib

model = joblib.load('nama_model.pkl')

house_to_value = [feature yang digunakan, harus sama urutan dengan training]
homes_to_value = [house_to_value]

predicted_home_values = model.predict(homes_to_value)
predicted_value = predicted_home_values[0]

print("Harga prediksi rumah berkisar ${:,.2f}".format(predicted_value))


Data Baru, Update Model
Bila data dilapangan berubah, maka model harus di training ulang. Program tidak perlu ada yang diubah. Hal yang perlu diperhatikan adalah, setelah dilakukan training, bagaimana dengan nila mean absolute error.


Python : Prediksi Value dengan Machine Learning Python : Prediksi Value dengan Machine Learning Reviewed by noname needed on May 24, 2018 Rating: 5

1 comment:

  1. Kenapa punya saya muncul error seperti ini
    __init__() got an unexpected keyword argument 'min_sample_leaf'

    ReplyDelete

Powered by Blogger.