Как концепции машинного обучения могут помочь в управлении рыболовством
Проблема
Я пытался показать полезность анализа, который группирует происхождение образцов рыб определенного вида с учетом формы ушной кости рыбы. Основная концепция заключается в том, что рыбы в отдельных группах для определенного вида, например, трески, имеют уникальную форму ушной кости, которая может использоваться для определения географического региона, из которого они прибыли. Я хотел показать, насколько хорошо спроектированные мной объекты предсказывают географическое происхождение каждого образца; По сути, обладает ли метод подходящей предсказательной способностью?
Сбор данных
Вы можете спросить, как определить форму костей уха? Я использовал дискретное вейвлет-преобразование (похожее на обычно используемое преобразование Фурье), чтобы описать форму контура каждой кости (рис. 1) в терминах косинусоидальных волн. Трансформация дала мне 64 коэффициента, чтобы описать морфологические нюансы ушей каждой рыбы, это наши особенности.
Ответ: географическое происхождение
Особенности: вейвлет-коэффициенты, описывающие форму кости
Обработка данных
У меня была неравная выборка среди демографических групп; не вдаваясь в биологические детали, мне нужно было изолировать влияние географического происхождения на форму кости без демографических деталей (например, длины, возраста и т. д.), влияющих на взаимосвязь. Я использовал повторные ANCOVA, чтобы исключить особенности, в которых демографические переменные существенно зависят от географического региона, и применил корректировку Бонферонни, чтобы минимизировать накопление ошибок первого типа при повторных анализах.
# function that will derive the p value for covariates ancova.pvalues <- function(resp, pred, cov){ return(unlist(summary(aov(resp~pred*cov)))['Pr(>F)3']) } # apply to each feature (given predictor of region (pops) and covariate of length) p.values<-0 # stores values for (i in 1:length(colnames(Wavecoefs))){ p.values[i]<-ancova.pvalues(unlist(Wavecoefs[i]), pops, length_cm) } which(p.values<0.05) # which features should we omit
Некоторые элементы были искажены, поэтому я применил преобразование Кокса коробки к тем, у которых наклон больше 0,75.
Очень немногие функции содержали НА; Я заменил NA на среднее значение для каждой функции.
Я разделил набор данных на обучающий и тестовый наборы, используя 80% и 20% данных соответственно, используя удобный метод train_test_split.
from sklearn.model_selection import train_test_split train_X, test_X, train_y, test_y = train_test_split(df, resp, random_state = 0, test_size=.2)
Моя переменная ответа, географический регион, была выбрана неравномерно (рисунок 2). Я хотел показать, что разработанные мной функции могут предсказывать происхождение рыбы из нескольких разных регионов, и я хотел минимизировать влияние вариации размера выборки на предсказание модели. Для этого я произвольно занизил выборку наиболее распространенного класса (Gulf, синий).
В пакете imbalanced-learn есть несколько полезных методов для этой цели; Я использовал «RandomUnderSampler», чтобы создать более сбалансированный набор обучающих данных, который будет соответствовать моей модели (рисунок 3).
from imblearn.under_sampling import RandomUnderSampler rus = RandomUnderSampler(return_indices=True) X_rus, y_rus, id_rus = rus.fit_sample(train_X, train_y)
Моделирование
Я использовал случайный лесной классификатор, чтобы предсказать регион, из которого был взят образец, с учетом особенностей, описывающих форму кости. Сначала я определил оптимальные значения гиперпараметров:
max_features: максимальное количество функций, которые следует учитывать при каждом разбиении.
max_depth: максимальное количество разбиений в любом дереве.
min_samples_split: минимальное количество выборок, необходимое для разделения узла.
min_samples_leaf: минимальное количество выборок, необходимых для каждого конечного узла.
bootstrap: загружается ли набор данных или используется ли весь набор данных для каждого дерева.
критерий: функция, используемая для оценки качества каждого сплита.
max_features = [‘auto’, ‘sqrt’, ‘log2’] max_depth = [int(x) for x in np.linspace(10, 110, num = 11)] max_depth.append(None) min_samples_split = [2, 5, 10] min_samples_leaf = [1, 2, 4] bootstrap = [True, False] criterion= ['gini', 'entropy'] grid_param = {'max_features': max_features, 'max_depth': max_depth, 'min_samples_split': min_samples_split, 'min_samples_leaf': min_samples_leaf, 'bootstrap': bootstrap, 'criterion':criterion }
В учебном модуле sci-kit есть удобный метод «GridSearchCV» для поиска оптимальных значений гиперпараметров посредством перекрестной проверки. Я использовал k-кратную перекрестную проверку с 5-кратной проверкой.
from sklearn.model_selection import GridSearchCV gd_sr = GridSearchCV(estimator=RFC, param_grid=grid_param, scoring=’accuracy’, cv=5,n_jobs=-1) gd_sr.fit(X_rus, y_rus) print(gd_sr.best_params_)
После определения лучших гиперпараметров я подобрал модель с максимальным количеством деревьев, которые моя машина могла вычислить за относительно короткий промежуток времени.
Best_RFC=RandomForestClassifier(n_estimators=8000,max_features= ’auto’, max_depth=20,min_samples_split=5, min_samples_leaf=1, bootstrap=True, criterion=’gini’) # fit best model to training dataset Best_RFC.fit(X_rus, y_rus)
Наконец, я предсказал происхождение образцов рыб из тестовой выборки и рассчитал точность модели:
# predict test Y values ypred=Best_RFC.predict(test_X) from sklearn import metrics print(“Accuracy:”,metrics.accuracy_score(test_y, ypred))
Модель предсказала географическое происхождение каждого образца в тестовой выборке с точностью 89%. Точность моих прогнозов была выше, чем в исследованиях, классифицирующих происхождение подобных видов рыб. Это упражнение было ограничено небольшим размером выборки; виды, которые я изучал, ловятся нечасто.
Матрица классификации дает нам представление о том, как прогнозы модели связаны с наблюдаемыми классами.
Модель случайного леса предсказала образцы рыбы из Мексиканского залива с гораздо большей точностью, чем образцы из Восточной Атлантики и Западной Атлантики. Это говорит о том, что форма костей в Мексиканском заливе более уникальна, чем в других регионах.
Это упражнение демонстрирует ценность концепций машинного обучения в науке о рыболовстве и их способность предсказывать происхождение образцов рыбы с помощью предлагаемой мной техники. Учитывая небольшой размер выборки, я думаю, что функции, которые я разработал, обладают высокой предсказательной способностью.
Я ценю любые отзывы и конструктивную критику. Код, связанный с этим анализом, можно найти на github.com/njermain.