Изучите, внедрите и настройте…
Большинство практических приложений машинного обучения включают в себя несколько функций, от которых зависит целевой результат. Точно так же в задачах регрессионного анализа бывают случаи, когда целевой результат зависит от множества функций. Многовариантная линейная регрессия - возможное решение таких проблем. В этой статье я буду обсуждать многовариантную (множественные функции) линейную регрессию, ее реализацию на 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]
Здесь,
- Среднее значение признака «размер дома (в квадратных футах)» или F1: 2000,6808
- Среднее значение признака «количество спальных комнат» или F2: 3,1702
- Стандартное отклонение F1: 7.86202619e + 02
- Стандартное отклонение 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)
Анализ эффективности:
- Средняя абсолютная ошибка: 51502,7803 (в долларах)
- Среднеквадратичная ошибка: 4086560101,2158 (в квадрате долларов)
- Среднеквадратичная ошибка: 63926.2082 (в долларах)
- Оценка R-Square: 0,7329
Следует отметить, что средняя абсолютная ошибка, среднеквадратическая ошибка и среднеквадратическая ошибка не являются безразмерными. Чтобы сделать их безразмерными, перед обучением модели целевую метку можно масштабировать таким же образом, как масштабировались элементы. Помимо этого, также получен спусковой R-Square-Score 0,7329.
Это все о реализации многовариантной линейной регрессии в Python с использованием градиентного спуска с нуля.
ССЫЛКИ
Для личных контактов по поводу статьи или обсуждений машинного обучения / интеллектуального анализа данных или любого отдела науки о данных, не стесняйтесь обращаться ко мне в LinkedIn.