Я только что закончил вторую неделю «Машинного обучения Zoomcamp 2022» Алексея Григорева, и чтобы поделиться своими заметками и прогрессом, я буду делать это через эту среду. Еженедельные статьи, написанные в виде интервью, в которых рассматриваются основные темы, изученные за неделю, а также другие общие положения курса или рекомендации по заданиям или проектам. Надеюсь, вам понравится, и любые отзывы будут приветствоваться.

- Оставив вводную неделю позади, на второй неделе мы приготовим кое-что более захватывающее. Мы приступим к воспроизведению нашего первого проекта по машинному обучению, давайте поговорим об этом.

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

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

Инструктор освобождает нас от грязной работы и развивает этот проект с ранее проверенным набором данных, который можно найти на Kaggle по следующей ссылке: https://www.kaggle.com/datasets/CooperUnion/cardataset. Здесь мы найдем переменные, которые описывают, кто произвел автомобиль, модель автомобиля, какого года выпуска, тип топлива в двигателе, количество дверей и тип трансмиссии, среди прочего, которые мы будем использовать как Функции для прогнозирования цены автомобиля, которая в этом наборе данных помечена в переменной Рекомендуемая производителем розничная цена, обозначающая рекомендованную розничную цену производителя, которая будет нашей Переменная цели или ответа.

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

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

– Если вы уже узнали о модели процесса CRISP-DM для проектов машинного обучения, будет ли правильно применить ее к этому проекту?

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

Семь шагов для этого регрессионного проекта будут следующими:

1. Подготовьте данные и выполните Исследовательский анализ данных (EDA).

2. Используйте метод линейной регрессии для прогнозирования цены автомобиля.

3. Разберитесь во внутреннем устройстве линейной регрессии, чтобы знать, как интерпретировать результаты и форму модели.

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

5. Разработка функций – это процесс создания новых функций или их извлечения из доступных данных.

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

7. Использование модели.

– Первые шаги для начала работы с набором данных?

Мы договорились, что нашим первым шагом будет подготовка и исследование данных, для этого нам нужно выбрать инструмент, который позволит нам манипулировать ими и анализировать их, рекомендуемый — Pandas от Python библиотека. Чтобы приступить к работе изначально, мы должны загрузить данные в нашу рабочую среду, это можно сделать с помощью функции .read_csv(), если у нас есть файл со значениями, разделенными запятыми , как и у нас.

Как только данные загружены, мы можем быстро просмотреть их с помощью функции .head() или .tail(), которые показывают нам первое или последнее значение набора данных соответственно. Это будет самый простой способ ознакомиться с данными, проверить каждую переменную, определить тип содержащихся в ней данных и, если они соответствуют интуиции, спросить себя, не обнаружите ли вы какое-либо несоответствие между ними, например, столбец имена или строковые значения переменных не нормализованы или стандартизированы, т. е. некоторые имена написаны строчными буквами, а другие — прописными, или некоторые из них разделены пробелами, а другие символами подчеркивания.

И если вам интересно, почему последнее актуально, помните, что для Python «BMW» отличается от «BmW», машины точны в интерпретации, поэтому мы должны быть очень осторожны в том, как наша информация перечисляется, поскольку мы знаем, что хотим ссылаться на одного и того же производителя, но для машины будет два совершенно разных, поэтому это приведет к нежелательным результатам нашего анализа, чтобы решить эту и другие проблемы, связанные с Strings в Pandas, обратитесь к доступным методам, некоторые полезной может быть str.lower() для преобразования строки в нижний регистр или str.replace(' ', '_') для замены пробела символом подчеркивания, в этом вы можете заменить любого персонажа, которого хотите.

–Что я могу сделать, чтобы получить список всех производителей автомобилей в наборе данных?

У панд есть несколько методов для получения различных значений, которые может иметь переменная, среди них .unique(), который возвращает массив с различными уникальными значениями переменной, и .nunique() , который возвращает целое число с количеством уникальных значений переменной в наборе данных. Эти методы можно применять в любой серии, поэтому достаточно будет указать переменную производителя, которая является make, и применить метод df['make'].unique() или df['make'].nunique() для получения массива со всеми производителями набора данных или количеством различных производителей, которые есть в наборе данных, соответственно.

-Можно ли строить гистограммы в Python?

Да, в Python есть много библиотек для визуализации данных, наиболее распространенными для анализа данных являются Matplotlib и Seaborn, в Seaborn функция построения гистограмм — .histplot( ).

-Что такое эффект длинного хвоста распределения, в чем проблема и как ее решить?

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

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

Один из способов решить эту проблему — применить функцию логарифмического распределения. В Python библиотека NumPy имеет функцию .log() и функцию .log1p( ), оба возвращают натуральный логарифм каждого из значений, принимаемых функцией, а разница в том, что второй добавляет 1 к каждому из значений, которые передаются функции, а затем возвращает натуральный логарифм. Это особенно полезно для массивов, в которых присутствует нулевое значение, поскольку натурального логарифма нуля не существует.

-Как узнать, сколько пропущенных значений есть в каждой из переменных?

Для этого мы можем использовать функцию .isnull(), за которой следует функция .sum() в DataFrame, первая из которых вернет DataFrame с логические значения, где отсутствующие значения будут отмечены как True, а неотсутствующие — как False, вторая функция агрегирования добавит все значения для каждого столбца, в Python значения False связаны с числовым значением нуля (0), а True strong> с единицей (1), поэтому, если мы их добавим, мы получим общее количество пропущенных значений, которые помечены как True, следовательно, как 1. Строка кода будет следующей: df.isnull(). сумма()

– На первой неделе вы упомянули процесс выбора модели и подчеркнули разделение набора данных на три части: обучение, проверка и тестирование. Есть ли способ сделать это, которым вы хотите поделиться?

Многие библиотеки в Python разделяют набор данных для нас, однако инструктор учит нас делать это вручную, чтобы понять, что стоит за процессом. Во-первых, уясните, что ваш набор данных должен быть разделен на три подмножества данных в соответствии с пропорцией, которую вы выбираете или которую рекомендует литература, если вы работаете с Dataframe в Pandas. необходимо создать три новых фрейма данных в уроке 2.4. При настройке Validation Framework используется следующий способ их разделения: Train (60%), Validation (20%),и Test (20%). .

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

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

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

Если вы кодируете на Python, вы можете следовать этому коду:

1. Создайте массив в NumPy, который будет служить ориентиром для выбора записей.

idx = np.arrange(n)     # where n is the total number of records

2. Перемешайте массив с помощью функции random.shuffle(), чтобы избежать проблемы предустановленного порядка. Модуль .random и функция .seed() используются для репликации кода, NumPy генерирует псевдослучайный числа, и благодаря этому можно понять, как алгоритм тасует записи.

np.random.seed(2)   # The argument of seed() could be any int number
np.random.shuffle(idx)

3. Создайте три новых соответствующих фрейма данных для наборов данных Train, Validation и Test.

# n_train and n_val correspond to the number of records that this # set must have
df_train = df.iloc[idx[:n_train]]
df_val = df.iloc[idx[n_train:n_train + n_val]]
df_test = df.iloc[idx[n_train + n_val:]]
# The .reset_index() function will reset the indexes and the parameter drop = True drops the new column created with the earlier indexes.
df_train = df_train.reset_index(drop = True)
df_val = df_val.reset_index(drop = True)
df_test = df_test.reset_index(drop = True)

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

Напомним, что переменная, обозначающая цену автомобиля, — это MSRP, мы выбираем ее из каждого из DataFrames и с помощью атрибута .values получаем массив значений, результатом которого является вектор Переменная ответа для каждого из наборов данных. Не забывайте, что эта переменная может быть изменена, если ее распределение не похоже на нормальное распределение, как мы обсуждали ранее.

y_train = np.log1p(df_train['msrp'].values)
y_val = np.log1p(df_val['msrp'].values)
y_test =np.log1p(df_test['msrp'].values)

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

del df_train['msrp']
del df_val['msrp']
del df_test['msrp']

– Что означает термин "предвзятость" в формуле простой линейной регрессии?

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

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

В математике обратной функцией натурального логарифма является экспоненциальная функция. Итак, чтобы вернуться к исходным единицам, вы должны применить экспоненциальную функцию к значениям целевой переменной. В NumPy вы можете использовать функцию .exp() или .expm1(), первая возвращает экспоненциальное значение логарифма, в то время как последний вычитает 1 из каждого из значений и возвращает экспоненциальное значение, это будет обратная функция .log1p(), которая добавляет 1 к значениям, а затем возвращает натуральный логарифм.

-Правда ли, что формулу линейной регрессии можно синтезировать как умножение матриц?

Да, это точечный продукт между матрицей признаков и вектором весов. Скалярное произведение — это способ умножения двух или более векторов, в результате чего получается скалярная величина, потому что это сумма всех произведений каждой из соответствующих записей, если мы умножим матрицу признаков. с помощью Вектора весов (это все еще матрица, одно из измерений которой равно 1), мы получим последовательность скаляров, которые будут прогнозируемыми значениями, также называемымиy вектор предсказаний.

-Как можно получить вектор весов или коэффициентов в системе линейной регрессии для обучения модели?

Наиболее приближенным решением для решения системы линейной регрессии является поиск Вектора весов, который позволяет нам получать прогнозы, достаточно близкие к значению Целевой переменной. Для этого , мы можем умножить обратную матрицу грамма (умножение матрицы признаков на ее транспонирование) на матрицу признаков и умножить ее по вектору yпеременной Target, в Python это будет примерно так:

XTX = X.T.dot(X)  # Feature Matrix by its transpose (Gram Matrix)
XTX_inv = np.linalg.inv(XTX)  # Get the inverse of the Gram Matrix
w = XTX_inv.dot(X.T).dot(y)  # Being y the Target Variable Vector

-Что означает RMSE и почему он полезен в моделях линейной регрессии?

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

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

– Можно ли включать категориальные переменные в модель линейной регрессии?

Да, их даже рекомендуется учитывать, поскольку они могут содержать ценную информацию для получения правильных прогнозов, однако мы должны помнить, что модели машинного обучения интерпретируют только числовые функции, поэтому мы должны найти способ включить эти категориальныеценности. Ответ: Горячее кодирование, при котором новые функции строятся на основе количества категорий категориальных переменных, но они будут принимать двоичные значения (1 или 0). Например, если у нас есть категориальная переменная для пола, в мужском столбце будет единица, если запись мужского пола, и ноль, если она женского пола.

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

-Что такое регуляризация и какие преимущества она может дать нашим моделям?

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

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

-И, наконец, как я могу получить доступ к Machine Learning Zoomcamp 2022?

Всю соответствующую информацию можно найти по следующей ссылке:



Или в социальных сетях Алексея Григорьева:

  • Линкедин:

https://www.linkedin.com/in/agrigorev/

  • Твиттер:

https://twitter.com/Al_Grigor?s=20&t=0GubFiiB8kfJkQPPGqaaCg