Re: Машинное обучение с нуля — Машинное обучение (1) Линейная регрессия

машинное обучение искусственный интеллект глубокое обучение Python алгоритм

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

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

предисловие

Главный герой этой статьиЛинейная регрессия, то есть LR (линейная регрессия). Но старшеклассники не должны знать, что такое возвращение, верно? Я кратко представлю его в предисловии.

Регрессия

Проблема регрессии — большая часть машинного обучения.

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

Не играйте с определением, сразу переходите к примеру, представьте такой сценарий: Если теперь у меня есть набор данных (рост, вес), я могу нарисовать его на бумаге с высотой как значением x и весом как значением y, как показано на рисунке ниже.

Итак, теперь возникает вопрос, если предположить, что мой рост составляет 1,8 м, могу ли я предсказать свой вес? Это проблема, которую пытается решить регрессия. Я хочу получить функцию, которая может предсказать мой вес после ввода моего роста.

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

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

Понятия, связанные с регрессией

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

Шаги для решения проблемы прогнозирования в рамках регрессионной модели:

  1. Накопление знаний: Мы называем сохраненное знание какОбучающий набор(Обучающий набор), в конце концов, для предсказания требуются прошлые данные в качестве эталона, что легко понять.
  2. учиться: Когда у нас есть данные, нам нужно изучить данные, зачем машинное обучение? Потому что, когда я говорю компьютеру, что моя модель является линейной (линейная функция) или какой-то другой тип функции, а затем заливаю данные прямо в нее, он может вернуть мне конечную функцию (параметры обучаются).
  3. предсказывать: После завершения обучения, когда принимаются новые данные (вход), мы можем предсказать результат на основе соответствия, полученного на этапе обучения.

Есть соревнование для Mengxin, чтобы потренироваться на kaggle, о Титанике.

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

Если вам интересно, вы можете узнать:kaggle-titanic

Coursera — Стэнфордское машинное обучение

текст

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

Линейная регрессия LR (линейная регрессия)

С математической точки зрения, для примера, описываемого d атрибутамиx=(x1;x2;...;xd)xiявляется значением x для i-го атрибута, и линейная модель пытается изучить функцию, которая предсказывает через линейную комбинацию атрибутов, а именно

Обычно в векторной форме

Что, ты сказал, что был старшеклассником и не знал, что такое Т? Посмотрите транспонирование матрицы или вектора. Конечно, надо смотреть на умножение матриц, ведь есть матрица из 1 строки и n столбцов, умноженная на матрицу из n строк и одного столбца.

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

В общем, мы бы дали w и b начальное значение, затем мы идемисправитьЭти значения используются, чтобы сделать эти значения ожидаемыми, так как же нам исправить эти значения? нам нужнофункция потерь(функция потерь), эта функция используется для указания разницы между моим прогнозируемым значением и фактическим значением обучающих данных.

тогда этофункция потерьЧто такое (функция потерь) и как мы ее используем дляисправитьНаши параметры w и b см. ниже.

Градиентный спуск

Здесь я говорю только о методе градиентного спуска, если он мне понадобится позже, я вернусь и добавлю его.

Я не знаю, знаете ли вы эвристический поиск?

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

Например, когда я был первокурсником и второкурсником в университете, у меня был велосипед.Когда я был на парковке ночью, я часто забывал, где припаркована моя машина.Мне потребовалось много времени, чтобы найти его.Это называетсяСлепой поиск, поиск в ширину (BFS) и поиск в ширину (DFS) являются слепыми поисками.

Итак, если у меня в руке есть черная технология, которая может сказать мне, как далеко я от своей машины, могу ли я использовать это в качестве основы для поиска в направлении уменьшения расстояния? Этоэвристический поиск(эвристический поиск), алгоритм поиска пути Astar (A*) и т. д. являются эвристическим поиском.

Эвристический поиск и машинное обучение имеют некоторые общие понятия, поэтому для машинного обучения мне также нужны и "Как далеко это от моей машины"Такой показатель, чтобы судить, насколько мои текущие параметры далеки от моих оптимальных параметров"Как далекоМы можем коллективно назвать такие вещифункция потерь(loss function)

Функция потери

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

где функцияJесть функция потерь (почему J, мне так любопытно), функцияhЭто гипотетическая функция, вы можете видеть, что за ней следует среднее значение квадратов разностей, а затем делится на 2.

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

Алгоритм градиентного спуска

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

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

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

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

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

тогда где α представляетскорость обучения(скорость обучения), чем больше значение, тем больше поправок будет делаться каждый раз, но это не максимально возможно, если слишком велико, то может "раскачаться" в нижней точке и не сойтись. Другие используют переменную скорость обучения, которая устанавливается высокой в ​​начале и постепенно снижается по мере приближения к надиру.

Далее, давайте посмотрим на результаты после вывода

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

Таким образом, каждая итерация будет вычислять m выборок, а объем вычислений велик. Итак, схемы оптимизации есть, если интересно, можете глянуть

Теперь мы знаем, как корректировать параметры, но то, что мы фактически получаем после корректировки, — это функция потерьминимума не обязательноминимум

Из-за разных начальных точек (начальных параметров) конечный результат может не быть глобальным оптимальным решением (функция минимальных потерь). Позвольте мне рассказать о нескольких методах оптимизации, которые я видел в арбузной книге.

  1. Инициализация с несколькими наборами различных значений параметров в любом случае заключается в поиске наилучшего результата из нескольких начальных точек.
  2. Используя технику «Simulated Annealing», моделируемый отжиг на каждом шаге принимает худший результат, чем текущее решение, с определенной вероятностью, тем самым помогая «выпрыгнуть» из локальных минимумов. На каждой итерации вероятность принятия «субоптимального решения» постепенно уменьшается с течением времени, что обеспечивает устойчивость алгоритма.
  3. Используя стохастический градиентный спуск, он добавляет случайные факторы при вычислении градиента, поэтому даже если он попадет в локальный минимум, вычисляемый им градиент все равно может быть не равен 0, поэтому есть шанс выскочить из локального минимума и продолжить поиск.

упражняться

Сказав всю эту теорию, пришло время написать код. Я собираюсь использовать Python для выполнения упражнений по линейной регрессии в Стэнфордском курсе машинного обучения. PDF, а также данные можно найти в моемРепозиторий GitHubзагрузить в

окрестности

Если вы не хотите, чтобы вас раздражала среда настройки, я действительно рекомендую установитьAnaconda, в дополнение скажу, что я использую Python3.x.

задний план

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

код и комментарии

# 参考http://www.johnwittenauer.net/machine-learning-exercises-in-python-part-1/
import os
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

# 计算损失,用了矢量化编程而不是for循环
def computeLoss(X, y, theta):  
    inner = np.power(((X * theta.T) - y), 2)
    return np.sum(inner) / (2 * len(X))

# 梯度下降部分
def gradientDescent(X, y, theta, alpha, iters):  
    temp = np.matrix(np.zeros(theta.shape))
    parameters = int(theta.ravel().shape[1])
    cost = np.zeros(iters)

    for i in range(iters):
        
        error = (X * theta.T) - y
        for j in range(parameters):
            term = np.multiply(error, X[:,j])
            temp[0,j] = theta[0,j] - ((alpha / len(X)) * np.sum(term))

        theta = temp
        cost[i] = computeLoss(X, y, theta)

    return theta, cost

# 读入训练数据
# windows用户路径可能需要修改下,后期有时间可能会做统一
def loadData(path):
    trainingData = pd.read_csv(path, header=None, names=['Population', 'Profit'])

    trainingData.head()

    trainingData.describe()

    trainingData.plot(kind='scatter', x='Population', y='Profit', figsize=(12,8))
    plt.show()
    return trainingData

trainingData = loadData(os.getcwd() + '/../data/ex1data1.txt')

# 在数据集前插入一列Ones作为常数系数,也就是y=k*x+b*1这种形式
trainingData.insert(0, 'Ones', 1)

# 将输入X以及输出y从数据集中分割
cols = trainingData.shape[1]  
X = trainingData.iloc[:,0:cols-1]  
y = trainingData.iloc[:,cols-1:cols]  

# 把pandas的DataFrames转换成numpy的矩阵
X = np.matrix(X.values)  
y = np.matrix(y.values)  
# 初始化参数为全0的,当然也可以初始化成其他的
theta = np.matrix(np.array([0,0]))  

# 各向量的维度
X.shape, theta.shape, y.shape  

# 初始损失函数值
computeLoss(X, y, theta)   # 32.07,后面可以看看训练完后的损失函数值

# 设置学习速率以及迭代次数
alpha = 0.01  
iters = 2000

# 使用梯度下降得到模型参数
theta_fin, loss = gradientDescent(X, y, theta, alpha, iters)  
theta_fin

# 计算训练后的参数的损失值
computeLoss(X, y, theta_fin)  # 4.47

# 为了画线用的,画出训练好后的直线
x = np.linspace(trainingData.Population.min(), trainingData.Population.max(), 100)  
f = theta_fin[0, 0] + (theta_fin[0, 1] * x)

fig, ax = plt.subplots(figsize=(12,8))  
ax.plot(x, f, 'r', label='Prediction')  
ax.scatter(trainingData.Population, trainingData.Profit, label='Traning Data')  
ax.legend(loc=2)  
ax.set_xlabel('Population')  
ax.set_ylabel('Profit')  
ax.set_title('Predicted Profit vs. Population Size')  
plt.show()

# 损失随着迭代次数的变化
fig, ax = plt.subplots(figsize=(12,8))  
ax.plot(np.arange(iters), loss, 'r')  
ax.set_xlabel('Iterations')  
ax.set_ylabel('Loss')  
ax.set_title('Error vs. Training Epoch')  
plt.show()

Объяснение на самом деле относительно ясно в комментариях, поэтому я не буду вдаваться в подробности.

результат

数据集
набор данных

训练结果
результаты обучения

误差Error随着迭代的减少
Ошибка Ошибка уменьшается с итерацией

Автор этой статьи - Лян Ван (lwio, lwyj123)

основная ссылкаСтэнфордский курс машинного обучения johnwittenauer

Ссылка на сайт