---
# System prepended metadata

title: Logistic regression model
tags: [' model', ' smote', data-science, ' machine-learning', ' sklearn', ' analytical-model', ' propensity-model', ' logistic-regression', ' data-analytic']

---

---
title: Logistic regression model
description: My machine learning journey start with logistic regression model
tags: data-science, analytical-model, data-analytic, model, propensity-model, logistic-regression, machine-learning, sklearn, smote
---

# Logistic Regression Model
Related post:
- [Propensity model 101](/daZbO7I_Q1adbPL8XopVFw)

**Questions need to answer:**
- What is it?
- What is it used for?
- What are its underlying assumptions?
- How to check multicollinearity between independent variables?

## Logistic Regression in Python
(Step by step)
**List references:**
- Medium: [Building a logistic regression in python step by step](https://towardsdatascience.com/building-a-logistic-regression-in-python-step-by-step-becd4d56c9c8)
- 

(More on my Evernote)

- Descriptively check the relationship between independent and dependent variables to have an overview on which variable might have a large explaination power on desired feature by visualization (check frequency by countplot, or scatter plot/histogram for continuous variables)

- Create dummies variables for each categorical feature
Example: 
```python
cat_vars=['job','marital','education','default','housing','loan','contact','month','day_of_week','poutcome']
for var in cat_vars:
    cat_list='var'+'_'+var
    cat_list = pd.get_dummies(data[var], prefix=var)
    data1=data.join(cat_list)
    data=data1

cat_vars=['job','marital','education','default','housing','loan','contact','month','day_of_week','poutcome']
data_vars=data.columns.values.tolist()
to_keep=[i for i in data_vars if i not in cat_vars]
```

- Check whether the dataset is imbalanced

Which leads us to:
### Imbalanced dataset
**Definition**: There is a dominance in frequency for one category over other categories of target feature in your dataset.

**How to solve this problem**: two techniques
- Over-sampling method: SMOTE aka Synthetic Minority Over-sampling Technique
    + SMOTE create synthetic samples (not duplicate samples) of the minority class hence making the minority class equal to the majority class
    + SMOTE select similar record and alter that record one column at a time by a random amount within the difference to the neighbouring records (Original paper on SMOTE, published in 2002, [here](https://jair.org/index.php/jair/article/view/10302))

- Under-sampling method: NearMiss
    + Make the majority class equal to minority class


## Other questions
- What `random_state` is, in function `train_test_split(X, y, test_size=0.3, random_state=0)`
- Accuracy score in model expressed as `logreg.score(X_test, y_test)v` in which `logreg = LogisticRegression()`
- Confusion matrix
- Compute precision, recall, F-measure, and support ([Source](http://scikit-learn.org/stable/index.html))
- ROC curve ([receiver operating characteristic](https://en.wikipedia.org/wiki/Receiver_operating_characteristic))
    - Dotted line represents the ROC curve of a purely random classifier
    - A good classifier stays as far away from that line as possible (toward the top-left corner)

Some important metrics to intepret data model:
- Classification Accuracy or **accuracy score**: is the ratio of number of correct predictions to the total number of input samples
    + Accuracy = Number of Correct predictions/Total number of prediction made
    + Accuracy score works well only if there are equal number of samples belonging to each class (which means the sample is balanced)
    + Common mistake with accuracy score: Easily gives us a false sense of achieving high accuracy
- Logarithmic loss or **log loss**: works by penalizing the false classification --> Would work well for multi-class classification
- Confusion matrix
- Area under curve (AUC): is used for binary classification problem
    + True Positive Rate (Sensitivity): TP/(FN+TP)
    + False Positive Rate (Specificity): FP/(FP+TN)
    + AUC has a range of [0, 1], the greater the value, the better is the performance of our model
- F1 Score: is used to measure the test's accuracy, is the harmonic mean between precision and recall, with range of [0, 1]
    + F1 Score = how precise your classifier is as well as how robust it is
    + The greater the F1 Score, the better is the performance of our model
    + F1 = 2 * 1/(1/precision + 1/recall)
- Recall: is the number of correct positive results divided by the number of all relevant samples (all samples that should have been identified as positive)
    + Recall = True Positives/(True Positives + False Negatives)
- Precision: is the number of correct positive results divided by the number of positive results predicted by the classifier
    + Precision = True Positives/(True Positives + False Positives)
- Mean Absolute Error: is the average of the difference between the Original Values and the Predicted Values --> how far the predictions were from the actual output
- Mean squared error (MSE): similar to mean absolute error but is squared

References for 
- [Metrics to evaluate your machine learning algorithm](https://towardsdatascience.com/metrics-to-evaluate-your-machine-learning-algorithm-f10ba6e38234)
- [Accuracy, Precision, Recall and F1 score interpretation of performance measures](https://blog.exsilio.com/all/accuracy-precision-recall-f1-score-interpretation-of-performance-measures/)
- [Module sklearn.metrics](https://scikit-learn.org/stable/modules/classes.html#module-sklearn.metrics)
- [How to score probability predictions in Python](https://machinelearningmastery.com/how-to-score-probability-predictions-in-python/)
- [How to Make predictions with scikit-learn](https://machinelearningmastery.com/make-predictions-scikit-learn/)





