В своей предыдущей статье я разместил несколько вводных по модели классификации (здесь и здесь). И на этот раз я решил использовать более бизнес-ориентированный подход к реализации логистической регрессии.
Набор данных, используемый в этой модели, можно скачать по этой ссылке. Он содержит функции мобильного телефона (оперативная память, размер и т. д.), каждая комбинация которых приводит к разным ценовым категориям.
Модель классификации для ценового диапазона мобильных телефонов
Обзор: Разработайте модель классификации для определения ценового диапазона на основе доступных функций.
Цели:
- Очистка данных и выбор функций
- Обучение и оценка модели
- Сохранить модель для будущего использования
Описание файла :
- train.csv : тренировочный набор. Особенности мобильного телефона в ценовом диапазоне
- test.csv : набор тестов. Для прогнозирования с использованием модели мы собираемся тренироваться, используя вышеуказанный набор данных поезда.
Поля данных:
- battery_power : Общая энергия, которую батарея может хранить за один раз, измеряется в мАч.
- синий : есть Bluetooth или нет
- clock_speed : скорость, с которой микропроцессор выполняет инструкции
- dual_sim : поддерживает две SIM-карты или нет.
- fc : Мегапиксели фронтальной камеры
- four_g : есть 4G или нет
- int_memory : внутренняя память в гигабайтах
- m_dep : Мобильная глубина в см
- mobile_wt : Вес мобильного телефона.
- n_cores : количество ядер процессора
- pc : Мегапиксели основной камеры
- px_height : высота разрешения в пикселях
- px_width : Ширина разрешения пикселей
- ram : Оперативная память в мегабайтах
- sc_h : высота экрана мобильного телефона в см.
- sc_w : Ширина экрана мобильного телефона в см.
- talk_time : максимальное время работы от одного заряда батареи, когда вы
- three_g : есть 3G или нет
- touch_screen : есть сенсорный экран или нет
- Wi-Fi : есть Wi-Fi или нет
- price_range: это целевая переменная со значением 0 (низкая стоимость), 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 не является универсальным решением, и для разработки надежной модели необходимо использовать метод проб и ошибок.
Пожалуйста, не стесняйтесь давать мне какие-либо комментарии и отзывы, или если вы, ребята, хотите прочитать определенную тему, связанную с наукой о данных и аналитикой, просто дайте мне знать!
(Отказ от ответственности: перед написанием этой статьи я протестировал несколько решателей, прежде чем завершить свою модель).
Ссылки: