Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/aasjunior/mlapp-api
Esta API fornece endpoints para aplicar algoritmos de aprendizado de máquina, como K-Nearest Neighbors (KNN), Árvore de Decisão e Algoritmo Genético. Realizado como tarefa da disciplina de Laboratório Mobile/Computação Natural no 5º Semestre de Desenvolvimento de Software Multiplataforma.
https://github.com/aasjunior/mlapp-api
fastapi machine-learning python scikit-learn
Last synced: about 14 hours ago
JSON representation
Esta API fornece endpoints para aplicar algoritmos de aprendizado de máquina, como K-Nearest Neighbors (KNN), Árvore de Decisão e Algoritmo Genético. Realizado como tarefa da disciplina de Laboratório Mobile/Computação Natural no 5º Semestre de Desenvolvimento de Software Multiplataforma.
- Host: GitHub
- URL: https://github.com/aasjunior/mlapp-api
- Owner: aasjunior
- Created: 2024-06-05T01:01:29.000Z (5 months ago)
- Default Branch: main
- Last Pushed: 2024-08-13T19:42:27.000Z (3 months ago)
- Last Synced: 2024-08-13T22:53:51.741Z (3 months ago)
- Topics: fastapi, machine-learning, python, scikit-learn
- Language: Python
- Homepage:
- Size: 520 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
## Algoritimos de Aprendizado de Máquina - FastAPI
Esta API fornece endpoints para aplicar algoritmos de aprendizado de máquina, como K-Nearest Neighbors (KNN), Árvore de Decisão e Algoritmo Genético. Os endpoints aceitam arquivos CSV como entrada e retornam várias métricas e resultados da execução do algoritmo.
##### Aplicação Mobile: MachineLearningApp
### Dependências
O projeto usa as seguintes bibliotecas:- FastAPI
- pandas
- scikit-learn
- matplotlib
- joblib
- pydantic
## Iniciando o projeto
###### Requisitos de Software
- Python
- VSCode
### Instalação1. Clone o repositório para o seu computador:
```
git clone https://github.com/aasjunior/mlapp-api.git
```2. Abra o projeto pelo VSCode e execute o comando pelo terminal:
```
pip install -r requirements.txt
```3. Navegue até o diretório `app` e execute:
```
python -m uvicorn main:app --reload
```
4. A API estará rodando em:
```
http://127.0.0.1:8000
```## Endpoints
### 1. K-Nearest Neighbors (KNN)
```python
def apply_knn(X: DataFrame, y: Series, test_size=0.3, train_size=0.7, n_neighbors=3):
try:
if not is_normalized(X):
print('\nis not normalized\n')
X, y = normalize_data(X, y)X_train, X_test, Y_train, Y_test = train_test_split(X, y, test_size=test_size, train_size=train_size)
knn = KNeighborsClassifier(n_neighbors)
knn.fit(X_train, Y_train)predictions = knn.predict(X_test)
accuracy = accuracy_score(Y_test, predictions) * 100
return '%.2f%%' % accuracy
except Exception as e:
raise Exception('\nOcorreu um erro na execução do Knn:\n{e}\n')
```**POST /knn**
- **Descrição**: Aplica o algoritmo KNN no dataset fornecido.
- **Requisição**:- `DataScheme` (Corpo JSON): Contém os cabeçalhos dos atributos e a classe.
- `file` (UploadFile): Um arquivo CSV contendo o dataset.- **Resposta**:
- `number_of_examples`: Número de exemplos no dataset.
- `number_of_classes`: Número de classes únicas no dataset.
- `number_of_attributes`: Número de atributos usados para predição.
- `accuracy`: Precisão do algoritmo KNN.**Exemplo de Requisição com `multipart/form-data`**
Ao fazer a requisição, você deve enviar o arquivo CSV e o JSON com o esquema de dados. Um exemplo utilizando `curl`:
```bash
curl -X POST "http://127.0.0.1:8000/knn" \
-H "accept: application/json" \
-H "Content-Type: multipart/form-data" \
-F "file=@app/assets/db/iris.csv" \
-F 'data={"attributeHeaders":["sepal_length", "sepal_width", "petal_length", "petal_width"], "classHeader":"class"}'
```**Exemplo de Resposta:**
```json
{
"number_of_examples": 150,
"number_of_classes": 3,
"number_of_attributes": 4,
"accuracy": "96.67%"
}
```
### 2. Testar KNN
**GET /test-knn**
- **Descrição**: Testa o algoritmo KNN usando um dataset pré-definido (dataset Iris).
- **Resposta**:
- `number_of_examples`: Número de exemplos no dataset.
- `number_of_classes`: Número de classes únicas no dataset.
- `number_of_attributes`: Número de atributos usados para predição.
- `accuracy`: Precisão do algoritmo KNN.**Exemplo de Resposta:**
```json
{
"number_of_examples": 150,
"number_of_classes": 3,
"number_of_attributes": 4,
"accuracy": "96.67%"
}
```
### 3. Árvore de Decisão
```python
def apply_decision_tree(X: DataFrame, y: Series, test_size=0.3, train_size=0.7):
try:
X_train, X_test, Y_train, Y_test = train_test_split(X, y, test_size=test_size, train_size=train_size)dt_classifier = DecisionTreeClassifier()
dt_classifier.fit(X_train, Y_train)predictions = dt_classifier.predict(X_test)
accuracy = accuracy_score(Y_test, predictions) * 100fig_src = plot_decision_tree(dt_classifier)
model_image_base64 = get_image_base64(fig_src)
model_info = {
'accuracy': '%.2f%%' % accuracy,
'model_image': model_image_base64
}return model_info
except Exception as e:
raise Exception(f'\nOcorreu um erro na execução da arvore de decisão:\n{e}\n')
```**POST /decision-tree**
- **Descrição**: Aplica o algoritmo de Árvore de Decisão no dataset fornecido.
- **Requisição**:
- `DataScheme` (Corpo JSON): Contém os cabeçalhos dos atributos e a classe.
- `file` (UploadFile): Um arquivo CSV contendo o dataset.**Exemplo de Requisição com multipart/form-data**
```bash
curl -X POST "http://127.0.0.1:8000/decision-tree" \
-H "accept: application/json" \
-H "Content-Type: multipart/form-data" \
-F "file=@app/assets/db/iris.csv" \
-F 'data={"attributeHeaders":["sepal_length", "sepal_width", "petal_length", "petal_width"], "classHeader":"class"}'
```**Exemplo de Resposta:**
```json
{
"result": {
"number_of_examples": 150,
"number_of_classes": 3,
"number_of_attributes": 4,
"model_info": {
"accuracy": "96.67%",
"model_image": "base64_encoded_image"
}
}
}
```
### 4. Testar Árvore de Decisão
**GET /test-decision-tree**
- **Descrição**: Testa o algoritmo de Árvore de Decisão usando um dataset pré-definido (dataset Iris).
- **Resposta**:
- `number_of_examples`: Número de exemplos no dataset.
- `number_of_classes`: Número de classes únicas no dataset.
- `number_of_attributes`: Número de atributos usados para predição.
- `model_info`: Detalhes do modelo, incluindo precisão e imagem do modelo.**Exemplo de Resposta:**
```json
{
"number_of_examples": 150,
"number_of_classes": 3,
"number_of_attributes": 4,
"model_info": {
"accuracy": "96.67%",
"model_image": "base64_encoded_image"
}
}```
### 5. Algoritmo Genético
```python
def apply_genetic_algorithm(for_max: bool = False):
try:
size = np.random.randint(20, 101)
n_childrens = int(0.7 * size)
n_generations = 10if for_max:
fig_fitness, fig_evolution = version_max(size, n_childrens, n_generations)
fitness = 'maximizar z = e ^ -(x² + y²)'else:
fig_fitness, fig_evolution = version_min(size, n_childrens, n_generations)
fitness = 'minimizar z = 20 + x² + y² - 10 * (cos(2πx) + cos(2πy))'return {
'size': size,
'n_childrens': n_childrens,
'n_generations': n_generations,
'fitness': fitness,
'plot_images': {
'plot_fitness': get_image_base64(fig_fitness),
'plot_evolution': get_image_base64(fig_evolution)
}
}except Exception as e:
raise Exception(f'\nOcorreu um erro na execução do algoritmo genéetico:\n{e}\n')
```**GET /genetic-algorithm**
- **Descrição**: Aplica o Algoritmo Genético e retorna o resultado.
- **Resposta**:
- `size`: Tamanho da população.
- `n_childrens`: Número de filhos em cada geração.
- `n_generations`: Número de gerações.
- `fitness`: Função de aptidão usada.
- `plot_images`: Imagens dos gráficos de aptidão e evolução codificadas em base64.**Exemplo de Resposta:**
```json
{
"size": 50,
"n_childrens": 35,
"n_generations": 10,
"fitness": "minimizar z = 20 + x² + y² - 10 * (cos(2πx) + cos(2πy))",
"plot_images": {
"plot_fitness": "base64_encoded_image",
"plot_evolution": "base64_encoded_image"
}
}
```
## Tratamento de Erros
Em caso de erros durante a execução dos algoritmos, a API retorna um código de status HTTP 400 juntamente com os detalhes do erro.
**Exemplo de Resposta de Erro:**
```json
{
"detail": "Mensagem de erro"
}
```
### Notas
- Os endpoints que requerem uploads de arquivos esperam que o arquivo esteja em formato CSV.
- Os endpoints /test-knn e /test-decision-tree utilizam um dataset pré-definido localizado em assets/db/iris.csv.
- Os gráficos do algoritmo genético são retornados como strings codificadas em base64.
##
###### Aviso
Este é um trabalho acadêmico realizado como tarefa da disciplina de Laboratório Mobile/Computação Natural no 5º Semestre de Desenvolvimento de Software Multiplataforma