Это краткое изложение призвано предоставить обзор наиболее часто используемых моделей машинного обучения в Python, включая линейную регрессию, логистическую регрессию, деревья решений, случайные леса, машины опорных векторов и нейронные сети. В сводке будут рассмотрены линейная регрессия и логистическая регрессия, а также некоторые рекомендации по их реализации в Python.
Линейная регрессия
Логистическая регрессия
Линейная регрессия
Уравнение простой линейной регрессии, где bo — точка пересечения, b1 — коэффициент или наклон, x — независимая переменная, а y — зависимая переменная.
Уравнение множественной линейной регрессии, где bo — точка пересечения, b1,b2,b3,b4…,bn — коэффициенты или наклоны независимых переменных x1,x2,x3,x4…,xn, а y — зависимая переменная.
Остаток = фактические значения – прогнозные значения
Сумма остатков = сумма (фактические прогнозируемые значения)
Квадрат суммы остатков = (сумма (фактические прогнозируемые значения))^2
1. Простая линейная регрессия с помощью scikit-learn:
import numpy as np from sklearn.linear_model import LinearRegression x = np.array([5, 15, 25, 35, 45, 55]).reshape((-1, 1)) y = np.array([5, 20, 14, 32, 22, 38]) model = LinearRegression() model.fit(x, y) model = LinearRegression().fit(x, y) r_sq = model.score(x, y) print(f"coefficient of determination: {r_sq}") print(f"intercept: {model.intercept_}") print(f"slope: {model.coef_}") y_pred = model.predict(x) print(f"predicted response:\n{y_pred}")
2. Множественная линейная регрессия с помощью scikit-learn
import numpy as np from sklearn.linear_model import LinearRegression x = [[0, 1], [5, 1], [15, 2], [25, 5], [35, 11], [45, 15], [55, 34], [60, 35]] y = [4, 5, 20, 14, 32, 22, 38, 43] x, y = np.array(x), np.array(y) model = LinearRegression().fit(x, y) r_sq = model.score(x, y) print(f"coefficient of determination: {r_sq}") print(f"intercept: {model.intercept_}") print(f"coefficients: {model.coef_}") y_pred = model.predict(x) print(f"predicted response:\n{y_pred}") y_pred = model.intercept_ + np.sum(model.coef_ * x, axis=1) print(f"predicted response:\n{y_pred}")
3. Полиномиальная регрессия с помощью scikit-learn
import numpy as np from sklearn.linear_model import LinearRegression from sklearn.preprocessing import PolynomialFeatures x = np.array([5, 15, 25, 35, 45, 55]).reshape((-1, 1)) y = np.array([15, 11, 2, 8, 25, 32]) transformer = PolynomialFeatures(degree=2, include_bias=False) transformer.fit(x) x_ = transformer.transform(x) model = LinearRegression().fit(x_, y) r_sq = model.score(x_, y) print(f"coefficient of determination: {r_sq}") print(f"intercept: {model.intercept_}") print(f"coefficients: {model.coef_}") y_pred = model.predict(x_) print(f"predicted response:\n{y_pred}")
import matplotlib.pyplot as plt plt.scatter(x,y,color ='lavender') plt.plot(x,y_pred,color='pink',linewidth=3) plt.xticks(()) plt.yticks(()) plt.show()
Логистическая регрессия
В простейшей форме логистическая регрессия может быть выражена с помощью следующего уравнения:
P(Y=1|X) = 1/(1+exp(-z))
где P(Y=1|X) — вероятность положительного исхода, X — входная переменная, z — линейная комбинация входных переменных и их коэффициентов.
Логистическая функция (1/(1+exp(-z))) используется для сопоставления выхода линейной функции с вероятностью от 0 до 1. Если вероятность больше 0,5, мы прогнозируем положительный результат, а если меньше 0,5, прогнозируем отрицательный исход.
Бинарная классификация имеет четыре возможных результата:
- Истинно отрицательные значения: правильно спрогнозированные отрицательные значения (нули)
- Истинные положительные результаты: правильно предсказанные положительные результаты (единицы)
- Ложноотрицательные: ошибочно предсказанные отрицательные значения (нули)
- Ложные срабатывания: неверно предсказанные срабатывания (единицы)
- Положительное прогностическое значение – это отношение числа истинных положительных результатов к сумме числа истинных и ложных положительных результатов.
- Прогнозируемая ценность отрицательного результата — это отношение числа истинно отрицательных результатов к сумме числа истинно отрицательных и ложноотрицательных результатов.
- Чувствительность (также известная как полнота или процент истинных положительных результатов) – это отношение количества истинных положительных результатов к количеству фактических положительных результатов.
- Специфичность (или доля истинно отрицательных результатов) – это отношение числа истинно отрицательных результатов к количеству фактических отрицательных результатов.
Регуляризация.
Переобучение обычно происходит со сложными моделями. Регуляризация обычно пытается уменьшить сложность модели или снизить ее. Методы регуляризации, применяемые с логистической регрессией, в основном имеют тенденцию наказывать большие коэффициенты 𝑏₀, 𝑏₁, …, 𝑏ᵣ:
- Регуляризация L1 штрафует LLF масштабированной суммой абсолютных значений весов: |𝑏₀|+|𝑏₁|+⋯+|𝑏ᵣ|.
- Регуляризация L2 штрафует LLF с помощью масштабированной суммы квадратов весов: 𝑏₀²+𝑏₁²+⋯+𝑏ᵣ².
- Регуляризация эластичной сети представляет собой линейную комбинацию регуляризации L1 и L2.
import matplotlib.pyplot as plt import numpy as np from sklearn.linear_model import LogisticRegression from sklearn.metrics import classification_report, confusion_matrix x = np.arange(10).reshape(-1, 1) y = np.array([0, 0, 0, 0, 1, 1, 1, 1, 1, 1]) model = LogisticRegression(solver='liblinear', random_state=0) model.fit(x, y) #.predict_proba() returns the matrix of probabilities that the predicted output is equal to zero or one: model.predict_proba(x) #or can get the actual predictions, based on the probability matrix and the values of 𝑝(𝑥), with .predict(): model.predict(x) model.score(x, y) cm = confusion_matrix(y, model.predict(x)) fig, ax = plt.subplots(figsize=(8, 8)) ax.imshow(cm) ax.grid(False) ax.xaxis.set(ticks=(0, 1), ticklabels=('Predicted 0s', 'Predicted 1s')) ax.yaxis.set(ticks=(0, 1), ticklabels=('Actual 0s', 'Actual 1s')) ax.set_ylim(1.5, -0.5) for i in range(2): for j in range(2): ax.text(j, i, cm[i, j], ha='center', va='center', color='red') plt.show()
- Три истинных отрицательных прогноза: первые три наблюдения — это нули, предсказанные правильно.
- Отсутствие ложноотрицательных прогнозов: это те прогнозы, которые были ошибочно предсказаны как нули.
- Один ложноположительный прогноз. Четвертое наблюдение — это ноль, который был ошибочно предсказан как единица.
- Шесть истинно положительных прогнозов. Последние шесть наблюдений были предсказаны правильно.
print(classification_report(y, model.predict(x)))
Чтобы улучшить модель, установите силу регуляризации C
равной 10.0
вместо значения по умолчанию 1.0
:
model = LogisticRegression(solver='liblinear', C=10.0, random_state=0) model.fit(x, y) print(classification_report(y, model.predict(x)))
Справочные ссылки:
Линейная регрессия в Python — настоящий Python
Пройдите тест Регрессионный анализ — одна из важнейших областей статистики и машинного обучения. Есть…realpython.com»