Для задач регрессии хорошей отправной точкой является линейная регрессия, поскольку она проста, быстра, легко подгоняется и интерпретируется. Его также можно распространить на сложные проблемы и шаблоны данных.
Линейная регрессия
В линейной регрессии мы подгоняем прямую линию к данным (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)