Прогноз урожайности сои

Целью этого блога является анализ двух больших наборов данных различных модальностей (изображений и таблиц), касающихся прогнозирования средней урожайности. В частности, набор данных изображений состоит из дистанционного зондирования, спутниковых инфракрасных изображений урожая сои, в то время как управление урожаем и данные о погоде составляют набор табличных данных. Цель состоит в том, чтобы использовать эти исторические показания и связанную с ними среднюю доходность для обучения регрессионной модели для вывода средней доходности из будущих показаний. Точное прогнозирование урожайности жизненно важно для своевременного и рентабельного экспорта, который оказывает огромное влияние на мировое производство продуктов питания. Набор данных можно скачать по этой ссылке. Эти наборы данных основаны на активных направлениях исследований, изучающих методы эффективного и надежного определения предложения и спроса в глобальной цепочке поставок продуктов питания. Табличный набор данных включает среднюю урожайность и 12 признаков, которые определены ниже. Набор данных изображения состоит из гистограмм, извлеченных из инфракрасных спутниковых изображений, кодирующих временную составляющую для удобства вычислений. Задача состоит в том, чтобы разработать набор регрессионных моделей для автоматического прогнозирования средней урожайности сои с учетом многочисленных функций управления посевами и инфракрасных спутниковых изображений самих культур. Для выполнения требований данной постановки задачи не требуется предварительных знаний о проблеме предметной области.

Задача 1. Линейные модели для регрессии

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

Данные. Набор данных «soybean_tabular.csv» содержит средний урожай сои для определенного места в кукурузном поясе США, а также соответствующую информацию об управлении посевами и погоде за конкретный год. Цель этого эксперимента — изучить взаимосвязь между информацией о жизненном цикле урожая и соответствующей урожайностью урожая, полученного в этих условиях. Набор данных состоит из 506 записей, каждая из которых содержит 12 признаков и среднюю урожайность. Они определены ниже:

  • Разновидность: Разновидность посевного материала.
  • 4 компонента почвы: {S_1, S_2, S_3, S_4}
  • 3x Управление культурами: {M_1, M_2, M_3}
  • 4 компонента погоды: {W_1, W_2, W_3, W_4}
  • Урожайность: средняя урожайность сои.

Единица измерения или диапазон значений каждой характеристики не имеют значения. Однако функции могут иметь разный масштаб и/или измеряться в разных единицах.

Задача 1.1 — Импорт данных[1].

Для импорта данных я использовал модуль read_csv библиотеки panda, как указано в приведенном ниже фрагменте кода.

После импорта давайте прочитаем файл CSV и сохраним его в переменной, вывод модуля read_csv в формате кадра данных. Кроме того, я проверяю любые нулевые значения в кадре данных, чтобы я мог предварительно обработать данные. (К вашему сведению — при чтении файла CSV просто укажите место, где он хранится.) Кроме того, изображения имеют 9 измерений, поэтому я преобразовал их в векторы и сохранил в файле csv, который можно найти по этой ссылке. ».

Итак, у нас есть 503 строки и 13 столбцов, и в кадре данных нет нулевых значений.

Задание 1.2. Обобщение данных[1].

Для обобщения данных я использовал метод «описания» для обобщения фрейма данных. Метод «описать» генерирует описательную статистику, которая включает количество, среднее, стандартное, минимальное, 25%, 50%, 75% и максимальное значение, за исключением значений NaN. В следующем фрагменте кода показана реализация метода описания.

Модуль описания панд не вычисляет медиану и диапазон, поэтому я использовал медиану() панд, как показано ниже. А для расчета диапазона я использовал библиотеку numpy, чтобы включить все числа фрейма данных и вычесть минимальное значение из максимальных значений, как показано в приведенном ниже фрагменте кода [2].

Задача 1.3. Проверка асимметрии признаков[3].

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

Таким образом, приведенный выше фрагмент кода покажет диаграмму асимметрии в столбце доходности, а приведенный ниже код покажет отображение (гистограмму) для того же. Оба приведенных выше фрагмента кода дадут следующие графики.

С асимметрией я разберусь в следующей части задачи, а выбросы решил не трогать, оставлю как есть. Было бы удобно, если бы мы увидели подобные данные и в тестовой части.

Подзадача 2.1 — Разделение данных[4].

Для разделения данных я использовал модуль train_test_split из sklearn.model_selection, я разделил данные на 60% данных поезда, 20% данных проверки и 20% тестовых данных. Теперь возникает вопрос, почему мы разделяем наши данные? Мотивация довольно проста — данные разбиваются на обучение, тестирование и проверку, чтобы предотвратить переоснащение модели и точно оценить модель. Переобучение — это когда модель точно предсказывает все точки на этапе тестирования и проверки. Я сохранил 60 процентов данных тестирования, поэтому на обучение модели не повлияет меньшее количество данных, переданных во время обучения (Undefitting). Я сохранил достаточный процент данных для тестирования и проверки для выполнения операций. Следующий фрагмент кода покажет, как разделить набор данных:

Задача 2.1 — Удаление асимметрии с признаков[3].

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

Как видите, в функциях есть некоторые положительные значения. Я просто собираюсь справиться с положительной асимметрией функций и привести их к равному масштабу. Для устранения асимметрии я использовал функцию журнала библиотеки numpy, чтобы регистрировать преобразование значений функций. Давайте посмотрим, как выглядит y_train после преобразования журнала.

Перед преобразованием журнала.

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

Давайте также проверим график вероятности после логарифмического преобразования,

Задача 2.3 — Стандартное масштабирование данных[3]:

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

Обучение линейной регрессии: существует множество доступных моделей регрессии, но для этой задачи я выбираю следующие линейные модели для реализации, описания и оценки:

  • Ридж-регрессия
  • Лассо-регрессия

Перед реализацией модели давайте проверим, что такое регрессия Риджа и Лассо.

Регрессия хребта [5][7]–

В машинном обучении, если мы хотим делать прогнозы, мы не можем контролировать невидимые данные (т.е. обучать данные). В основном внимание разработчиков ограничивается только моделями. Ridge позволяет нам упорядочить (уменьшить) оценки коэффициентов, полученные с помощью линейной регрессии, что означает, что оценочные коэффициенты приближаются к 0, чтобы они хорошо предсказывали новые наборы данных. Это приводит к использованию сложных моделей и в то же время позволяет избежать переобучения. Без сомнения, линейная регрессия является одной из лучших оценок, но гребень может обеспечить более низкое значение MSE, чем линейная модель. Формула такая же, как и у линейной регрессии, но в гребневой регрессии функция стоимости изменяется путем добавления штрафа, эквивалентного квадрату величины коэффициентов.

Таким образом, гребневая регрессия накладывает ограничения на коэффициенты (w). Штрафной член лямбда упорядочивает коэффициенты, например, если коэффициенты принимают большие значения, функция оптимизации наказывается. Гребневая регрессия уменьшает коэффициенты и помогает уменьшить сложность модели и мультиколлинеарность. Ridge наиболее полезен, когда в функциях присутствует мультиколлинеарность, и его цель состоит в том, чтобы рассматривать мультиколлинеарность в функциях.

Лассо-регрессия [6][7]–

Регрессия Лассо такая же, как регрессия Риджа с небольшими и важными отличиями. Функция стоимости регрессии Лассо (оператор наименьшего сокращения и выбора) может быть записана как –

Как и в функции стоимости гребневой регрессии, единственная разница заключается в том, что вместо квадрата коэффициентов учитываются величины. Этот тип регуляризации может привести к нулевым коэффициентам, т. е. некоторые функции полностью игнорируются при оценке результатов. Таким образом, Lasso помогает не только в переоснащении, но и в выборе признаков.

Ридж против Лассо [6][7]–

Оба минимизируют функции ошибок наименьших квадратов, но Лассо также помогает в разделе функций.

На диаграмме показано, как Lasso может уменьшить размеры пространства признаков. Синие и зеленые области — это контуры, а красные эллипсы — это контуры ошибок. Оба метода определяют коэффициенты, находя первую точку, в которой эллиптические контуры попадают в область ограничений. Алмаз (лассо) имеет углы на осях, в отличие от диска, и всякий раз, когда эллиптическая область достигает такой точки, одна из особенностей полностью исчезает[6].

Задача 3.1 — Реализация регрессии Риджа и Лассо[9].

Я использовал библиотеку sklearns для реализации гребневой и лассо-регрессии, а также для расчета метрик я использовал модуль метрик sklearn. Приведенный ниже фрагмент кода показывает то же самое —

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

GridSearchCV по умолчанию выполняет k=3 перекрестных проверки. Здесь я только передаю альфа-список как часть эксперимента.

Метод дает все необходимые оценки для всех тестов, обучения и проверки. Как видно из приведенного выше вывода в наборе обучающих данных, Лассо дает 0,72 балла R_2 в наборе обучающих данных, 0,73 в наборе тестовых данных и 0,66 в наборе проверочных данных. Принимая во внимание, что, с другой стороны, Ридж дает оценку R_2 0,75 для набора обучающих данных, 0,77 для набора тестовых данных и 0,69 для набора данных проверки. Модель хребта немного лучше работает с наборами данных для тестирования и проверки.

Значение альфа для Lasso — 0,02, а для Ridge — 10. Итак, лучшей моделью здесь является Ridge, и мы выполним настройку гиперпараметров на модели Ridge.

Подзадача 3.2 — Настройка гиперпараметров.

Я также включил Lasso для настройки гиперпараметров только для экспериментов с моделью, но наша самая эффективная модель — Ridge, что очевидно, как обсуждалось в предыдущем разделе. Теперь, чтобы улучшить оценку R_2 для набора данных проверки, я попытался использовать конвейер из модуля sklearns.pipeline вместе с PolynomialFeatures модуля sklearns.preprocessing, чтобы проверить, есть ли какие-либо улучшения для повышения точности. Я также использовал модуль logspace numpy для создания альф для гребня и лассо и передал это как параметр с помощью GridSearchCV библиотеки sklearn.model_selection. Конвейер обычно помогает в создании преобразователей для различных типов переменных. В приведенном ниже коде я создал полиномиальную функцию вместе с регрессией Риджа и Лассо. Поскольку производительность модели зависит от значений гиперпараметров, нам нужно попробовать все возможные значения, чтобы узнать оптимальное значение. Чтобы сделать это вручную, потребовалось бы значительное количество времени и ресурсов, поэтому мы используем GridsearchCV для автоматизации настройки гиперпараметров. В приведенном ниже фрагменте кода показано, как я реализовал GridSearchCV в модели.

Вывод показан ниже –

Как вы можете видеть в приведенном выше выводе для обучающих данных, Ридж дает оценку R_2 0,89 для набора обучающих данных, 0,83 для набора тестовых данных и 0,76 для набора данных проверки. Принимая во внимание, что, с другой стороны, Лассо дает 0,86 балла R_2 для набора обучающих данных, 0,80 для набора тестовых данных и 0,73 для набора данных проверки. Модель хребта лучше работает с наборами данных для тестирования и проверки. Значение альфа для Лассо — 0,0076, а для Риджа — 18,3073.

Важность функции:

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

Прямо сейчас есть почти 12 предикторов и 1 целевая переменная. Здесь нам нужно уменьшить количество предикторов. Есть 2 варианта.

  1. Ручное удаление полей с меньшей корреляцией с целью[5].
  2. 2. Использование метода регуляризации для выбора только наиболее полезных предикторов[8]. Итак, давайте попробуем удалить менее коррелированные признаки вручную с помощью тепловой карты. Для построения тепловой карты я использовал библиотеку matplotlib и seaborn для проверки коррелирующих функций. В приведенном ниже фрагменте кода показана его реализация.

Чтобы проверить менее коррелированные функции, я просто использую corr() фрейма данных. Если корреляция больше 0,4. Я оставлю их, а остальные будут удалены.

Таким образом, указанные выше функции имеют наибольшую корреляцию, и я бы оставил их для обучения модели. На следующем этапе я буду использовать регрессию Риджа, так как это наиболее эффективная модель. В приведенном ниже фрагменте кода я использовал модуль LogisticRegression of sklearns, где я наказываю модель, минуя значение «C», как 0,2, и тип штрафа как «l2», что означает регрессию Риджа. Перед передачей значений я стандартно масштабирую X_train и использую labelencoder для y_train, потому что SelectFromModel класса sklearns не принимает значения без кодирования и теоретически выберет функции с ненулевыми коэффициентами.

Теперь давайте визуализируем функции, которые мы сохранили с помощью гребневой регрессии, и напечатаем общее количество функций, которые у нас есть.

Как видно из приведенного выше вывода, функция — S_2, S_4, M_3, W_1, W_2, W_3 выбраны, а остальные удалены. Поскольку модель штрафует коэффициенты, она удаляет функции, используемые при моделировании. Помните, что регуляризация Риджа не уменьшает коэффициенты до нуля. Также помня, что увеличение значения c приведет к удалению большего количества функций, поэтому после нескольких прогонов я решил оставить значение c равным 0,2.

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

Рекомендации

  1. Pandas, https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.describe.html.
  2. Stackoverflow (диапазон значений), https://stackoverflow.com/questions/24748848/pandas-find-the-maximum-range-in-all-the-columns-of-dataframe.
  3. Ридж-регрессия, https://towardsdatascience.com/the-power-of-ridge-regression-4281852a64d6.
  4. Sklearn Train Test and Validation split, https://stackoverflow.com/questions/38250710/how-to-split-data-into-3-sets-train-validation-and-test.
  5. Ридж-регрессия, https://stats.stackexchange.com/questions/486281/if-there-any-benefit-to-using-ridge-regression-in-a-simple-linear-regression-pro.
  6. Лассо-регрессия, https://towardsdatascience.com/ridge-and-lasso-regression-a-complete-guide-with-python-scikit-learn-e20e34bcbf0b.
  7. Выбор функций, https://towardsdatascience.com/feature-selection-using-regularisation-a3678b71e499.
  8. Настройка гиперпараметров, https://alfurka.github.io/2018-11-18-grid-search/.