В своей предыдущей статье я разместил несколько вводных по модели классификации (здесь и здесь). И на этот раз я решил использовать более бизнес-ориентированный подход к реализации логистической регрессии.

Набор данных, используемый в этой модели, можно скачать по этой ссылке. Он содержит функции мобильного телефона (оперативная память, размер и т. д.), каждая комбинация которых приводит к разным ценовым категориям.

Модель классификации для ценового диапазона мобильных телефонов

Обзор: Разработайте модель классификации для определения ценового диапазона на основе доступных функций.

Цели:

  1. Очистка данных и выбор функций
  2. Обучение и оценка модели
  3. Сохранить модель для будущего использования

Описание файла :

  1. train.csv : тренировочный набор. Особенности мобильного телефона в ценовом диапазоне
  2. test.csv : набор тестов. Для прогнозирования с использованием модели мы собираемся тренироваться, используя вышеуказанный набор данных поезда.

Поля данных:

  1. battery_power : Общая энергия, которую батарея может хранить за один раз, измеряется в мАч.
  2. синий : есть Bluetooth или нет
  3. clock_speed : скорость, с которой микропроцессор выполняет инструкции
  4. dual_sim : поддерживает две SIM-карты или нет.
  5. fc : Мегапиксели фронтальной камеры
  6. four_g : есть 4G или нет
  7. int_memory : внутренняя память в гигабайтах
  8. m_dep : Мобильная глубина в см
  9. mobile_wt : Вес мобильного телефона.
  10. n_cores : количество ядер процессора
  11. pc : Мегапиксели основной камеры
  12. px_height : высота разрешения в пикселях
  13. px_width : Ширина разрешения пикселей
  14. ram : Оперативная память в мегабайтах
  15. sc_h : высота экрана мобильного телефона в см.
  16. sc_w : Ширина экрана мобильного телефона в см.
  17. talk_time : максимальное время работы от одного заряда батареи, когда вы
  18. three_g : есть 3G или нет
  19. touch_screen : есть сенсорный экран или нет
  20. Wi-Fi : есть Wi-Fi или нет
  21. price_range: это целевая переменная со значением 0 (низкая стоимость), 1 (средняя стоимость), 2 (высокая стоимость) и 3 (очень высокая стоимость).

Методические рекомендации

В этой статье мы рассмотрим следующие шаги для разработки нашей модели:

  1. Подготовка данных, очистка и манипулирование
  2. Выбор функций и обучение модели
  3. Оценка модели и создание прогноза

1. Подготовка данных, очистка и манипулирование

#read train and test file
import numpy as np
import pandas as pd
file = []
def read_file(path) :
    name = input()
    name = pd.read_csv(path)
    file.append(name)
    
read_file('../input/mobile-price-classification/train.csv')
read_file('../input/mobile-price-classification/test.csv')
train = file[0]
test = file[1]
print('Train Size : ', train.shape[0], '\n')
print('Test Size : ', test.shape[0])

Набор данных для обучения и теста содержит 2000 и 1000 соответственно. Поскольку это небольшой набор данных, это сэкономит много оперативной памяти во время разработки модели.

Двигаясь вперед, мы проверим, есть ли в наборе данных нулевые и повторяющиеся значения. Затем мы удалим некоторые выбросы из нашего набора данных.

Выше приведена функция, которую я разрабатываю для проверки всех своих данных. Не стесняйтесь экспериментировать с этой функцией, и, возможно, в некоторых случаях вышеуказанной функции недостаточно.

check('null',train)
check('duplicate',train)
check('outlier', train)

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

Но поскольку функций слишком много, нам нужно выбрать столбцы с высокой корреляцией с нашей целевой переменной (price_range), прежде чем удалять какие-либо выбросы.

#Check Correlation Between Features and Target
for a in train.columns :
    try :
        print(f'Corr {a}: {train[a].corr(train["price_range"])}')
    except :
        pass

col_list = ['ram','px_height','px_width','battery_power']
#Outlier Removal 
for a in col_list: 
    q1 = train[a].quantile(0.25)
    q3 = train[a].quantile(0.75)
    iqr = q3-q1
    upper = q3 + 1.5*iqr
    lower = q1 - 1.5*iqr
    train = train[(train[a] > 0) & (train[a] < upper)]

Теперь наши данные готовы для обучения нашей модели машинного обучения.

2. Выбор функций и обучение модели

from sklearn.preprocessing import StandardScaler
from sklearn.compose import ColumnTransformer
from sklearn.pipeline import Pipeline
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
feature = ['ram','px_height','px_width','battery_power']
label = ['price_range']
X,y = train[feature].values, train[label].values
X_train, X_test, y_train, y_test = train_test_split(X,y, test_size = 0.25, random_state = 42)
#Define Preprocessing for Numeric Columns
num_features = [0,1,2,3]
num_transformer = Pipeline(steps = [
    ('scaler', StandardScaler())
])
preprocessor = ColumnTransformer(transformers = [
    ('num', num_transformer, num_features)
])
pipeline_lr = Pipeline(steps= [
    ('preprocessing', preprocessor),
    ('logregression', LogisticRegression(C=1/0.1, solver='lbfgs', multi_class = 'auto', max_iter = 10000))
])
model_lr = pipeline_lr.fit(X_train,y_train)
print(model_lr)

В приведенном выше коде уже перечислены все наши шаги от выбора функций для обучения и маркировки в качестве нашей целевой переменной, разделения нашего набора данных на обучение и тестирование.

Затем мы выполним процесс масштабирования, чтобы стандартизировать наши числовые значения в наборе данных.

Наконец, скомпилируйте все наши преобразователи данных и обучите модель, используя нашу модель классификации (в данном случае я использую LogisticRegression).

3. Оценка модели и создание прогноза

#Check accuracy using confusion matrix
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix
prediction_lr = model_lr.predict(X_test)
cm_lr = confusion_matrix(y_test, prediction_lr)
print(pd.DataFrame(cm_lr))
print('Accuracy : ', accuracy_score(y_test, prediction_lr))

Исходя из нашей модели, она обеспечивает точность 95%, предполагая, что в нашем новом наборе данных много разновидностей, тогда эту модель необходимо переобучить, чтобы избежать переобучения в результате нашего прогноза.

Как правило, существует несколько способов показать или представить точность модели. Я лично считаю, что достаточно использовать только одну или две метрики, которые генерируют числовые значения точности. Но некоторые люди предпочитают использовать график для визуализации его результата, и это нормально.

Позвольте мне привести вам пример того, как визуализировать нашу приведенную выше таблицу матрицы путаницы.

#Plot Confusion Matrix
price_class = [0,1,2,3]
plt.imshow(cm_lr, interpolation = 'nearest')
plt.colorbar()
tick_marks = np.arange(len(price_class))
plt.xticks(tick_marks, price_class)
plt.yticks(tick_marks, price_class)
plt.xlabel('Predicted')
plt.ylabel('Actual')
plt.show()

Затем, чтобы получить полную сводку по точности, отзыву и F1 Score, можно отобразить их с помощьюclassification_report.

print(classification_report(y_test, prediction_lr))

Следовательно, важно, чтобы при каждой оценке нам нужно было понимать, почему мы хотим видеть определенные показатели и каково определение для каждого измерения.

В заключительной части мы сгенерируем результаты нашего прогноза и сохраним их в файл csv.

#Predict our outcome
test = test[feature]
result = pd.DataFrame(model_lr.predict(test))
final = test.merge(result, left_index = True, right_index = True)
final = final.rename(columns = {0:'price_range'})
final.to_csv('result.csv')

Это конец нашей разработки модели классификации. Я надеюсь, что я рассмотрел все необходимые части в этой статье.

Конечно, есть еще факторы, которые мы можем учитывать, от выбора решателя в логистической регрессии, других моделей классификации (например, SVC) и многих других.

Опять же, не стесняйтесь играть с параметрами, выбором функций в любой разработке машинного обучения. Поскольку ML не является универсальным решением, и для разработки надежной модели необходимо использовать метод проб и ошибок.

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

(Отказ от ответственности: перед написанием этой статьи я протестировал несколько решателей, прежде чем завершить свою модель).

Ссылки: