[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.