Логистична регресия
• Контролиран машинен алгоритъм, който предвижда вероятността за възникване на двоично събитие
• Например определяне дали има вероятност дадено лице да има диабет; ще има два възможни изхода, „да“, те имат диабет, или „не“, те нямат диабет
• Този метод е известен като двоична класификация

По какво се различава логистичната регресия от линейната регресия?
• При линейната регресия целевият резултат е числена непрекъсната стойност, докато при логистичната регресия целевият резултат е числено дискретен и ограничен до конкретни стойности

Видове логистична регресия
• Двоична — има два възможни числени дискретни резултата
• Многочленна — има множество числени дискретни резултати
• Поредна — има множество числени дискретни резултати, подредени в категории (редни)

Справка: https://www.capitalone.com/tech/machine-learning/what-is-logistic-regression/

Сега ще разгледаме набора от данни на mtcars и ще предвидим дали колата е автоматична или ръчна, използвайки логистична регресия.

Намерете повече информация за mtcars тук: https://www.rdocumentation.org/packages/datasets/versions/3.6.2/topics/mtcars

%time
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import sklearn
# Import CSV mtcars
df = pd.read_csv('https://gist.githubusercontent.com/ZeccaLehn/4e06d2575eb9589dbe8c365d61cb056c/raw/64f1660f38ef523b2a1a13be77b002b98665cdfe/mtcars.csv')
# Edit element of column header
df.rename(columns={'Unnamed: 0':'brand'}, inplace=True)

df.head()

df.describe()

# Split into features (X) and target (y) subsets
X = df[['mpg', 'cyl', 'disp', 'hp', 'drat', 'wt', 'qsec', 'vs', 'gear', 'carb']]
y = df[['am']]
# Split into test/train sets
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
# Print subset dimensions
X_train.shape, y_train.shape, X_test.shape, y_test.shape

# Normalise train/test sets
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()

X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.fit(X_test)
# Define regression model
from sklearn import linear_model
lm = linear_model.LogisticRegression()

# Build training model
model = lm.fit(X_train_scaled, y_train)
# Print model coefficients and intercept value
print(model.coef_)
print(model.intercept_)

# Apply trained model to make prediction (on test set)
y_pred = model.predict(X_test)
y_pred

# Print accuracy score
from sklearn.metrics import accuracy_score
test_acc = accuracy_score(y_test, y_pred)
print("The accuracy for test set is {}".format(test_acc*100), "%")

# Print classification report
from sklearn.metrics import classification_report
print(classification_report(y_test,y_pred))

# Print confusion matrix
from sklearn.metrics import confusion_matrix
print(confusion_matrix(y_test,y_pred))

# Visualise feature importance
importances = pd.DataFrame(data={
    'Attribute': X_train.columns,
    'Importance': model.coef_[0]
})
importances = importances.sort_values(by='Importance', ascending=False)

plt.bar(x=importances['Attribute'], height=importances['Importance'], color='#087E8B')
plt.title('Feature importances obtained from coefficients', size=20)
plt.xticks(rotation='vertical')
plt.show()