Дайте мне знать, если вы найдете это ценным, и я продолжу!
Одной из самых простых, но мощных концепций является линейная модель.
В машинном обучении одна из наших основных целей — делать прогнозы на основе данных. Линейная модель похожа на «Привет, мир» машинного обучения: она проста, но формирует основу для понимания более сложных моделей.
Давайте построим модель для прогнозирования цен на жилье. В этом примере выходными данными является ожидаемая «цена дома», а входными данными будут такие вещи, как «кв. фут», «количество спален» и т. д.…
def prediction(sqft, num_bedrooms, num_baths): weight_1, weight_2, weight_3 = .0, .0, .0 home_price = weight_1*sqft, weight_2*num_bedrooms, weight_3*num_baths return home_price
Вы заметите «вес» для каждого ввода. Именно эти веса и создают волшебство прогноза. Этот пример скучный, поскольку он всегда выводит ноль, поскольку веса равны нулю.
Итак, давайте выясним, как найти эти веса.
Процесс определения весов называется «обучением» модели.
data = [ {"sqft": 1000, "bedrooms": 2, "baths": 1, "price": 200000}, {"sqft": 1500, "bedrooms": 3, "baths": 2, "price": 300000}, # ... more data points ... ]
home_price = prediction(1000, 2, 1) # our weights are currently zero, so this is zero actual_value = 200000 error = home_price - actual_value # 0 - 200000 we are way off. # let's square this value so we aren't dealing with negatives error = home_price**2
Теперь, когда у нас есть способ узнать, насколько мы отклонены (ошибка) для одной точки данных, мы можем вычислить среднюю ошибку по всем точкам данных. Обычно это называют среднеквадратичной ошибкой.
Конечно, мы могли бы выбирать случайные числа и продолжать сохранять лучшее значение по мере продвижения, но это неэффективно. Итак, давайте рассмотрим другой метод: градиентный спуск.
Градиентный спуск — это алгоритм оптимизации, используемый для поиска наилучших весов для нашей модели.
Градиент — это вектор, который сообщает нам, как меняется ошибка при небольших изменениях каждого веса.
Интуиция боковой панели
Представьте, что вы стоите на холмистой местности и ваша цель — достичь самой низкой точки (минимальная ошибка). Градиент подобен компасу, который всегда указывает на самый крутой подъем. Двигаясь против направления градиента, мы приближаемся к самой низкой точке.
Вот как это работает:
Как рассчитать градиент для каждой ошибки?
Один из способов расчета градиента — внести небольшие изменения в вес, посмотреть, как это повлияет на нашу ошибку, и посмотреть, куда нам следует двигаться дальше.
def calculate_gradient(weight, data, feature_index, step_size=1e-5): original_error = calculate_mean_squared_error(weight, data) # Slightly increase the weight weight[feature_index] = step_size new_error = calculate_mean_squared_error(weight, data) # Calculate the slope gradient = (new_error - original_error) / step_size # Reset the weight weight[feature_index] -= step_size return gradient
Пошаговое описание
Входные параметры:
Вычислить исходную ошибку:
original_error = calculate_mean_squared_error(weight, data)
Сначала мы вычисляем среднеквадратическую ошибку с нашими текущими весами. Это дает нам отправную точку.
weight[feature_index] = step_size
Мы немного увеличиваем вес (step_size). Это позволяет нам увидеть, как небольшое изменение веса влияет на нашу ошибку.
new_error = calculate_mean_squared_error(weight, data)
Мы снова вычисляем среднеквадратическую ошибку со слегка увеличенным весом.
gradient = (new_error - original_error) / step_size
Это ключевой шаг. Спрашиваем: «Насколько изменилась ошибка, когда мы немного увеличили вес?»
Амплитуда показывает, насколько чувствительна ошибка к изменениям этого веса.
weight[feature_index] -= step_size
Мы вернули весу исходное значение, так как тестировали, что произойдет, если мы его изменим.
return gradient
Мы возвращаем рассчитанный градиент для этого веса.
Это называется «числовым расчетом градиента» или «методом конечных разностей». Мы аппроксимируем градиент, а не вычисляем его аналитически.
Теперь, когда у нас есть градиенты, мы можем переместить веса в противоположном направлении градиента, вычитая градиент.
weights[i] -= gradients[i]
Если наш градиент слишком велик, мы можем легко превысить минимальный уровень, слишком сильно обновив вес. Чтобы это исправить, мы можем умножить градиент на небольшое число:
learning_rate = 0.00001 weights[i] -= learning_rate*gradients[i]
И вот как мы это делаем для всех весов:
def gradient_descent(data, learning_rate=0.00001, num_iterations=1000): weights = [0, 0, 0] # Start with zero weights for _ in range(num_iterations): gradients = [ calculate_gradient(weights, data, 0), # sqft calculate_gradient(weights, data, 1), # bedrooms calculate_gradient(weights, data, 2) # bathrooms ] # Update each weight for i in range(3): weights[i] -= learning_rate * gradients[i] if _ % 100 == 0: error = calculate_mean_squared_error(weights, data) print(f"Iteration {_}, Error: {error}, Weights: {weights}") return weights
Наконец-то у нас есть гири!
После того как у нас есть обученные веса, мы можем использовать их для интерпретации нашей модели:
Например, если наши обученные веса равны [100, 10000, 15000], это означает:
Линейные модели, несмотря на свою простоту, являются мощными инструментами машинного обучения. Они обеспечивают основу для понимания более сложных алгоритмов и предлагают интерпретируемую информацию о реальных проблемах.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3