Мы все были одержимы покемонами в какой-то момент нашего детства, и я знаю, как трудно вспомнить каждого покемона (около 800!). В сериале у Эша не было этой проблемы из-за покедекса, который ему дал профессор Оук. Так почему бы не создать наш собственный крутой Pokedex ?!

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

Набор данных

Самая важная часть любой программы машинного обучения - получение и предварительная обработка набора данных. Для нашего pokedex я собираюсь начать с создания набора данных для 5 типов покемонов:

Я успешно построил набор данных из 20 изображений для каждого типа. Теперь следующий шаг - предварительная обработка данных. Чтобы избежать каких-либо сложностей, измените размер всех изображений набора данных до тех же размеров (я изменил их на 300x300). А затем преобразовать его в оттенки серого, чтобы упростить процесс.

Вы можете легко сделать этот шаг, используя библиотеку PIL или даже OpenCV.

Наконец, создайте матрицу функций «X» - она ​​будет содержать все изображения в нашем наборе данных. Наша зависимая переменная «y» - будет соответствующим ярлыком.

Не забывайте кодировать строковые переменные!

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

Здесь 0 = Иви, 1 = Генгар, 2 = Джигглипафф, 3 = Пикачу, 4 = Сквиртл.

from sklearn.preprocessing import LabelEncoder
labelencoder_y = LabelEncoder()
y = labelencoder_y.fit_transform(y)

Наконец-то построим нашу модель!

В нашем наборе данных всего 100 изображений, давайте поместим нашу модель на 80 изображений, которые будут нашим набором поездов, и протестируем нашу модель на остальных, которые будут нашим тестом установлен.

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = 
train_test_split(X, y, test_size = 0.2, random_state = 0, shuffle = True)

Примерка модели

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

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

Следовательно, мы подбираем классификатор SVC с помощью GridSearchCV для настройки гиперпараметров - это поможет нам определить оптимальные значения для SVC.

from sklearn.model_selection import GridSearchCV
from sklearn.svm import SVC
param_grid = {'kernel': ['rbf','linear'],  
            'C': [1000,5000,10000,50000,100000], 
            'gamma': [0.0001, 0.0005, 0.001, 0.005, 0.01, 0.1],}
classifier = GridSearchCV(SVC(class_weight='balanced'), param_grid)
grid_result = classifier.fit(X_train, y_train)
grid_result.best_params_

Запуск grid_result.best_params_ вернет оптимальные параметры для наилучшего результата. Например,

{'C': 1000, 'gamma': 0.005, 'kernel': 'rbf'}

Вы можете обновить переменную param_grid этими значениями и запустить ее снова.

Применение анализа главных компонентов

Теперь, когда вы приспособили свой классификатор к своему набору тренировок, вы, должно быть, осознали, что на это уходит чертовски много времени. Это потому, что в нашем наборе данных Pokémon около 90000 функций! Чтобы сократить время и упростить модель, можно использовать PCA.

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

Так что давайте использовать PCA!

from sklearn.decomposition import PCA
pca = PCA(n_components = 20, whiten=True).fit(X_train)
X_train = pca.transform(X_train)
X_test = pca.transform(X_test)

Это сокращает количество наших функций с 90 000 до 20, что значительно упрощает нашу жизнь. Примените PCA к своим X_train и X_test перед установкой классификатора.

И вот мы почти закончили! Осталось только протестировать нашу модель.

y_pred = classifier.predict(X_test)

Из матрицы неточностей вы можете узнать, сколько прогнозов было верным, а сколько - ложным. Матрица неточностей - это таблица, используемая для описания эффективности классификатора.

from sklearn.metrics import confusion_matrix
cm = confusion_matrix(y_test,y_pred)

Ваш Pokedex готов!

Если вы хотите, вы можете дополнить Pokedex всеми типами покемонов и улучшить его - вы можете взять входное изображение от пользователя, использовать classifier.predict, чтобы идентифицировать тип и отображать его пользователю.

Вы можете ознакомиться с полным кодом и набором данных на моем GitHub.

использованная литература