Това резюме има за цел да предостави общ преглед на най-често използваните модели за машинно обучение в 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)))

Референтни връзки: