Как концепции машинного обучения могут помочь в управлении рыболовством

Проблема

Я пытался показать полезность анализа, который группирует происхождение образцов рыб определенного вида с учетом формы ушной кости рыбы. Основная концепция заключается в том, что рыбы в отдельных группах для определенного вида, например, трески, имеют уникальную форму ушной кости, которая может использоваться для определения географического региона, из которого они прибыли. Я хотел показать, насколько хорошо спроектированные мной объекты предсказывают географическое происхождение каждого образца; По сути, обладает ли метод подходящей предсказательной способностью?

Сбор данных

Вы можете спросить, как определить форму костей уха? Я использовал дискретное вейвлет-преобразование (похожее на обычно используемое преобразование Фурье), чтобы описать форму контура каждой кости (рис. 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.