Изучите, внедрите и настройте…

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

Поскольку это метод «линейной» регрессии, при построении гипотезы будет использоваться только линейный член каждого признака. Пусть x_1, x_2,… x_n будут функциями, от которых зависит целевой результат. Затем гипотеза многомерной линейной регрессии:

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

Также существует функция стоимости (или функция потерь), связанная с гипотезой, зависящая от параметров, theta_0, theta_1, theta_2,…, theta_n.

Функция стоимости здесь такая же, как и в случае полиномиальной регрессии [1].

Таким образом, эти параметры, theta_0, theta_1, theta_2,…, theta_n должны принимать такие значения, для которых функция стоимости (или просто стоимость) достигает минимально возможного значения. Другими словами, необходимо определить минимумы функции стоимости.

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

Реализация многовариантной линейной регрессии с использованием пакетного градиентного спуска:

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

= ›Hypothesis (): это функция, которая вычисляет и выводит значение гипотезы целевой переменной с учетом тета (theta_0, theta_1, theta_2, theta_3,…., Theta_n), характеристик в матрице, X размерности [m X (n + 1)], где m - количество выборок, а n - количество функций. Реализация гипотезы () представлена ​​ниже:

def hypothesis(theta, X, n):
    h = np.ones((X.shape[0],1))
    theta = theta.reshape(1,n+1)
    for i in range(0,X.shape[0]):
        h[i] = float(np.matmul(theta, X[i]))
    h = h.reshape(X.shape[0])
    return h

= ›BGD (): это функция, которая выполняет алгоритм пакетного градиентного спуска, принимая текущее значение тета (theta_0, theta_1,…, theta_n), скорость обучения (альфа), количество итераций (num_iters), список значений гипотез все образцы (h), набор функций (X), набор целевых переменных (y) и количество функций (n) в качестве входных и выводит оптимизированные тета (theta_0, theta_1, theta_2, theta_3,…, theta_n) и историю затрат или cost, которая содержит значение функции стоимости на всех итерациях. Ниже представлена ​​реализация BGD ():

def BGD(theta, alpha, num_iters, h, X, y, n):
    cost = np.ones(num_iters)
    for i in range(0,num_iters):
        theta[0] = theta[0] - (alpha/X.shape[0]) * sum(h - y)
        for j in range(1,n+1):
            theta[j] = theta[j] - (alpha/X.shape[0]) * 
                                   sum((h-y) * X.transpose()[j])
        h = hypothesis(theta, X, n)
        cost[i] = (1/X.shape[0]) * 0.5 * sum(np.square(h - y))
    theta = theta.reshape(1,n+1)
    return theta, cost

= ›Linear_regression (): это основная функция, которая принимает матрицу характеристик (X), вектор целевой переменной (y), скорость обучения (альфа) и количество итераций (num_iters) в качестве входных данных и выводит окончательную оптимизированную тета, т. Е. значения [theta_0, theta_1, theta_2, theta_3,…., theta_n] , для которых функция стоимости почти достигает минимума после пакетного градиентного спуска и стоимости , который сохраняет значение стоимости для каждой итерации.

def linear_regression(X, y, alpha, num_iters):
    n = X.shape[1]
    one_column = np.ones((X.shape[0],1))
    X = np.concatenate((one_column, X), axis = 1)
    # initializing the parameter vector...
    theta = np.zeros(n+1)
    # hypothesis calculation....
    h = hypothesis(theta, X, n)
    # returning the optimized parameters by Gradient Descent...
    theta, cost = BGD(theta,alpha,num_iters,h,X,y,n)
    return theta, cost

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

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



Постановка проблемы: «Учитывая размер дома и количество спален, проанализируйте и спрогнозируйте возможную цену дома»

Чтение данных в массивы Numpy:

data = np.loadtxt('data2.txt', delimiter=',')
X_train = data[:,[0,1]] #feature set
y_train = data[:,2] #label set

Нормализация функций или масштабирование функций:

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

где u - среднее значение, а сигма - стандартное отклонение:

Реализация масштабирования функций:

mean = np.ones(X_train.shape[1])
std = np.ones(X_train.shape[1])
for i in range(0, X_train.shape[1]):
    mean[i] = np.mean(X_train.transpose()[i])
    std[i] = np.std(X_train.transpose()[i])
    for j in range(0, X_train.shape[0]):
        X_train[j][i] = (X_train[j][i] - mean[i])/std[i]

Здесь,

  1. Среднее значение признака «размер дома (в квадратных футах)» или F1: 2000,6808
  2. Среднее значение признака «количество спальных комнат» или F2: 3,1702
  3. Стандартное отклонение F1: 7.86202619e + 02
  4. Стандартное отклонение F2: 7,52842809e-01
# calling the principal function with learning_rate = 0.0001 and 
# num_iters = 300000
theta, cost = linear_regression(X_train, y_train,
                                               0.0001, 300000)

Стоимость была снижена в ходе итерации за итерацией пакетного градиентного спуска. Снижение стоимости показано с помощью Line Curve.

import matplotlib.pyplot as plt
cost = list(cost)
n_iterations = [x for x in range(1,300001)]
plt.plot(n_iterations, cost)
plt.xlabel('No. of iterations')
plt.ylabel('Cost')

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

= ›Визуализация фактической целевой переменной:

from matplotlib import pyplot
from mpl_toolkits.mplot3d import Axes3D
sequence_containing_x_vals = list(X_train.transpose()[0])
sequence_containing_y_vals = list(X_train.transpose()[1])
sequence_containing_z_vals = list(y_train)
fig = pyplot.figure()
ax = Axes3D(fig)
ax.scatter(sequence_containing_x_vals, sequence_containing_y_vals,
           sequence_containing_z_vals)
ax.set_xlabel('Living Room Area', fontsize=10)
ax.set_ylabel('Number of Bed Rooms', fontsize=10)
ax.set_zlabel('Actual Housing Price', fontsize=10)

= ›Визуализация целевой переменной прогноза:

# Getting the predictions...
X_train = np.concatenate((np.ones((X_train.shape[0],1)), X_train)
                         ,axis = 1)
predictions = hypothesis(theta, X_train, X_train.shape[1] - 1)
from matplotlib import pyplot
from mpl_toolkits.mplot3d import Axes3D
sequence_containing_x_vals = list(X_train.transpose()[1])
sequence_containing_y_vals = list(X_train.transpose()[2])
sequence_containing_z_vals = list(predictions)
fig = pyplot.figure()
ax = Axes3D(fig)
ax.scatter(sequence_containing_x_vals, sequence_containing_y_vals,
           sequence_containing_z_vals)
ax.set_xlabel('Living Room Area', fontsize=10)
ax.set_ylabel('Number of Bed Rooms', fontsize=10)
ax.set_zlabel('Housing Price Predictions', fontsize=10)

Анализ эффективности:

  1. Средняя абсолютная ошибка: 51502,7803 (в долларах)
  2. Среднеквадратичная ошибка: 4086560101,2158 (в квадрате долларов)
  3. Среднеквадратичная ошибка: 63926.2082 (в долларах)
  4. Оценка R-Square: 0,7329

Следует отметить, что средняя абсолютная ошибка, среднеквадратическая ошибка и среднеквадратическая ошибка не являются безразмерными. Чтобы сделать их безразмерными, перед обучением модели целевую метку можно масштабировать таким же образом, как масштабировались элементы. Помимо этого, также получен спусковой R-Square-Score 0,7329.

Это все о реализации многовариантной линейной регрессии в Python с использованием градиентного спуска с нуля.

ССЫЛКИ

[1] https://towardsdatascience.com/implementation-of-uni-variate-linear-regression-in-python-using-gradient-descent-optimization-from-3491a13ca2b0

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