کاربرد های یادگیری ماشین در بازاریابی: محاسبه شانس بازگشت مشتری-بخش دوم

در بخش اول ما در مورد سه فاز اول مهندسی یادگیری ماشین در مورد مساله محاسبه نرخ بازگشت مشتری صحبت کردیم که از اینجا می تونید مطالعش کنید. حالا ادامه فازها رو میریم.4- انتخاب فیچرهاحال در مورد فاز چهارم صحبت می کنیم که انتخاب فیچر هاست. از این بعد از پایتون استفاده می کنیم. اول از همه کتابخونه های لازم و دیتای مورد نظر رو ایمپورت می کنیم.import pandas as pd import numpy as np import matplotlib.pyplot as plt %matplotlib inlineحتلحالا دیتای مورد نظر رو ایمپورت می کنیم و یه نگاهی هم بهش میندازیم:telecom_data=pd.read_csv(&quotTelco-Customer.csv&quot) telecom_data.head()خوب شکل بالا نشون میده که ما 21 ستون داریم که بهتر ببینیم لیستشون چیه و شکل داده های هر کدوم به چه صورته.telecom_data.dtypesخوب خروجی این کد به صورت شکل زیره و نشون میده که کلی از داده های ما به صورت داده های غیر عددی هستند و ما باید داده ها رو ترنسفرم کنیم تا بتونیم برای الگوریتم های طبقه بندی استفادش کنیم. البته باید در نظر داشته باشیم بعضی الگوریتم ها می تونند داده های غیر عددی هم قبول کنند ولی خوب ما ترنسفرم رو انجام میدیم تا مطمئن بشیم از همه الگوریتم ها می تونیم استفاده کنیم. ولی قبل از اینکار ببینیم داده های گمشده داریم یا نه. telecom_data.isnull().sum()خوب همونطور که تو تصویر بالا می بینیم ما داده گمشده نداریم و پس اینجا مشکلی نداریم.خوب قبل از ترنسفرم داده ها باید ببنیم کدوم ستون های احتمالا تاثیری رو کار ما ندارند. بر اساس ماهیت داده ها customerID قابل حذفه من این ستون رو حذف می کنم.telecom_data=telecom_data.drop(&quotcustomerID&quot, axis=1)خوب حالا زمان ترنسفرم داده ها رسیده. ما برای ترنسفرم داده ها دو تا راه وجود داره. استفاده از:1- OridnalEncoder2-OneHotEncoderما زمانی از OrdinalEncoder استفاده می کنیم که داده های داخل یک بردار ویژگی ترتیبی باشند. مثل این حالت که داده ها شامل "خیلی خوب"، "خوب"، "متوسط"، "بد"، "خیلی بد" باشند یا مثلا "بزرگ" و "کوچک" باشند. برای این داده ها از OrdinalEncoder استفاده می کنیم و به کمکش ما میتونیم به هر مورد یک کد بدیم مثل بزرگ برابر با 1 و کوچک برابر با یک.وقتی داده های ما ترتیبی نیستند مثل "سبز"، "قرمز"، "سفید". اون موقع از OneHotEncoder استفاده می کنیم. در این حالت به ازای هر بردار ویژگی ممکنه چند بردار بوجود بیاد. مثلا شکل زیر رو درنظر بگیرید.تو این حالات بردار ویژگی Color به سه تا بردارد تبدیل شد که مثلا رنگ سبز کدش میشه [1،0،0]. در واقع هدف از این تبدیل اینه که الگوریتم اینطور فکر نکنه که رنگ ها نسبت به هم مقدم هستند و حالت ترتیبی دارند. ولی مشکل این روش اینه که اندازه ویژگی ها زیاد میشه و بعدا تحلیل خروجی مدل رو سخت می کنه.حالا ما باید داده هامون رو بررسی کنیم و ببینیم کدوم ترتیبی هستند و کدوم نیستند تا بتونیم از ترنسفرمر درست استفاده کنیم. اینجا ما برای راحتی کار همه رو اردینال در نظر می گیریم و از OrdinalEncoder استفاده می کنیم.اول باید کار ایمپورت رو انجام بدیم.from sklearn.preprocessing import OneHotEncoder, OrdinalEncoderحالا داده هامون رو تبدیل می کنیم.enc=OrdinalEncoder() enc.fit(telecom_data) telecom_data_transformed=pd.DataFrame(enc.transform(telecom_data)) telecom_data_transformed.columns=telecom_data.columns telecom_data_transformed.head()خروجی این داده ها به شکل زیره که حال دیگه هیچکدوم از داده هامون غیر عددی نیستند.مرحله بعد بررسی ماتریس همبستگی برای حذف داده های همبسته است. در مورد اینکه این موضوع به چه معنی هست و چطوری تو پایتون باید ازش استفاده کنیم تو مطلب زیر نوشتم. لطفا اون رو مطالعه کنید تا در موردش بیشتر بدونید. https://virgool.io/MelkRadar/%D9%BE%DB%8C%D8%B4-%D8%A8%DB%8C%D9%86%DB%8C-%D9%82%DB%8C%D9%85%D8%AA-%D9%85%D9%84%DA%A9-%D8%A8%D9%87-%DA%A9%D9%85%DA%A9-%DB%8C%D8%A7%D8%AF%DA%AF%DB%8C%D8%B1%DB%8C-%D9%85%D8%A7%D8%B4%DB%8C%D9%86-oyed72v4vbjs ما اینجا ماتریس همبستگی رو استفاده نمی کنیم و تمام فیچر ها رو نگه میداریم.5- مدلسازیخوب ما فاز انتخاب فیچرها رو گذروندیم و حالا می ریم مدلمون رو انتخاب کنیم. برای انتخاب مدل از شکل زیر استفاده می کنیم که می تونید تو مستندات مرتبط با Scikit Learn از اینجا به اون دسترسی داشته باشید.شکلخوب بر اساس شکل بالا ما باید مدل SVC رو انتخاب کنیم و اگر جواب خوبی نگرفتیم از KNeighbor Classifier و اگر بازم نتیجه نگرفتیم از Ensemble Classifier استفاده کنیم. خوب از SVC شروع کنیم.اول کتابخونه های لازم رو ایمپورت می کنیم.from sklearn.model_selection import train_test_split from sklearn import svmخوب بعد از این ما داده هامون رو آماده برای ورود به مدل می کنیم. اول هسته اعداد تصادفی رو ثابت کنید تا شما هم نتیجه مشابه من داشته باشید و بهتر بتونیم با هم بررسی رو انجام بدیم. بعد X رو تعریف می کنیم که شامل تمام داده ها به جز ستون تارگت ما که همون ستون "Churn"میشه. بعد y رو تعریف می کنیم که شامل ستون تارگت ما میشه. حالا داده ها رو به دودسته test و train تقسیم می کنیم و سایز داده های تستمون 20 درصد کل داده هاست.حالا دیگه همه چیز آماده مدل سازی هستش و مدل SVC رو آموزش میدیم. و در پایان هم یه ارزیابی از مدل ساخته شده بر روی داده های تستمون داریم. خروجی این مورد برابر 0.73 هستش که نشون دهنده دقت(َaccuracy) هستش که تو بخش اول این مقاله در موردش صحبت کردیم. np.random.seed(64) X=telecom_data_transformed.drop(&quotChurn&quot, axis=1) y=telecom_data_transformed[&quotChurn&quot] X_train, X_test, y_train, y_test=train_test_split(X, y, test_size=0.2) clf=svm.SVC() clf.fit(X_train, y_train) clf.score(X_test, y_test) >>>>0.7331440738112136خوب حال باید بررسی کنیم که عدد 0.75 عدد قابل قبولی هست یانه. به نظر من بهتره از یه روشن Ensemle هم استفاده کنیم. من الگوریتم Random Forest رو انتخاب می کنم.from sklearn.ensemble import RandomForestClassifier np.random.seed(64) clf = RandomForestClassifier() clf.fit(X_train, y_train) clf.score(X_test, y_test) >>>>>0.7806955287437899خوب عملکرد الگوریتم بهتر شده و به 78 رصد ارتقا پیدا کرد.6- آزمایشحالا که به مدل نهاییمون رسیدم می تونیم این مدل رو برای داده های جدید تست کنیم و بر همین اساس بفهمیم که کدم مشتری قرار از سیستم خارج بشه یا نه مثلا برای یکی از مشتری های داده ها فعلی از این موضوع استفاده می کنیم.clf.predict(X.iloc[[20]]) >>>>array([1.])بر اساس کد بالا ما از مدل خواستیم که بازگشت مشتری در اندیس 20 رو پیش بینی کنه و این مدل پیش بینی کرده که این مشتری برمیگرده و دوباره خرید می کنه. پس به این ترتیب ما می تونیم بازگشت هر مشتری رو پیش بینی کنیم و اگر مدل به ما گفت که این مشتری برنمی گرده ما برای اون فرایند های پروموشنی ویژه تعیین کنیم تا بتونیم اون رو برگردونیم.