Создание развертываемого классификатора машинного обучения на Python
В наши дни машинное обучение стало совершенно необходимым, эффективным и действенным способом поиска решений проблем благодаря сложности проблем и огромному объему связанных с ними данных. В большинстве ресурсов модель машинного обучения разрабатывается на основе структурированных данных только для проверки точности модели. Но в реальном времени одними из основных требований при разработке модели машинного обучения является обработка несбалансированных данных при построении модели, настройке параметров в модели и сохранении модели в файловой системе для последующего использования или развертывания. Здесь мы увидим, как разработать двоичный классификатор на Python, соблюдая все три требования, указанные выше.
При разработке модели машинного обучения мы обычно вкладываем все наши инновации в стандартный рабочий процесс. Некоторые из задействованных шагов - это получение данных, разработка функций на них, построение модели с правильными параметрами посредством итеративного обучения и тестирования и развертывание построенной модели в производственной среде.
Мы рассмотрим этот рабочий процесс, построив двоичный классификатор для прогнозирования качества красного вина по доступным характеристикам. Набор данных общедоступен в репозитории машинного обучения UCI. Библиотека Scikit Learn используется здесь для проектирования классификатора. Для исходного кода ссылка github -
Сначала нам нужно импортировать все необходимые зависимости и загрузить набор данных. Нам всегда нужны numpy и pandas в любом дизайне модели ml, поскольку во всех задействованы операции с фреймами данных, матрицами и массивами.
import numpy as np import pandas as pd df = pd.read_csv("winequality-red.csv") df.head()
Набор данных выглядит так:
Как видно здесь, качество было представлено числами от 3 до 8. Чтобы сделать это проблемой двоичной классификации, возьмем качество ›5 - хорошо, иначе - плохо.
df["quality_bin"] = np.zeros(df.shape[0]) df["quality_bin"] = df["quality_bin"].where(df["quality"]>=6, 1) #1 means good quality and 0 means bad quality
Чтобы получить сводку описания данных -
df.describe()
Как видно из снимка, значения данных по некоторым атрибутам сильно отклоняются. Рекомендуется стандартизировать значения, так как это приведет к разумному уровню дисперсии. Кроме того, поскольку большинство алгоритмов используют евклидово расстояние в фоновом режиме, масштабирование функций лучше при построении моделей.
from sklearn.preprocessing import StandardScaler X_data = df.iloc[:,:11].values y_data = df.iloc[:,12].values scaler = StandardScaler() X_data = scaler.fit_transform(X_data)
Здесь используется fit_transform, так что StandardScaler подходит для X_data и также преобразует X_data. Если вам нужно подогнать и преобразовать его в двух разных наборах данных, вы также можете вызвать функции fit и transform отдельно. Теперь у нас есть всего 1599 экземпляров данных, из которых 855 - плохого качества, а 744 - хорошего качества. Данные здесь явно несбалансированы. Поскольку существует меньшее количество экземпляров данных, мы будем использовать передискретизацию. Но важно отметить, что повторная выборка всегда должна выполняться только для данных обучения, а не для данных тестирования / проверки. Теперь давайте разделим набор данных на набор данных для обучения и тестирования для модели. строительство.
from sklearn.cross_validation import train_test_split X_train, X_test, y_train, y_test = train_test_split(X_data, y_data, test_size=0.3, random_state=42) #so that 30% will be selected for testing data randomly
Вместо разделения обучения и тестирования вы также можете использовать более эффективный метод перекрестной проверки. Сейчас у нас для обучения 588 экземпляров плохого качества и 531 экземпляров хорошего качества. Для тестирования осталось 267 экземпляров плохого качества и 213 экземпляров хорошего качества. Пришло время выполнить повторную выборку обучающих данных, чтобы сбалансировать их, чтобы модель не была предвзятой. Здесь мы будем использовать алгоритм SMOTE для передискретизации.
from imblearn.over_sampling import SMOTE #resampling need to be done on training dataset only X_train_res, y_train_res = SMOTE().fit_sample(X_train, y_train)
После передискретизации в обучающей выборке оказалось 588 экземпляров вина как хорошего, так и плохого качества. Пришло время выбора модели. Я взял сюда стохастический градиентный классификатор. Но вы можете проверить несколько моделей и сравнить их точность, чтобы выбрать подходящую.
from sklearn.linear_model import SGDClassifier sg = SGDClassifier(random_state=42) sg.fit(X_train_res,y_train_res) pred = sg.predict(X_test) from sklearn.metrics import classification_report,accuracy_score print(classification_report(y_test, pred)) print(accuracy_score(y_test, pred))
Результат выглядит так:
Полученная точность составила 65,625%. Такие параметры, как скорость обучения, функция потерь и т. Д., Играют важную роль в работе модели. Мы можем эффективно выбрать лучшие параметры для модели с помощью GridSearchCV.
#parameter tuning from sklearn.model_selection import GridSearchCV #model model = SGDClassifier(random_state=42) #parameters params = {'loss': ["hinge", "log", "perceptron"], 'alpha':[0.001, 0.0001, 0.00001]} #carrying out grid search clf = GridSearchCV(model, params) clf.fit(X_train_res, y_train_res) #the selected parameters by grid search print(clf.best_estimator_)
Как видно здесь, здесь указаны только функция потерь и альфа, чтобы найти для них лучший вариант. То же самое можно сделать и с другими параметрами. Лучшим вариантом для функции потерь, по-видимому, является «шарнир», т.е. линейный SVM, а для альфа-значения он кажется равным 0,001. Теперь мы построим модель, используя лучшие параметры, выбранные при поиске по сетке.
#final model by taking suitable parameters clf = SGDClassifier(random_state=42, loss="hinge", alpha=0.001) clf.fit(X_train_res, y_train_res) pred = clf.predict(X_test)
Теперь мы выбрали модель, настроили параметры, так что пришло время проверить модель перед развертыванием.
print(classification_report(y_test, pred)) print(accuracy_score(y_test, pred))
Как видно здесь, после настройки параметров значения метрик улучшились на 2–3%. Точность также улучшилась с 65,625% до 70,625%. Если вас все еще не устраивает модель, вы можете попробовать и другие алгоритмы, выполнив несколько итераций обучения и тестирования. Теперь, когда модель построена, ее необходимо сохранить в файловой системе для дальнейшего использования или развертывания в другом месте.
from sklearn.externals import joblib joblib.dump(clf, "wine_quality_clf.pkl")
Когда вам понадобится классификатор, его можно просто загрузить с помощью joblib, и массив функций будет передан для получения результата.
clf1 = joblib.load("wine_quality_clf.pkl") clf1.predict([X_test[0]])
Поздравляю! Теперь вы готовы разработать развертываемую модель машинного обучения. :-D
Использованная литература:-