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

Бинарная классификация имеет четыре возможных результата:

  1. Истинно отрицательные значения: правильно спрогнозированные отрицательные значения (нули)
  2. Истинные положительные результаты: правильно предсказанные положительные результаты (единицы)
  3. Ложноотрицательные: ошибочно предсказанные отрицательные значения (нули)
  4. Ложные срабатывания: неверно предсказанные срабатывания (единицы)
  • Положительное прогностическое значение – это отношение числа истинных положительных результатов к сумме числа истинных и ложных положительных результатов.
  • Прогнозируемая ценность отрицательного результата — это отношение числа истинно отрицательных результатов к сумме числа истинно отрицательных и ложноотрицательных результатов.
  • Чувствительность (также известная как полнота или процент истинных положительных результатов) – это отношение количества истинных положительных результатов к количеству фактических положительных результатов.
  • Специфичность (или доля истинно отрицательных результатов) – это отношение числа истинно отрицательных результатов к количеству фактических отрицательных результатов.

Регуляризация.
Переобучение обычно происходит со сложными моделями. Регуляризация обычно пытается уменьшить сложность модели или снизить ее. Методы регуляризации, применяемые с логистической регрессией, в основном имеют тенденцию наказывать большие коэффициенты 𝑏₀, 𝑏₁, …, 𝑏ᵣ:

  • Регуляризация 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»