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