Executando verificação de segurança...
6

[DÚVIDA] [IA] Como disponibilizar uma API de previsão de diabetes com rede neurais ?

Recentemente me aventurei em começar meus estudos em IA, ao avançar nos conceitos e implementações decidir por analisar os dados de uma base de diabetes, cerca de 80k de registros.

Ao realizar vários testes cheguei em uma melhor precisão adotando o uso de Redes Neurais.

Portanto, dado aos meus conhecimentos recem adquiridos, algumas preparações são necessárias para o uso de uma base de dados que possui dados tanto númericos quanto categóricos. Sendo eles o processo de escalonamento e de enconder de valores categóricos.

Processo da Rede Neural (RN)

Aqui segue uma versão resumida do meu processo

1. Divisão previsores e classes

db_diabetes = pd.read_csv('diabetes_prediction_dataset.csv')

X_diabetes = db_diabetes.iloc[:, 0:8].values
Y_diabetes = db_diabetes.iloc[:, 8].values

X_diabetes, Y_diabetes

2. Aplicando LabelEncoder

Conversão de valores categóricos para núméricos

from sklearn.preprocessing import LabelEncoder

lb_gender = LabelEncoder()
lb_smoking_history = LabelEncoder()

X_diabetes[:, 0] = lb_gender.fit_transform(X_diabetes[:, 0])
X_diabetes[:, 4] = lb_smoking_history.fit_transform(X_diabetes[:, 4])

pd.DataFrame(X_diabetes)

3. Aplicando OneHotEncoder

Balanceando valores númericos
Objetivo: Evitar que RN dê mais peso para valores maiores

# Carro

# Esse caso do LabelEncoder - O algoritmo pode considerar mais peso para o Uno, mesmo os 3 carros tendo o mesmo peso
# Gol Pálio Uno
#   1     2   3

# Já no caso do OneHotEncoder - Codifica deixa tudo uniforme
# Gol   1 0 0
# Pálio 0 1 0
# Uno   0 0 1 # encode
from sklearn.preprocessing import OneHotEncoder
from sklearn.compose import ColumnTransformer

onehotencoder_diabetes = ColumnTransformer(transformers=[('OneHot', OneHotEncoder(), [0, 4])], remainder='passthrough')

X_diabetes = onehotencoder_diabetes.fit_transform(X_diabetes)

pd.DataFrame(X_diabetes)

4. Escalando valores

Objetivo: Uniformizar o dataset para que possuam o mesmo escalonamento, evitando o problema a cima explicado

from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()
X_diabetes = scaler.fit_transform(X_diabetes)

pd.DataFrame(X_diabetes)

5. Treinamento do modelo

from sklearn.model_selection import train_test_split

X_diabetes_train, X_diabetes_test, Y_diabetes_train, Y_diabetes_test = train_test_split(X_diabetes, Y_diabetes, test_size = 0.15, random_state = 0)

# Salva o .pkl
with open('diabetes.pkl', mode = 'wb') as f:
  pickle.dump([X_diabetes_train, X_diabetes_test, Y_diabetes_train, Y_diabetes_test], f)

# Importa o .pkl para treinamento
with open('diabetes.pkl', 'rb') as f:
  X_diabetes_train, X_diabetes_test, Y_diabetes_train, Y_diabetes_test = pickle.load(f)


# Treinamento da RN
from sklearn.neural_network import MLPClassifier
# Melhor Config com base no GridSearchCV {'activation': 'relu', 'batch_size': 56, 'solver': 'adam'}
rn_diabetes = MLPClassifier(activation='relu', batch_size=56, solver='adam')

rn_diabetes.fit(X_diabetes_train, Y_diabetes_train);

6. Resultados

predict_diabetes = rn_diabetes.predict(X_diabetes_test)


# Precisão
from sklearn.metrics import accuracy_score, classification_report

print(classification_report(Y_diabetes_test, predict_diabetes)), accuracy_score(Y_diabetes_test, predict_diabetes) * 100


              precision    recall  f1-score   support

           0       0.97      1.00      0.99     13732
           1       0.99      0.68      0.81      1268

    accuracy                           0.97     15000
   macro avg       0.98      0.84      0.90     15000
weighted avg       0.97      0.97      0.97     15000

7. Conclusão

Foi possível obter 97% de precisão quando o indivíduo não possui diabates e 99% quando possui. Deste modo gostaria de sugestões e orientações de como transformar essa RN em uma API.

A API deve receber os seguintes dados:

  • age
  • hypertension
  • heart_disease
  • bmi
  • HbA1c_level
  • blood_glucose_level

E ser capaz de aplicar os processos de encoder e escalonamento e depois a previsão com base no modelo já treinado.

Carregando publicação patrocinada...
1

Achei demais mesmo esse projeto!

ML é bem difícil de conseguir evoluir tão rápido no começo, então parabéns por isso!

Eu diria pra vc estudar a criação de APIs com fastAPI ou django. Só olhando as documentações vc consegue subir uma API de testes.
A partir daí, vc já tem um início pra receber esses dados e retornar o valor da predição.

Porém, saiba que se você precisa suportar uma alta escala de requisições, você vai precisar repensar a arquitetura da aplicação.

2

Show, que bom que gostou do projeto. Obrigado pela orientação.

No entanto eu comecei uma processo de criação de API, usando o flask https://github.com/gabriel-roque/neural-network-diabetes/blob/master/app.py

Meu grande desafio mora no fato de que toda vez que receber um dado novo, teria que aplicar o processo de normalização, mas usando a base já existente. Acontece que fazer isso toda vez que receber uma nova requisição, é muito custoso. Queria saber como resolver de forma perfomática e adotando as boas práticas.

2
1
1