Criando seu primeiro projeto de machine learning com deploy: Parte 1

Objetivo do projeto

Dados Utilizados para o Treinamento

  • Loan_ID: Identificação única de cada solicitação de empréstimo.
  • Gender: Gênero do solicitante.
  • Married: Status de casamento do solicitante.
  • Dependents: Número de dependentes do solicitante.
  • Education: Nível de escolaridade do solicitante.
  • Self_Employed: Indicação se o solicitante é autônomo.
  • ApplicantIncome: Renda mensal do solicitante.
  • CoapplicantIncome: Renda mensal do co-solicitante, se houver.
  • LoanAmount: Valor solicitado de empréstimo.
  • Loan_Amount_Term: Prazo do empréstimo em meses.
  • Credit_History: Histórico de crédito do solicitante.
  • Property_Area: Localização do imóvel do solicitante.
  • Loan_Status: Status de aprovação do empréstimo, que será o alvo (label) do modelo.

Preparando o ambiente de desenvolvimento

  1. Escolha a sua IDE de preferência, neste tutorial utilizaremos o VSCode
  2. Crie uma nova pasta para o seu projeto, aqui chamamos de “LOAN_PREDICTION”
  3. Abra o terminal de sua preferência na IDE e vamos criar o ambiente virtual
  4. Para criar o ambiente virtual, vamos utilizar a biblioteca venv.
# Criar um ambiente virtual
python -m venv .venv

# Ativar o ambiente virtual
cd .venv/Scripts
activate

Instalando as bibliotecas necessárias

pip install pandas numpy matplotlib seaborn scikit_learn streamlit imblearn

Criando o nosso Notebook para analisar os dados

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

# Import para o treinamento
import sklearn

# Ignorar os  Warnings
import warnings
warnings.filterwarnings("ignore")
plt.style.use('fivethirtyeight')
data = pd.read_csv('LoanData.csv')
data.head()

7. Verificando o tamanho da base de dados

data.shape
(614, 13)
# 614 linhas e 13 columnas
data.describe()
data.describe(include = 'object')

Tratamento de valores nulos e outliers

data.isnull().sum()
Loan_ID               0
Gender               13
Married               3
Dependents           15
Education             0
Self_Employed        32
ApplicantIncome       0
CoapplicantIncome     0
LoanAmount           22
Loan_Amount_Term     14
Credit_History       50
Property_Area         0
Loan_Status           0
dtype: int64
data['Gender'] = data['Gender'].fillna(data['Gender'].mode()[0])
data['Married'] = data['Married'].fillna(data['Married'].mode()[0])
data['Dependents'] = data['Dependents'].fillna(data['Dependents'].mode()[0])
data['Self_Employed'] = data['Self_Employed'].fillna(data['Self_Employed'].mode()[0])
data['LoanAmount'] = data['LoanAmount'].fillna(data['LoanAmount'].median())
data['Loan_Amount_Term'] = data['Loan_Amount_Term'].fillna(data['Loan_Amount_Term'].median())
data['Credit_History'] = data['Credit_History'].fillna(data['Credit_History'].median())
data.isnull().sum().sum()
np.int64(0)
plt.style.use('fivethirtyeight')
plt.rcParams['figure.figsize'] = (15, 4)

plt.subplot(1, 3, 1)
sns.boxplot(data['ApplicantIncome'])

plt.subplot(1, 3, 2)
sns.boxplot(data['CoapplicantIncome'])

plt.subplot(1, 3, 3)
sns.boxplot(data['LoanAmount'])

plt.suptitle('Outilers in the data')
plt.show()

Análise univariada

plt.rcParams['figure.figsize'] = (18, 4)
plt.subplot(1, 3, 1)
sns.histplot(data['ApplicantIncome'], color = 'green')

plt.subplot(1, 3, 2)
sns.histplot(data['CoapplicantIncome'], color = 'green')

plt.subplot(1, 3, 3)
sns.histplot(data['LoanAmount'], color = 'green')

plt.suptitle('Univariate Analysis in Numerical columns')
plt.show()
plt.rcParams['figure.figsize'] = (18,4)

#Aplicar a tranformação log para remoção de skewness
data['ApplicantIncome'] = np.log(data['ApplicantIncome'])
data['CoapplicantIncome'] = np.log1p(data['CoapplicantIncome'])
plt.subplot(1, 2, 1)
sns.histplot(data['ApplicantIncome'], color = 'black')

plt.subplot(1, 2, 2)
sns.histplot(data['CoapplicantIncome'], color = 'black')

plt.suptitle('After log transformations')
plt.show()
data = data.drop(['Loan_ID'], axis = 1)

Processo de Encoding

data['Gender'] = data['Gender'].replace(('Male', 'Female'), (1, 0))
data['Married'] = data['Married'].replace(('Yes', 'No'), (1, 0))
data['Education'] = data['Education'].replace(('Graduate', 'Not Graduate'), (1, 0))
data['Self_Employed'] = data['Self_Employed'].replace(('Yes', 'No'), (1, 0))
data['Loan_Status'] = data['Loan_Status'].replace(('Y', 'N'), (1, 0))
data['Property_Area'] = data['Property_Area'].replace(('Urban', 'Semiurban', 'Rural'), (1, 1, 0))
data['Dependents'] = data['Dependents'].replace(('0', '1', '2', '3+'), (0, 1, 1, 1))
data.select_dtypes('object').columns
Index([], dtype='object')

Separação dos dados

y = data['Loan_Status']
X = data.drop(['Loan_Status'], axis = 1)

print("Shape of X: ", X.shape)
print("Shape of y: ", y.shape)
Shape of X:  (614, 11)
Shape of y:  (614,)

Reamostragem de classes desbalanceadas

from imblearn.over_sampling import SMOTE

x_resample, y_resample = SMOTE().fit_resample(X, y.values.ravel())

print("Before Resampling")
print(y.value_counts())

print("After Resampling")
y_resample = pd.DataFrame(y_resample)
print(y_resample[0].value_counts())
Before Resampling
Loan_Status
1    422
0    192
Name: count, dtype: int64
After Resampling
0
1    422
0    422

Separação dos dados entre treino e teste

from sklearn.model_selection import train_test_split

x_train, x_test, y_train, y_test = train_test_split(x_resample, y_resample, test_size = 0.2, random_state = 0)

print("Shape of x_train:", x_train.shape)
print("Shape of y_train:", y_train.shape)
print("Shape of x_test:", x_test.shape)
print("Shape of y_test:", y_test.shape)
Shape of x_train: (675, 11)
Shape of y_train: (675, 1)
Shape of x_test: (169, 11)
Shape of y_test: (169, 1)

Treinamento do modelo Random Forest Classifier

from sklearn.ensemble import RandomForestClassifier

model = RandomForestClassifier(n_estimators=200)
model.fit(x_train, y_train)
y_pred = model.predict(x_test)
print("Trainning Accuracy: ", model.score(x_train, y_train))
print("Testing Accuracy: ", model.score(x_test, y_test))
Trainning Accuracy:  1.0
Testing Accuracy:  0.8224852071005917

Análise da performance do modelo

from sklearn.metrics import confusion_matrix, classification_report

cm = confusion_matrix(y_test, y_pred)
plt.rcParams['figure.figsize'] = (5, 5)
sns.heatmap(cm, annot = True, cmap = 'Wistia', fmt = '.8g')
plt.xlabel('Predicted')
plt.ylabel('Actual')
plt.show()

# Classification reports
cr = classification_report(y_test, y_pred)
print(cr)
                 precision  recall  f1-score   support

           0       0.90      0.73      0.81        86
           1       0.77      0.92      0.84        83

    accuracy                           0.82       169
   macro avg       0.83      0.82      0.82       169
weighted avg       0.84      0.82      0.82       169

Cross Validation

from sklearn.model_selection import cross_val_score

clf = RandomForestClassifier(random_state = 0)
scores = cross_val_score(clf, x_train, y_train, cv=5)
print(scores.mean())
0.794074074074074

Salvando o modelo

import pickle
pickle.dump(model, open('loan_prediction.pkl', 'wb'))
x_test.to_csv('test.csv', index=False)

Conslusão

  1. Mãos à obra aprendizado de máquina com Scikit-Learn, Keras & TensorFlow: conceitos, ferramentas e técnicas para a construção de sistemas inteligentes.
  2. Python para análise de dados
  3. Estatística Prática Para Cientistas de Dados: 50 Conceitos Essenciais
  4. Projetando Sistemas de Machine Learning
  5. An Introduction to Statistical Learning (Python e R)

3 comentários em “Criando seu primeiro projeto de machine learning com deploy: Parte 1”

  1. Pingback: Criando seu primeiro projeto de machine learning com deploy: Parte 2 - IA Com Café

  2. Pingback: Machine Learning para Equipes de TI: O Que Você Precisa Saber para Implementar com Sucesso

  3. Pingback: Seleção e engenharia de features em machine learning - IA Com Café

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Rolar para cima
×