Regressão logística no Python
Regressão logística com Scikit-learn
Para implementar a regressão logística com o Scikit-learn, você precisa entender o processo de modelagem do Scikit-learn e a regressão linear.
As etapas para construir uma regressão logística incluem:
Importe os pacotes , classes e funções. Carregue os dados. Análise Exploratória de Dados (AED). Transforme os dados, se necessário. Ajustar o modelo de classificação. Avalie o modelo de desempenho.
Importando pacotes
Primeiro, você precisa importar Seaborn para visualização, NumPy e Pandas . Além disso, importe:
LogisticRegression para ajuste do modelo. confusion_matrix e classification_report para avaliar o modelo.
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import confusion_matrix, classification_report, accuracy_score
Carregando o conjunto de dados
Importe o conjunto de dados Social Network Ads do Kaggle . Os dados são um arquivo CSV com dados que nos ajudarão a construir um modelo de regressão logística para mostrar quais usuários compraram ou não compraram um produto.
social_N_data = pd.read_csv('/content/Social_Network_Ads.csv')
pd.concat([social_N_data.head(), social_N_data.tail()])
Análise exploratória de dados
Analisar os dados primeiro é a chave para entender suas características. Começaremos verificando os valores ausentes.
#CHECK FOR NULL VALUES
social_N_data.isnull().any()
Nenhum valor nulo no conjunto de dados.
Confira o total de quem comprou e de quem não comprou:
sns.countplot(x='Purchased', data=social_N_data)
Zero indica quem não comprou e 1 para quem comprou.
Confira quantos homens e mulheres compraram o produto:
sns.countplot(x='Purchased', hue='Gender', data=social_N_data)
A partir do gráfico, podemos ver que a maioria das pessoas que não compraram são do sexo masculino, e a maioria das que compraram são do sexo feminino.
Também podemos verificar a distribuição etária no conjunto de dados:
sns.displot(x='Age', data=social_N_data, color='red', kde=True)
Limpando os dados
Usaremos as colunas Gender, Age e EstimatedSalary do conjunto de dados para a regressão logística. Isso significa que não precisamos da UserID coluna. Assim vamos abandoná-lo.
# CLEAN THE DATA
social_N_data.drop('User ID', axis=1, inplace=True)
pd.concat([social_N_data.head(), social_N_data.tail()])
Transformando dados categóricos em fictícios
Vamos examinar o info conjunto de dados para ter uma ideia geral do que ele contém.
social_N_data.info()
A Gender variável é categórica. Para que o modelo funcione, vamos convertê-lo em variáveis dummy usando os Pandas get_dummies ou o método oneHotEncoder.
Altere Gender para a variável dummy e descarte o primeiro dummy para evitar multicolinearidade:
gender = pd.get_dummies(social_N_data['Gender'], drop_first=True)
social_N_data.drop('Gender',axis=1,inplace=True)
social_N_data = pd.concat([social_N_data,gender], axis=1)
social_N_data.head(8)
Quando o valor Masculino é 1, significa que o gênero é masculino, e quando o valor é 0, o gênero é feminino. Não exigimos as variáveis Feminino e Sexo no conjunto de dados, pois uma pode ser usada para prever a outra.
Dividindo os dados em variáveis independentes (X) e dependentes (y)
Divida os dados em variáveis independentes e dependentes.
X = social_N_data.iloc[:,[0,1,3]] # Age, EstimatedSalary and Male
X.head()
y = social_N_data.iloc[:, 2] # Purchased
y
Dimensionamento de recursos
O dimensionamento de recursos é um método usado para normalizar o intervalo de variáveis independentes. O método permite que as variáveis independentes estejam no mesmo intervalo.
Ao trabalhar com grandes conjuntos de dados, o dimensionamento desempenha um papel significativo na melhoria do desempenho do modelo.
Nos dados, vamos importar o módulo StandardScaler Scikit-learn preprocessing e usá-lo para transformar os dados. Por exemplo, existe uma grande diferença entre os valores da variável Age e os de EstimatedSalary.
from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
X = sc.fit_transform(X)
X
Dividindo o conjunto de dados em conjuntos de treinamento e teste
Divida o conjunto de dados em conjuntos de treinamento e teste usando a função train_test_split.
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.30, random_state=1)
print(X_train.shape)
print(X_test.shape)
print(y_train.shape)
print(y_test.shape)
Ajustando o modelo de regressão logística e prevendo os resultados do teste
Agora que o conjunto de dados está bem preparado, podemos treinar o modelo importando a classe LogisticRegression do módulo linear_model Scikit-learn.
O treinamento é feito chamando o médodo fit e passando os dados de treinamento.
from sklearn.linear_model import LogisticRegression
classifier = LogisticRegression()
classifier.fit(X_train, y_train)
O modelo agora é treinado no conjunto de treinamento. Vamos realizar a previsão no conjunto de teste usando método predict.
y_pred = classifier.predict(X_test)
Vamos criar um Pandas DataFrame e comparar os valores previstos e reais.
result = pd.DataFrame({'Actual' : y_test, 'Predicted' : y_pred})
result
Os atributos coef_ e intercept_ fornecem o coeficiente e a interceptação do modelo.
classifier.coef_
classifier.intercept_
Avaliando o modelo Existem várias maneiras de verificar o desempenho do modelo.
Usando predict_proba Ele retorna a matriz de probabilidades de que a saída prevista seja igual a zero ou um.
print(classifier.predict_proba(X))
Da matriz, cada linha representa uma única observação. A primeira coluna é a probabilidade de o produto não ser comprado (1-p(x)) e a segunda coluna é a probabilidade de o produto ser comprado (p(x)).
Usando matriz de confusão Do módulo Scikit-learn, importamos arquivos . A matriz de confusão é o número de previsões corretas e incorretas por coluna, mostrando os seguintes valores: metrics confusion_matrix
Verdadeiros negativos (TN - True negatives) na posição superior esquerda.
Falsos negativos (FN - False negatives) na posição inferior esquerda.
Falsos positivos (FP - False positives) na posição superior direita.
Verdadeiros positivos (TP - True positives) na posição inferior direita.
from sklearn.metrics import confusion_matrix
cf_matrix = confusion_matrix(y_test, y_pred)
cf_matrix
A saída da matriz de confusão é uma matriz 2*2, pois o modelo é uma classificação binária. Vamos visualizar melhor usando um mapa de calor e explicar.
sns.heatmap(pd.DataFrame(cf_matrix), annot=True, cmap="YlGnBu" ,fmt='g')
plt.title('Confusion matrix', y=1.1)
plt.ylabel('Actual label')
plt.xlabel('Predicted label')
A partir de confusion_matrix, temos as seguintes observações:
63 previsões TN: zeros previstos corretamente.
14 previsões FN: uns previstos erroneamente como zeros.
9 Previsões FP: zeros que foram erroneamente previstos como uns.
34 previsões TP: aquelas previstas corretamente.
Para calcular a precisão do modelo a partir da matriz de confusão, dividimos a soma de TN e TP pela soma de todas as previsões.
Accuracy = (63 + 34)/(63 + 34 + 9 + 14)
Accuracy
# Also same result from sklearn accuracy_score
from sklearn.metrics import accuracy_score
accuracy_score(y_test,y_pred)
A precisão do nosso modelo é de cerca de 80%, o que é ideal.
Métricas da matriz de confusão
O classification_report fornece um relatório mais abrangente do desempenho do modelo.
target_names = ['will NOT PURCHASE', 'will PURCHASE']
print(classification_report(y_test, y_pred,target_names=target_names))
Comentários
Postar um comentário