Penerapan Data Science pada Marketing (Customer Churn Prediction-Python) - Part 2

Hafiz Ma'ruf
7 min readOct 11, 2020

--

Melanjutkan dari pembahasan sebelumnya, kali ini masih dengan kasus yang sama namun dengan percobaan menggunakan 2 metode lain untuk klasifikasi, yaitu Random Forest dan XGBoost.

Random Forest

Model machine learning yang akan kita bandingkan pertama yaitu Random Forest. Menurut Breiman dalam artikelnya yang berjudul “Random Forest”, menyebutkan:

Random forests are a combination of tree predictors such that each tree depends on the values of a random vector sampled independently and with the same distribution for all trees in the forest.

Sehingga dapat dianalogikan Random Forest sebagai gabungan dari Decision Tree. Jumlah decision tree akan mempengaruhi akurasi random forest secara keseluruhan. Bila divisualisasikan, maka Random Forest akan terbentuk seperti gambar berikut ini:

Selanjutnya kita terapkan kembali pada jupyter notebook. Masih menggunakan library sklearn, namun kali ini kita importRandomForestClassifier().

from sklearn.ensemble import RandomForestClassifier
#Latih model dengan RandomForestClassifier()
rdf_model = RandomForestClassifier().fit(x_train, y_train)
print(rdf_model)
  1. Performa Model pada Data Train

Setelah model dibuat, maka lakukan perhitungan untuk memperoleh classification report dan confusion matrix dari data train dengan source code dan hasil di bawah ini. Gunakan classification_report() & confusion_matrix().

#Menampilkan hasil training dengan confusion matrix
from sklearn.metrics import classification_report
# Predict
y_train_pred = rdf_model.predict(x_train)
# Print classification report
print('Classification Report Training Model (Random Forest) :')
print(classification_report(y_train, y_train_pred))
#Menampilkan hasil training model dengan visualisasi heatmap dari confusion matrix 
confusion_matrix_df = pd.DataFrame((confusion_matrix(y_train, y_train_pred)), ('No churn', 'Churn'), ('No churn', 'Churn'))

# Plot confusion matrix
plt.figure()
heatmap = sns.heatmap(confusion_matrix_df, annot=True, annot_kws={'size': 14}, fmt='d', cmap='YlGnBu')
heatmap.yaxis.set_ticklabels(heatmap.yaxis.get_ticklabels(), rotation=0, ha='right', fontsize=14)
heatmap.xaxis.set_ticklabels(heatmap.xaxis.get_ticklabels(), rotation=0, ha='right', fontsize=14)

plt.title('Confusion Matrix untuk Training Model\n(Random Forest)', fontsize=18, color='darkblue')
plt.ylabel('True label', fontsize=14)
plt.xlabel('Predicted label', fontsize=14)
plt.show()
  • Dari data training dapat dilihat bahwa model mampu memprediksi data dengan tingkat akurasi sempurna 100%, dengan detail prediksi Churn yang sebenarnya Churn adalah 1276, prediksi tidak Churn yang sebenarnya tidak Churn adalah 3568, prediksi tidak Churn yang sebenarnya Churn adalah 14 dan prediksi churn yang sebenarnya tidak churn adalah 7.

2. Performa Model pada Data Test

Lakukan perhitungan untuk memperoleh classification report dan confusion matrix juga pada data test dengan source code dan hasil di bawah ini. Gunakan classification_report() & confusion_matrix().

#Menampilkan hasil testing model dengan confusion matrix # Predict y_test_pred = rdf_model.predict(x_test) # Print classification report print('Classification Report Testing Model (Random Forest):') print(classification_report(y_test, y_test_pred))
#Menampilkan hasil testing model dengan visualisasi heatmap dari confusion matrix 
confusion_matrix_df = pd.DataFrame((confusion_matrix(y_test, y_test_pred)), ('No churn', 'Churn'), ('No churn', 'Churn'))

# Plot confusion matrix
plt.figure()
heatmap = sns.heatmap(confusion_matrix_df, annot=True, annot_kws={'size': 14}, fmt='d', cmap='YlGnBu')
heatmap.yaxis.set_ticklabels(heatmap.yaxis.get_ticklabels(), rotation=0, ha='right', fontsize=14)
heatmap.xaxis.set_ticklabels(heatmap.xaxis.get_ticklabels(), rotation=0, ha='right', fontsize=14)

plt.title('Confusion Matrix untuk Testing Model\n(Random Forest)\n', fontsize=18, color='darkblue')
plt.ylabel('True label', fontsize=14)
plt.xlabel('Predicted label', fontsize=14)
plt.show()
  • Dari data testing dapat dilihat bahwa model mampu memprediksi data dengan tingkat akurasi sebesar 78%, dengan detail prediksi Churn yang sebenarnya churn adalah 263, prediksi tidak Churn yang sebenarnya tidak Churn adalah 1356, prediksi tidak churn yang sebenarnya Churn adalah 283 dan prediksi Churn yang sebenarnya tidak Churn adalah 183.

XGBoost

XGBoost merupakan akronim dari eXtreme Gradient Boosting. Seperti yang dijelaskan oleh Tianqi Chen:

The name XGBoost, though, actually refers to the engineering goal to push the limit of computations resources for boosted tree algorithms. Which is the reason why many people use XGBoost.

Dengan XGBoost, model yang dibangun dapat mengoptimalkan sumber daya komputasi berdasarkan algoritma tree. XGBoost digunakan pada kasus ini juga karena:

  1. Execution Speed (Memory Efficient)
  2. Model Performance ( High Accuracy )

Selanjutnya, untuk menggunakan algoritma GradientBoosting, kita dapat import dari module sklearn.ensemble. Cukup gunakan function GradientBoostingClassifier() untuk melakukan training data.

from sklearn.ensemble import GradientBoostingClassifier
#Latih model dengan GradientBoostingClassifier()
gbt_model = GradientBoostingClassifier().fit(x_train, y_train)
print(gbt_model)
  1. Performa Model pada Data Train
#Menampilkan hasil training dengan confusion matrix
from sklearn.metrics import classification_report
# Predict
y_train_pred = gbt_model.predict(x_train)
# Print classification report
print('Classification Report Training Model (Gradien Boosting) :')
print(classification_report(y_train, y_train_pred))
#Menampilkan hasil training model dengan visualisasi heatmap dari confusion matrix 
confusion_matrix_df = pd.DataFrame((confusion_matrix(y_train, y_train_pred)), ('No churn', 'Churn'), ('No churn', 'Churn'))

# Plot confusion matrix
plt.figure()
heatmap = sns.heatmap(confusion_matrix_df, annot=True, annot_kws={'size': 14}, fmt='d', cmap='YlGnBu')
heatmap.yaxis.set_ticklabels(heatmap.yaxis.get_ticklabels(), rotation=0, ha='right', fontsize=14)
heatmap.xaxis.set_ticklabels(heatmap.xaxis.get_ticklabels(), rotation=0, ha='right', fontsize=14)

plt.title('Confusion Matrix untuk Training Model\n(Gradient Boosting)', fontsize=18, color='darkblue')
plt.ylabel('True label', fontsize=14)
plt.xlabel('Predicted label', fontsize=14)
plt.show()
  • Dari data training dapat dilihat bahwa model mampu memprediksi data dengan tingkat akurasi 82%, dengan detail prediksi Churn yang sebenarnya Churn adalah 684, prediksi tidak Churn yang sebenarnya tidak Churn adalah 3286, prediksi tidak Churn yang sebenarnya Churn adalah 606 dan prediksi churn yang sebenarnya tidak churn adalah 289.

2. Performa Model pada Data Test

#Menampilkan hasil testing model dengan confusion matrix # Predict y_test_pred = gbt_model.predict(x_test) 
# Print classification report
print('Classification Report Testing Model (Gradient Boosting):') print(classification_report(y_test, y_test_pred))
#Menampilkan hasil testing model dengan visualisasi heatmap dari confusion matrix 
confusion_matrix_df = pd.DataFrame((confusion_matrix(y_test, y_test_pred)), ('No churn', 'Churn'), ('No churn', 'Churn'))

# Plot confusion matrix
plt.figure()
heatmap = sns.heatmap(confusion_matrix_df, annot=True, annot_kws={'size': 14}, fmt='d', cmap='YlGnBu')
heatmap.yaxis.set_ticklabels(heatmap.yaxis.get_ticklabels(), rotation=0, ha='right', fontsize=14)
heatmap.xaxis.set_ticklabels(heatmap.xaxis.get_ticklabels(), rotation=0, ha='right', fontsize=14)

plt.title('Confusion Matrix untuk Testing Model\n(Gradient Boosting)\n', fontsize=18, color='darkblue')
plt.ylabel('True label', fontsize=14)
plt.xlabel('Predicted label', fontsize=14)
plt.show()
  • Dari data testing dapat dilihat bahwa model mampu memprediksi data dengan tingkat akurasi sebesar 79%, dengan detail prediksi Churn yang sebenarnya churn adalah 261, prediksi tidak Churn yang sebenarnya tidak Churn adalah 1395, prediksi tidak churn yang sebenarnya Churn adalah 285 dan prediksi Churn yang sebenarnya tidak Churn adalah 144.

Menentukan Algoritma Model Terbaik

Model yang baik adalah model yang mampu memberikan performa bagus di fase training dan testing model. Sehingga dapat disimpulkan model yang terbaik dari ketiga model di atas adalah model dengan metode logistic regression (log_model). Ada beberapa terminologi yang sering muncul ketika membahas bagaimana model yang baik, di antaranya:

  • Over-Fitting — suatu kondisi dimana model mampu memprediksi dengan sangat baik di fase training, akan tetapi tidak mampu memprediksi sama baiknya di fase testing.
  • Under-Fitting — suatu kondisi dimana model kurang mampu memprediksi dengan baik di fase training, akan tetapi mampu memprediksi dengan baik di fase testing.
  • Appropriate-Fitting — suatu kondisi dimana model mampu memprediksi dengan baik di fase training maupun di fase testing.

Untuk lebih jelas memahaminya, perhatikan bentuk visual dari ketiga terminologi tersebut seperti gambar di bawah ini:

Setelah menentukan model algoritma terbaik dari beberapa percobaan model yang sudah dilakukan (Appropriate-Fitting), kemudian kita dapat simpan model tersebut sebagai file best_model_churn.pkl dengan tujuan untuk deployment model nantinya kita tidak perlu mengulang lagi pemodelan, cukup memanggil file tersebut saja. Simpan di file direktori sesuai dataset berada, kemudian check apakah file tersebut benar tersimpan atau tidak. Gunakan dump() dari pickle untuk menyimpan file model.

#Save Model log_model (Logistic Regression) sebagai model terbaik pickle.dump(log_model, open('best_model_churn.pkl', 'wb'))

Kesimpulan

Berdasarkan pemodelan yang telah dilakukan dengan menggunakan Logistic Regression, Random Forest dan Extreme Gradiant Boost, maka dapat disimpulkan untuk memprediksi Churn dari pelanggan telco dengan menggunakan dataset ini model terbaiknya adalah menggunakan algortima Logistic Regression. Hal ini dikarenakan performa dari model Logistic Regression cenderung mampu memprediksi sama baiknya di fase training maupun testing (akurasi training 80%, akurasi testing 79%), dilain sisi algoritma lainnya cenderung Over-Fitting performanya. Akan tetapi hal ini tidak menjadikan kita untuk menarik kesimpulan bahwsannya jika untuk melakukan pemodelan apapun maka digunakan Logistic Regression, kita tetap harus melakukan banyak percobaan model untuk menentukan mana yang terbaik.

Pembahasan kali ini cukup sampai di sini, mungkin ke depannya saya akan kembangkan kembali sampai pada tahap model deployment. Semua dokumen pendukung pada artikel ini saya tersedia di repository github saya. Semoga bermanfaat :)

--

--