Telephone Technical Support Expired

Multi-Classification Model

To build our model, we will follow the steps in the previous articles. But for improving it further, we’ll do Hyperparameter Tuning.

Programmatically, we will find out what are the best parameters for our model to make it provide the best accuracy.

Let’s start with coding our model first:

xgb_model = xgb.XGBClassifier().fit(X_train, y_train)print('Accuracy of XGB classifier on training set: {:.2f}'       .format(xgb_model.score(X_train, y_train)))print('Accuracy of XGB classifier on test set: {:.2f}'       .format(xgb_model.score(X_test, y_test)))

In this version, our accuracy on the test set is 58%:

XGBClassifier has many parameters. You can find the list of them here. For this example, we will select max_depth and min_child_weight.

The code below will generate the best values for these parameters:

from sklearn.model_selection import GridSearchCVparam_test1 = { 'max_depth':range(3,10,2), 'min_child_weight':range(1,6,2)}gsearch1 = GridSearchCV(estimator = xgb.XGBClassifier(), param_grid = param_test1, scoring='accuracy',n_jobs=-1,iid=False, cv=2)gsearch1.fit(X_train,y_train)gsearch1.best_params_, gsearch1.best_score_

The algorithm says the best values are 3 and 5 for max_depth and min_child_weight respectively. Check out how it improves accuracy:

Our score increased from 58% to 62%. It is quite an improvement.

Knowing the next purchase day is a good indicator for predicting sales as well. We will be doing a deep dive on this topic in Part 6.

You can find the Jupyter Notebook for this article here.

Data Wrangling

Let’s start with importing our data and do the preliminary data work:

Importing CSV file and date field transformation

We have imported the CSV file, converted the date field from string to DateTime to make it workable and filtered out countries other than the UK.

To build our model, we should split our data into two parts:

Data structure for training the model

We use six months of behavioral data to predict customers’ first purchase date in the next three months. If there is no purchase, we will predict that too. Let’s assume our cut off date is Sep 9th ’11 and split the data:

tx_6m = tx_uk.reset_index(drop=True)tx_next = tx_uk[(tx_uk.InvoiceDate >= date(2011,9,1)) & (tx_uk.InvoiceDate 

tx_6m represents the six months performance whereas we will use tx_next for the find out the days between the last purchase date in tx_6m and the first one in tx_next.

Also, we will create a dataframe called tx_user to possess a user-level feature set for the prediction model:

tx_user = pd.DataFrame(tx_6m.unique())tx_user.columns = 

By using the data in tx_next, we need the calculate our label (days between last purchase before cut off date and first purchase after that):

Now, tx_user looks like below:

As you can easily notice, we have NaN values because those customers haven’t made any purchase yet. We fill NaN with 999 to quickly identify them later.

Можно ли отличить восстановленный Айфон от нового по IMEI

iPhoneimei.info

Зайдите на сайт и введите IMEI гаджета в единственное окошко, потом нажмите на серебристую кнопку со стрелкой.

После минутного ожидания вам будут доступны такие сведения:

По этой информации можно сделать следующие выводы:

  • Если цвет, определенный сервисом, не сходится с фактическим цветом гаджета, это признак замены корпуса. Очевидно, что смартфон побывал в ремонте.
  • На новых телефонах Apple функция «Find My iPhone» («Найти iPhone») деактивирована – стоит статус «Off». Статус «On» — признак «как нового» смартфона.
  • Если напротив «Telephone Technical Support» («Телефонная техническая поддержка») и «Repairs & Service Coverage» («Гарантийное обслуживание») значится «Expired» («Истекло»), понятно, что телефон не новый.

Информативность программы iPhone IMEI сильно сократилась за последнее время – прежде можно было узнать, например, дату активации гаджета, что тоже позволяло судить о новизне аппарата. Однако и наличествующих признаков вполне достаточно, чтобы довольно точно вычислять Refurbished iPhone по IMEI.

Imeidata.net

Принцип действия иностранного сервиса тот же: сначала вам нужно ввести IMEI, затем кликом подтвердить, что вы «не робот», и заключительным действием нажать кнопку «Check».

Результат будет таким:

Кажется, будто данных больше, чем предоставлял предыдущий сервис, но это заблуждение – на самом деле их меньше: почти все полезные данные приходится получать путем дополнительных проверок («Free Check Now»). Для них нужна регистрация.

Оба сервиса позволяют однократно провести бесплатную проверку «Blacklist» — то есть уточнить, не является ли гаджет потерянным или украденным.

Правда, сильно верить данным, полученным таким способом, не стоит – проверка проводится в основном среди западных операторов мобильной связи.

Можно ли отличить новый Айфон от восстановленного по серийному номеру и номеру модели

Очень легко вычислить восстановленное устройство по номеру модели – на рисунке выше этот номер находится перед сокращением RFB. При отсутствии коробки узнать номер модели можно через настройки гаджета (путь «Настройки» — «Основные» — «Об этом устройстве»).

Если номер модели начинается с литеры M, значит, гаджет новый, предназначенный для розничной реализации, если первая литера номера – F, перед вами Refurbished iPhone.

Бывают номера модели, начинающиеся с P, но такие присваиваются только гаджетам, изготовленным по индивидуальным заказам. Два последних символа перед слэшем в номере модели указывают на страну реализации – в нашем примере значится RU, следовательно, телефон предназначен для продажи в России (так и должно быть). Если вместо RU стоит, например, LL (отметка для США), покупателю стоит отнестись к товару с недоверием и уточнить у продавца, как сложилась такая ситуация.

Для устройств, выпущенных до iPhone 5, актуально такое правило: если серийный номер начинается с 5, то iPhone восстановленный. Ранее серийные номера состояли из 11 символов и всегда начинались с цифры, которая и выдавала бывшие в ремонте гаджеты. Последующие цифры номера позволяли судить, в каком месяце и году был произведен Айфон.

Сейчас серийные номера включают 12 символов и могут начинаться и с буквы (как в нашем примере). Правило первого символа на настоящий момент уже неактуально, и проверить по содержанию серийного номера, является ли iPhone восстановленным, не получится.

Feature Engineering

For this project, we have selected our feature candidates like below:

  • RFM scores & clusters
  • Days between the last three purchases
  • Mean & standard deviation of the difference between purchases in days

After adding these features, we need to deal with the categorical features by applying get_dummies method.

For RFM, to not repeat Part 2, we share the code block and move forward:

RFM Scores & Clustering

Let’s focus on how we can add the next two features. We will be using shift() method a lot in this part.

First, we create a dataframe with Customer ID and Invoice Day (not datetime). Then we will remove the duplicates since customers can do multiple purchases in a day and difference will become 0 for those.

#create a dataframe with CustomerID and Invoice Datetx_day_order = tx_6m]#convert Invoice Datetime to daytx_day_order = tx_6m.dt.datetx_day_order = tx_day_order.sort_values()#drop duplicatestx_day_order = tx_day_order.drop_duplicates(subset=,keep='first')

Next, by using shift, we create new columns with the dates of last 3 purchases and see how our dataframe looks like:

#shifting last 3 purchase datestx_day_order = tx_day_order.groupby('CustomerID').shift(1)tx_day_order = tx_day_order.groupby('CustomerID').shift(2)tx_day_order = tx_day_order.groupby('CustomerID').shift(3)

Output:

Let’s begin calculating the difference in days for each invoice date:

tx_day_order = (tx_day_order - tx_day_order).dt.daystx_day_order = (tx_day_order - tx_day_order).dt.daystx_day_order = (tx_day_order - tx_day_order).dt.days

Output:

For each customer ID, we utilize .agg() method to find out the mean and standard deviation of the difference between purchases in days:

tx_day_diff = tx_day_order.groupby('CustomerID').agg({'DayDiff': }).reset_index()tx_day_diff.columns = 

Now we are going to make a tough decision. The calculation above is quite useful for customers who have many purchases. But we can’t say the same for the ones with 1–2 purchases. For instance, it is too early to tag a customer as frequent who has only 2 purchases but back to back.

We only keep customers who have > 3 purchases by using the following line:

tx_day_order_last = tx_day_order.drop_duplicates(subset=,keep='last')

Finally, we drop NA values, merge new dataframes with tx_user and apply .get_dummies() for converting categorical values:

tx_day_order_last = tx_day_order_last.dropna()tx_day_order_last = pd.merge(tx_day_order_last, tx_day_diff, on='CustomerID')tx_user = pd.merge(tx_user, tx_day_order_last], on='CustomerID')#create tx_class as a copy of tx_user before applying get_dummiestx_class = tx_user.copy()tx_class = pd.get_dummies(tx_class)

Selecting a Machine Learning Model

Before jumping into choosing the model, we need to take two actions. First, we need to identify the classes in our label. Generally, percentiles give the right for that. Let’s use .describe() method to see them in NextPurchaseDay:

Deciding the boundaries is a question for both statistics and business needs. It should make sense in terms of the first one and be easy to take action and communicate. Considering these two, we will have three classes:

  • 0–20: Customers that will purchase in 0–20 days — Class name: 2
  • 21–49: Customers that will purchase in 21–49 days — Class name: 1
  • ≥ 50: Customers that will purchase in more than 50 days — Class name: 0
tx_class = 2tx_class.loc = 1tx_class.loc = 0

The last step is to see the correlation between our features and label. The correlation matrix is one of the cleanest ways to show this:

corr = tx_class.corr()plt.figure(figsize = (30,20))sns.heatmap(corr, annot = True, linewidths=0.2, fmt=".2f")

Looks like Overall Score has the highest positive correlation (0.45) and Recency has the highest negative (-0.54).

For this particular problem, we want to use the model which gives the highest accuracy. Let’s split train and test tests and measure the accuracy of different models:

Selecting the ML model for the best accuracy

Accuracy per each model:

From this result, we see that Naive Bayes is the best performing one (~64% accuracy). But before that, let’s look at what we did exactly. We applied a fundamental concept in Machine Learning, which is Cross Validation.

How can we be sure of the stability of our machine learning model across different datasets? Also, what if there is a noise in the test set we selected.

Cross Validation is a way of measuring this. It provides the score of the model by selecting different test sets. If the deviation is low, it means the model is stable. In our case, the deviations between scores are acceptable (except Decision Tree Classifier).

Normally, we should go ahead with Naive Bayes. But for this example, let’s move forward with XGBoost to show how we can improve an existing model with some advanced techniques.

Заключение

Пока Refurbished iPhone не пользуются особой популярностью среди отечественных потребителей, и тому есть две причины: во-первых, многие из потребителей не имеют точного понятия, что кроется за термином Refurbished, и продолжают топорно классифицировать гаджеты на новые и б/у, во-вторых, скидка, которую дают ретейлеры, уж очень незначительна – например, в «Связном» покупатель «восстановленного» Айфон сэкономит всего лишь 2-3 тысячи рублей.

У официальных дилеров даже «как новые» Айфоны имеют «кусачую» цену – это и заставляет потребителей связываться с сомнительными «дельцами»

При подобном сотрудничестве важно следовать приведенным в этой статье советам и уделить внимание проверке смартфона на оригинальность – о том, как проводить такую проверку, рассказано здесь

Ссылка на основную публикацию