Мы все были одержимы покемонами в какой-то момент нашего детства, и я знаю, как трудно вспомнить каждого покемона (около 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.