После долгих размышлений о том, как представить эту статью другим начинающим специалистам по машинному обучению, я пришел к выводу, что я не могу лучше объяснить основные концепции, чем нынешние мастера. Я даже не буду пытаться.
Я просто скажу вам следующее: прежде чем мы начнем реализовывать линейную регрессию в python убедитесь, что вы просмотрели первые две недели курса Эндрю Нг по машинному обучению.
После того, как вы посмотрели лекции и ознакомились с концепциями, вы должны попробовать реализовать это самостоятельно, и если вам понадобится помощь, ну, именно поэтому эта статья существует :-)
С учетом сказанного, приступим. Набор данных и файлы кода находятся здесь. Я рекомендую использовать spyder, так как в нем есть фантастическая программа просмотра переменных, которой нет в jupyter notebook.
Шаг 1. Импортируйте библиотеки:
Это говорит само за себя. Мы просто импортируем numpy и matplotlib. Я не использовал здесь панд, но вы определенно можете их использовать. Прочтите эту отличную статью от Pankajashree R, чтобы начать работу с Pandas.
Шаг 2. Считайте данные и создайте матрицы:
Во второй строке мы разрезаем набор данных и сохраняем первый столбец как массив в X. reshape (-1,1) сообщает python преобразовать массив в матрицу с одним столбцом. «-1» указывает питону самому вычислять строки. Затем мы создаем массив единиц и объединяем его в матрицу X. Наконец, мы создаем матрицу y. На этом этапе, если мы построим график, используя,
plt.scatter(my_data[:, 0].reshape(-1,1), y)
Мы получаем:
Шаг 3. Установите гиперпараметры:
Теперь мы должны определить гиперпараметры, то есть скорость обучения и количество итераций. Здесь мы также можем определить начальные значения тета.
Если вам интересно, тета-значения - это значения наклона и пересечения линейного уравнения. то есть значения m и c в уравнении y = c + mx. В этом случае yhat = theta [0] [0] + theta [0] [1] * x
Шаг 4. Создайте функцию стоимости:
Функция computeCost принимает X, y и theta в качестве параметров и вычисляет стоимость. Вычисления внутри функции - это именно то, что Эндрю преподает в классе. По сути, «внутренний» вычисляет скалярное произведение X и тета в степени два. Затем они суммируются, делятся на 2 * длины X и возвращаются.
Это означает, что мы находим разницу между предсказанными значениями (мы используем линейное уравнение и значения тета для прогнозирования yhat) и исходными значениями y (уже в наборе данных, то есть в матрице y) и суммируем их. Затем находим среднее значение и возвращаем его. Возвращаемое значение - это стоимость.
Теперь мы можем запустить функцию стоимости, и это дает очень высокую стоимость. Мы должны его уменьшить. Как-то. (¬‿¬)
computeCost(X, y, theta) # outputs 319.40631589398157
Шаг 5. Создайте функцию градиентного спуска:
Конечно, мы собираемся использовать градиентный спуск, чтобы минимизировать функцию затрат.
Градиентный спуск - это сердце этой статьи, и его непросто понять, поэтому, если вы еще этого не сделали, сейчас самое время ознакомиться с курсом Эндрю Нг. Объяснения Эндрю точны. Как только вы это поймете, код обретет смысл.
По сути, он находит оптимальное значение для тета-параметров, что снижает стоимость.
Теперь мы можем запустить функцию градиентного спуска и посмотреть, что произойдет:
g, cost = gradientDescent(X, y, theta, alpha, iters) print(g, cost)
Приведенный выше код выводит:
g = array([[ 1.03533399, 1.45914293]]) cost = 56.041973777981703
Стоимость с «319.40631589398157» до «56.041973777981703» значительно снизилась.
Продолжайте, измените гиперпараметры, значения тета. Посмотри, что получится. Тренируйтесь. Посмотрите, сможете ли вы снизить стоимость еще больше.
Шаг 6. Другой сюжет:
Вы поняли приведенный выше код? Как вы думаете, что такое x_val? А y_val? Это вам что-то напоминает? Возможно, линейное уравнение? Можете ли вы использовать эту технику, чтобы предсказать любое значение y с учетом значения x?
Обдумывая эти вопросы, посмотрите, что выводит приведенный выше код:
Итак, поехали. Полный алгоритм линейной регрессии с нуля. Интересно, что происходит, когда есть несколько функций ¯ \ _ (ツ) _ / ¯
Но это тема для другой статьи.
Хотя я сказал, что не буду объяснять соответствующие концепции в этой статье, вы, безусловно, можете опубликовать свои сомнения в комментариях ниже или написать мне в Twitter, и я постараюсь их прояснить.
Покажите нам некоторые ❤ и 👏 и следите за нашей публикацией, чтобы увидеть больше интересных статей по науке о данных от авторов 👫 со всего мира и за его пределами. Спасибо за внимание.