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

Линейная регрессия

В линейной регрессии мы подгоняем прямую линию к данным (y=ax+b; где a — наклон, а b — точка пересечения линии), или ее также можно представить как:

ŷ = θ0 + θ1x1 + θ2x2 + ⋯ + θnxn

где ŷ — прогнозируемое значение, n — количество предикторов/признаков, xi — i-й предиктор, а θ — параметр модели, где θ0 — смещение, а θj — вес каждого признака.

В векторном виде это можно представить как:

ŷ = hθ(x) = θ · x ; где hθ — функция гипотезы, использующая параметры модели θ.

from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score
lr_model = LinearRegression(fit_intercept=True)
lr_model.fit(x_train, y_train)
y_pred = lr_model.predict(x_test)
print("Coefficients or slope: \n", lr_model.coef_)
print("Model intercept:", lr_model.intercept_)
print("Mean squared error: %.2f" % mean_squared_error(y_test, y_pred))
print("Coefficient of determination/R-square: 1 is perfect prediction: %.2f" % r2_score(y_test, y_pred))
print("Adjusted R-square, where n is number of samples and p is number of predictors:" % 1-(1-R2)*(n-1)/(n-p-1))

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

Допущения линейной регрессии:

  • Линейная зависимость: существует линейная зависимость между независимой переменной x и зависимой переменной y.
  • Независимость: остатки независимы.
  • Гомоскедастичность: остатки имеют постоянную дисперсию на каждом уровне x.
  • Отсутствие или небольшая мультиколинеарность
  • Нормальность: при любом фиксированном значении X Y нормально распределяется.

Полиномиальная регрессия:

Обучающие данные иногда могут быть сложными (с кривыми), и в таких случаях мы не можем исправить прямую линию. Таким образом, мы можем использовать полиномиальную регрессию в таких случаях, имея мощности (a2, a3, b2 и т. д.) функций, а также комбинацию функций (a2b, b3a и т. д.). При высоких степенях полиномов модель будет соответствовать (высокая дисперсия). Чтобы избежать переобучения, вы можете использовать кривые перекрестной проверки и обучения.

from sklearn.pipeline import make_pipeline
poly_model = make_pipeline(PolynomialFeatures(7),LinearRegression())
poly_model.fit(x_train, y_train)
y_pred = poly_model.predict(x_test)
print(poly_model.intercept_, poly_model.coef_)

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

Регрессия хребта (регуляризация L2):

Коэффициенты хребта минимизируют оштрафованную остаточную сумму квадратов (2-нормы) коэффициентов модели. Параметр сложности (α≥0) определяет величину усадки или применяемого штрафа. Если α равно нулю, то гребенчатая регрессия представляет собой простую линейную регрессию, в то время как при большом значении α увеличивается степень усадки, и, таким образом, коэффициенты становятся более устойчивыми к коллинеарности (близкими к нулю), и результатом является прямая плоская линия, проходящая через среднее значение данных.

from sklearn.linear_model import Ridge
ridge_reg = Ridge(alpha=1, solver="cholesky")
ridge_reg.fit(x_train, y_train)
y_pred = ridge_reg.predict(y_test)

Лассо-регрессия (регуляризация L1):

В Лассо мы штрафуем сумму абсолютных значений (1-норма) коэффициентов модели. Лассо использует норму L1 вектора весов, а оценка решает задачу минимизации штрафа по методу наименьших квадратов с добавлением α||w||1, где α — константа, а ||w||1 — ℓ1-норма коэффициента вектор. Лассо-регрессия автоматически выполняет выбор функций, исключая веса неважных функций (устанавливая их равными нулю), и на выходе получается разреженная модель.

from sklearn.linear_model import Ridge, Lasso
lasso_reg = Ridge(alpha=1)
lasso_reg.fit(x_train, y_train)
y_pred = lasso_reg.predict(y_test)

Эластичная сетка:

Эластичная сеть представляет собой смесь гребневой и лассо-линейной моделей, поскольку она обучается с нормами L1 и L2 регуляризации коэффициентов. Мы управляем выпуклой комбинацией ℓ1 и ℓ2, используя параметр l1_ratio или коэффициент смешивания r. Вы можете использовать гребневую регрессию по умолчанию, но если у вас есть данные с бесполезными функциями, вы можете использовать лассо или эластичную сеть. Если функции коррелируют друг с другом, вы можете использовать эластичную сеть.

from sklearn.linear_model import ElasticNet
elastic_net = ElasticNet(alpha=0.1, l1_ratio=0.5)
elastic_net.fit(x_train, y_train)
y_pred = elastic_net.predict(y_test)

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

Градиентный спуск – это общий алгоритм оптимизации для решения различных типов задач. Чтобы понять это интуитивно, предположим, что вы находитесь в горном походе и заблудились после достижения вершины горы, так как солнце уже село и света нет. Вы знаете, что внизу есть деревня, где вы можете поесть и сесть на автобус, чтобы вернуться домой. Итак, что вы будете делать, так это делать один шаг за раз к самому крутому склону, пока не доберетесь до деревни. Градиентный спуск работает так же, как он измеряет локальный градиент (частную производную) функции ошибки относительно вектора параметров θ и движется в направлении нисходящего градиента. Вы достигли минимальной или нижней деревни, когда градиент равен нулю. Размер шага определяется параметром скорость обучения. Если скорость обучения мала, для достижения минимума/схождения потребуется много времени, но если она велика, то она может пропустить минимумы. Вы можете использовать поиск по сетке или случайный поиск, чтобы получить хорошую скорость обучения и итерации. При использовании градиентного спуска убедитесь, что вы выполняете масштабирование признаков, чтобы все предикторы были в одном масштабе (используя StandardScaler, т. е. стандартизацию Z-оценки) для более быстрой сходимости.

Поэтому вам нужно знать направление, в котором нужно сделать шаг, то есть насколько изменится функция стоимости, если вы измените θj (частная производная функции стоимости в текущей точке) и насколько большой шаг вам нужен. взять, т. е. скорость обучения. Градиент — это вектор, имеющий направление и величину, а скорость обучения — это скаляр, который мы умножаем на градиент. Таким образом, небольшая скорость обучения потребует много времени для обучения, в то время как для большой скорости обучения мы можем выйти за пределы минимума.

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

При малой скорости обучения обучение займет много времени, а при большой скорости обучения обучение будет колебаться. Хорошо от 40 до 100.

Большие партии требуют меньших скоростей обучения.

Для небольшого размера партии обучение будет скачкообразным, а для большой скорости обучения обучение займет много времени. Ставка по умолчанию — 0,2 или 1/sqrt(num_of_features).

Существуют различные способы реализации градиентного спуска, такие как:

  • batch — использует весь пакет обучающих данных на каждом этапе; так это медленно
  • Стохастический —выбирает случайный экземпляр обучающих данных и вычисляет градиент для этого единственного экземпляра, чтобы это происходило быстрее. Это никогда не может достичь оптимальных/глобальных минимумов, но может отскочить от локальных минимумов.
  • мини-пакет — вычисляет градиент для случайных наборов экземпляров (мини-пакетов от 10 до 1000 примеров). Он может застрять в локальных минимумах.
from sklearn.linear_model import SGDClassifier
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import make_pipeline
sgdc = make_pipeline(StandardScaler(), SGDClassifier(loss="hinge", penalty="l2", max_iter=5))
sgdc.fit(x_train, y_train)
y_pred = sgdc.predict(x_test)

Логистическая регрессия:

Логистическая регрессия используется для классификации проблем ML (выходная/зависимая переменная является категориальной) путем оценки вероятности того, что экземпляр будет принадлежать к определенному классу (мошенническая или не мошенническая транзакция). Он использует логистическую/сигмовидную функцию (S-образную), которая выводит число от 0 до 1.

Логистическая регрессия оценивает вероятность p = hθ(x), где, если она выше 0,5, прогноз будет 1/положительным, а если ниже 0,5, то прогноз будет 0/отрицательным.

Реализация логистической регрессии Scikit-learn поддерживает бинарную, One-vs-Rest или полиномиальную логистическую регрессию с дополнительной регуляризацией ℓ1, ℓ2 (по умолчанию) или Elastic-Net и различными решателями, такими как «liblinear», «newton-cg», «lbfgs». , «провисание» и «сага».

from sklearn.linear_model import LogisticRegression
lr = ElasticNet(alpha=0.1, l1_ratio=0.5)
lr.fit(x_train, y_train)
y_pred = lr.predict(y_test)