Skip to content

Commit a7b3489

Browse files
authored
versão final do projeto de IA
1 parent d749623 commit a7b3489

1 file changed

Lines changed: 212 additions & 93 deletions

File tree

ifit.2.py

Lines changed: 212 additions & 93 deletions
Original file line numberDiff line numberDiff line change
@@ -1,101 +1,220 @@
11

22
import numpy as np
3+
import pandas as pd
34
from sklearn.model_selection import train_test_split
4-
from sklearn.linear_model import LogisticRegression
5-
from sklearn.preprocessing import StandardScaler
6-
from sklearn.metrics import accuracy_score
7-
8-
# Dados de treinamento ajustados (15 exemplos para 15 categorias)
9-
dados_treinamento = np.array([
10-
[25, 170, 60, 2, 3, 0, 0, 1, 60],
11-
[30, 180, 70, 2, 4, 1, 2, 3, 90],
12-
[20, 160, 50, 1, 2, 0, 0, 1, 30],
13-
[40, 190, 80, 2, 5, 0, 1, 4, 60],
14-
[35, 175, 65, 1, 3, 1, 4, 1, 90],
15-
[28, 165, 58, 2, 2, 2, 1, 4, 45],
16-
[22, 170, 55, 1, 3, 0, 2, 2, 50],
17-
[38, 185, 85, 2, 4, 1, 3, 1, 70],
18-
[26, 175, 67, 1, 2, 3, 5, 2, 40],
19-
[45, 180, 78, 2, 5, 4, 6, 2, 80],
20-
[32, 168, 60, 1, 3, 1, 7, 1, 60],
21-
[29, 175, 73, 2, 4, 2, 2, 4, 90],
22-
[50, 178, 80, 2, 5, 3, 3, 1, 75],
23-
[24, 165, 54, 1, 1, 0, 8, 3, 30],
24-
[36, 182, 77, 2, 4, 4, 1, 2, 85]
25-
])
26-
27-
# Criando etiquetas de treinamento (0 a 14)
28-
etiquetas_treinamento = np.arange(15)
29-
30-
# Divisão dos dados em treinamento e teste
31-
X_train, X_test, y_train, y_test = train_test_split(
32-
dados_treinamento, etiquetas_treinamento, test_size=0.2, random_state=42
33-
)
34-
35-
# Normalização dos dados
36-
scaler = StandardScaler()
37-
X_train = scaler.fit_transform(X_train)
38-
X_test = scaler.transform(X_test)
39-
40-
# Criação e treinamento do modelo
41-
modelo = LogisticRegression(max_iter=1000)
5+
from sklearn.ensemble import RandomForestClassifier
6+
from sklearn.preprocessing import LabelEncoder
7+
8+
9+
# Criando um dataset simulado baseado nas categorias fornecidas
10+
dados_treinamento = pd.DataFrame([
11+
[25, 170, 60, "Masculino", "Iniciante", "Emagrecimento", "Saudável", "Academia", 60, "Treino de Força",
12+
'''começe com um aquecimento,faça uma caminhada de 10 minutos e logo em seguida faça 3 series de polichinelos com duas a cinco repetiçôes.
13+
agachamentos:3 series de 10-12 repetições.
14+
flexões:3 series ate a falha.
15+
Remana com halteres:3 séries de 10-12 repetições.
16+
prancha:3 séries,segurando por 15 segundos.
17+
elevação de panturilhas:3 séries de 15-20 repetições.
18+
faça esse treino 3 vezes por semana,com descanso de 1 dia entre os treinos.,
19+
''',"https://exemplo.com"],
20+
21+
[30, 180, 70, "Masculino", "Intermediário", "Ganho de Massa Muscular", "Saudável", "Academia", 90, "Treino de Hipertrofia",
22+
'''dia 1:superior(peito/triceps/ombros)
23+
supino reto:3 séries de 8-12 repetições.
24+
treino com halteres:3 séries de 10-15 repetições.
25+
dia 2:inferior(pernas/panturrilhas)
26+
agachamento livre:3 séries de 8-12 repetições.
27+
leg press:3 series de 10-15 repetições.
28+
panturrilha em pé:3 séries de 15-20 repetições.
29+
dia 3:costas/biceps
30+
barra fixa: 3 séries ate a falha.
31+
remada curvada:3 séries de 8-12 repetições.
32+
Rosca direita com barra:3 séries de 8-12 repetições.
33+
Rosca martelo:3 series de 10-15 repetições.
34+
Observação:Este treino é um exemplo.Ajuste-o de acordo com suas necessidades e objetivos.Se possivel,consulte um profissional de educação fisica para orientação personalizada.,
35+
''',"https://exemplo.com"],
36+
37+
[20, 160, 50, "Feminino", "Sedentário", "Emagrecimento", "Saudável", "Casa", 30, "Treino Cardio",
38+
'''aquecimento(5 minutos) caminhada leve no lugar:2 minutos,elevando os joelhos gradualmente.
39+
rotação de braços e pernas:1 minuto para frente e 1 minuto para tras.
40+
alongamento suave dos principais grupos musculares.
41+
treino(3 vezes por semana,com descanço de 1 dia entre os treinos)
42+
caminhada:20-30 minutos em ritmo moderado.
43+
polichinelos:3 séries de 15 repetições.
44+
Observação:Este treino é um exemplo.Ajuste-o de acordo com suas necessidades e objetivos.Se possivel,consulte um profissional de educação fisica para orientação personalizada.,
45+
''',"https://exemplo.com"],
46+
47+
[40, 190, 80, "Masculino", "Avançado", "Ganho de Massa Muscular", "Saudável", "Academia", 60, "Treino de Força Máxima",
48+
'''caracteristicas do treino:
49+
Cargas elevadas:utiliza-se pesos proximos ou iguais a sua 1RM(uma repetição maxima).
50+
baixas repetições:geralmente 1 a 5 repetições por serie.
51+
longos periodos de descanço:3 a 5 minutos entre as séries para recuperação completa.
52+
tecnica impecavel:A forma correta é crucial para evitar lesões e maximizar os resultados.
53+
TREINO:
54+
aquecimento:10-15 minutos de cardio leve e alongamentos dinâmicos.
55+
agachamento livre:3 series de 3-6 repetições com carga maxima.
56+
supino reto:3 séries de 3-5 repetições com carga maxima.
57+
levantamento terra:1 serie de 1-3 repetições com carga maxima.
58+
desenvolvimento com barra:3 series de 3-5 repetições com carga maxima.
59+
Observação:Este treino é um exemplo.Ajuste-o de acordo com suas necessidades e objetivos.Se possivel,consulte um profissional de educação fisica para orientação personalizada.,
60+
''',"https://.com"],
61+
62+
[35, 175, 65, "Feminino", "Intermediário", "Melhoria Geral da Saúde", "Saudável", "Parque", 90, "Treino Funcional",
63+
'''O treino funcional trabalha força,resistência,equilibrio,flexibilidade e coordenação motora.
64+
Treino:
65+
Aquecimento: 5-10 minutos de caminhada leve, corrida e alongamentos dinâmicos.
66+
Agachamentos: 3 séries de 10-12 repetições.Flexões em um banco: 3 séries de quantas repetições conseguir.
67+
Barra fixa: 3 séries de quantas repetições conseguir.
68+
Saltos em um banco: 3 séries de 10-12 repetições.
69+
Observação:Este treino é um exemplo.Ajuste-o de acordo com suas necessidades e objetivos.Se possivel,consulte um profissional de educação fisica para orientação personalizada.,
70+
''',"https://"],
71+
72+
[50, 165, 58, "Masculino", "Iniciante", "Condicionamento Físico", "Diabetes", "Academia", 45, "Treino de Resistência",
73+
'''Exercícios de longa duração com baixa carga"
74+
, "O treino de resistência desenvolve um bom condicionamento físico, conbinado com o ganho de força e controle glicêmico.
75+
Treino:
76+
Agachamento: 3 séries com duração de 30 segundos com um intervalo de 15 segundos.
77+
Flexões: 3 séries até a falha com intervalo de 30 segundos.
78+
Remadas: 3 séries com elástico ou algum peso compatível, com intervalo de 30 segundos.
79+
Prancha e Polichinelo: 3 séries de 30 a 45 segundos com intervalo de 15 segundos.
80+
Observação:Este treino é um exemplo. Ajuste-o de acordo com suas necessidades e objetivos.Se possivel,consulte um profissional de educação fisica para orientação personalizada.,
81+
''',"https://"],
82+
83+
[60, 170, 70, "Feminino", "Sedentário", "Melhoria Geral da Saúde", "Problemas Cardíacos", "Casa", 50, "Treino de Mobilidade",
84+
'''Alongamentos e exercícios leves para articulações","o treio de mobilidade é essencial para melhorar a flexibilidade, reduz dores nas articulações e auxilia no em moviemntos do cotidiano.
85+
Treino:
86+
Aquecimento: 5-10 minutos de csminhada no ambiente.
87+
Alongamento na cadeira: Sente-se e estique as pernas alternando em 3 séries de 10 repetições.
88+
Mobilidade de ombro: Elevação e rotação dos ombros para frente e para trás, faça 3 séries de 10 repetições.
89+
Flexão lateral do tronco: Incline-se suavemente para cada lado, realize 3 séries de 10 repetições.
90+
Mobilidade do quadril: Coloque as mãos na cintura e faça o movimento de rotação do quadril para frente, para trás, para a direita e para a esquerda, realize 3 séries de 10 repetições.
91+
Observação:Este treino é um exemplo. Ajuste-o de acordo com suas necessidades e objetivos.Se possivel,consulte um profissional de educação fisica para orientação personalizada.,
92+
''',"https://"],
93+
94+
[28, 175, 65, "Feminino", "Intermediário", "Outro", "Problemas na Coluna", "Academia", 70, "Treino de Core",
95+
'''Fortalecimento abdominal e lombar para suporte da coluna.
96+
Treino:
97+
Aquecimento: 5 minutos de caminhada leve na esteira.
98+
Prancha: 3 séries de 30 a 60 segundos(Fortalece o core).
99+
Ponte: 3 séries de 15 a 20 repetições(Fortalece glúteos e lombar).
100+
Dead Bug: 3 séries de 10 repetições para cada lado(Fortalece o core e melhora a coordenação).
101+
Prancha Lateral: 3 séries de 30 segundos(Fortalece o Obliquos e os estabilizadores laterais).
102+
Observação:Este treino é um exemplo. Ajuste-o de acordo com suas necessidades e objetivos. Se possivel, consulte um profissional de educação fisica para orientação personalizada.,
103+
''',"https://" ],
104+
105+
[26, 180, 75, "Masculino", "Avançado", "Condicionamento Físico", "Saudável", "Parque", 60, "Treino de condicionamento fisico",
106+
'''Treino intervalado de alta intensidade para explosão muscular.
107+
Treino:
108+
Aquecimento : Polichinelos por 60 segundos. Rotação de braços por 30 segundos. Agachamento livre 30 repetições.
109+
Sprints em subida: 30 segundos de sprint máximo, 30 segundos de descanso (repetir 6 vezes).
110+
Saltos no banco do parque: 10 repetições, seguido de 30 segundos de descanso (repetir 4 vezes).
111+
Flexões: Máximo de repetições possíveis em 30 segundos, seguido de 30 segundos de descanso (repetir 4 vezes).
112+
Barra fixa: Máximo de repetições possíveis, seguido de 1 minuto de descanso, repetir 3 vezes.
113+
Observação:Este treino é um exemplo. Ajuste-o de acordo com suas necessidades e objetivos. Se possivel, consulte um profissional de educação fisica para orientação personalizada.,
114+
''',"https://"],
115+
116+
[45, 180, 78, "Feminino", "Avançado", "Condicionamento Físico", "Saudável", "Academia", 80, "Treino de alta intencidade",
117+
'''Plano adaptado às necessidades individuais.
118+
treino:
119+
Aquecimento: Pular corda por 3 minutos(descansa 45 segundos). Polichinelos com saltos por 30 segundos(Descansa 30 segundos). Agachamentos livre 15 repetições(descansa 30 segundos).
120+
Burpees com salto na caixa:3 séries de 10 repetições(Descansa 30 segundos entre as séries e para o próximo exercício).
121+
Agachamento com barra (peso desafiador): 3 séries de 12 repetições(Descansa 30 segundos entre as séries e para o próximo exercício).
122+
Remada alta: 3 séries de 15 repetições(Descansa 30 segundos entre as séries e para o próximo exercício).
123+
Prancha com rotação de quadril: 3 séries de 20 repetições - 10 para cada lado (Descansa 30 segundos entre as séries).
124+
Sprints na esteira (ou bike): 8 séries de 20 segundos de sprint máximo, 10 segundos de descanso.
125+
Observação:Este treino é um exemplo. Ajuste-o de acordo com suas necessidades e objetivos. Se possivel, consulte um profissional de educação fisica para orientação personalizada.,
126+
''',"https://"],
127+
128+
], columns=["Idade", "Altura", "Peso", "Sexo", "Nível Atividade", "Objetivo", "Condição Médica", "Local Treino", "Duração", "Método Treino", "Descrição","link"])
129+
130+
# Transformando dados categóricos em números
131+
label_encoders = {}
132+
for col in ["Sexo", "Nível Atividade", "Objetivo", "Condição Médica", "Local Treino", "Método Treino"]:
133+
le = LabelEncoder()
134+
dados_treinamento[col] = le.fit_transform(dados_treinamento[col])
135+
label_encoders[col] = le
136+
137+
# Separando os dados de entrada e saída
138+
X = dados_treinamento.drop(columns=["Método Treino", "Descrição","link"])
139+
y = dados_treinamento["Método Treino"]
140+
141+
142+
# Divisão treino/teste
143+
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
144+
145+
# Modelo de Machine Learning (Random Forest)
146+
modelo = RandomForestClassifier(n_estimators=100, random_state=42)
42147
modelo.fit(X_train, y_train)
43148

44-
# Avaliação do modelo
45-
y_pred = modelo.predict(X_test)
46-
acuracia = accuracy_score(y_test, y_pred)
47-
print(f"Acurácia do modelo: {acuracia:.2f}")
48149

49-
# Coleta de dados do usuário com validação
50-
def entrada_usuario_valida(mensagem, tipo=int, minimo=None, maximo=None):
150+
151+
152+
153+
# Função para entrada do usuário
154+
def entrada_usuario_valida(mensagem, tipo=str, opcoes=None):
51155
while True:
52-
try:
53-
valor = tipo(input(mensagem))
54-
if minimo is not None and valor < minimo:
55-
raise ValueError(f"Digite um valor maior ou igual a {minimo}.")
56-
if maximo is not None and valor > maximo:
57-
raise ValueError(f"Digite um valor menor ou igual a {maximo}.")
156+
valor = input(mensagem).strip()
157+
if tipo == int:
158+
try:
159+
return int(valor)
160+
except ValueError:
161+
print("Por favor, insira um número válido.")
162+
elif opcoes:
163+
valor_lower = valor.lower()
164+
opcoes_lower = [op.lower() for op in opcoes]
165+
if valor_lower in opcoes_lower:
166+
return opcoes[opcoes_lower.index(valor_lower)] # Retorna na formatação original
167+
else:
168+
print(f"Opção inválida. Escolha entre: {', '.join(opcoes)}")
169+
else:
58170
return valor
59-
except ValueError as e:
60-
print(f"Entrada inválida: {e}")
61-
62-
idade = entrada_usuario_valida("Digite sua idade: ", int, 10, 100)
63-
altura = entrada_usuario_valida("Digite sua altura (em cm): ", int, 100, 250)
64-
peso = entrada_usuario_valida("Digite seu peso (em kg): ", int, 30, 200)
65-
sexo = entrada_usuario_valida("Digite seu sexo (1 = Masculino, 2 = Feminino): ", int, 1, 2) - 1
66-
nivel_atividade = entrada_usuario_valida("Digite seu nível de atividade física (1 a 5): ", int, 1, 5)
67-
objetivo = entrada_usuario_valida("Digite seu objetivo (0 a 4): ", int, 0, 4)
68-
condicoes_medicas = entrada_usuario_valida("Digite suas condições médicas (0 a 8): ", int, 0, 8)
69-
local_treino = entrada_usuario_valida("Digite seu local de treino (1 a 4): ", int, 1, 4) - 1
70-
duracao_treino = entrada_usuario_valida("Digite a duração do seu treino (em minutos): ", int, 10, 180)
71-
72-
# Normalização da entrada do usuário
73-
entrada_usuario = scaler.transform([[idade, altura, peso, sexo, nivel_atividade, objetivo, condicoes_medicas, local_treino, duracao_treino]])
74-
75-
# Previsão do método de treino
76-
def prever_metodo_treino():
77-
previsao = modelo.predict(entrada_usuario)
78-
return min(max(previsao[0], 0), 14) # Garante que esteja entre 0 e 14
79-
80-
# Métodos de treino organizados
81-
metodos_treino = {
82-
0: "Treino de força para iniciantes: exercícios básicos para musculatura.",
83-
1: "Treino de força para intermediários: carga moderada e progressão.",
84-
2: "Treino de força para avançados: cargas altas e técnicas avançadas.",
85-
3: "Treino de condicionamento físico para iniciantes: caminhadas e aeróbicos leves.",
86-
4: "Treino de condicionamento físico para intermediários: corridas curtas, circuitos funcionais.",
87-
5: "Treino de condicionamento físico para avançados: treinos intervalados intensos.",
88-
6: "Treino de resistência para iniciantes: exercícios básicos de resistência muscular.",
89-
7: "Treino de resistência para intermediários: aumento gradual da carga e tempo sob tensão.",
90-
8: "Treino de resistência para avançados: treinos com alta repetição e baixa recuperação.",
91-
9: "Treino de flexibilidade e mobilidade: melhora da amplitude de movimento.",
92-
10: "Treino de equilíbrio e coordenação: foco na estabilidade corporal.",
93-
11: "Treino funcional de alta intensidade: mistura de resistência, força e cardio.",
94-
12: "Treino de calistenia: fortalecimento com exercícios de peso corporal.",
95-
13: "Treino de ioga e pilates: fortalecimento, alongamento e equilíbrio mental.",
96-
14: "Treino personalizado com acompanhamento profissional."
97-
}
98-
99-
# Exibição do resultado
100-
metodo_treino = prever_metodo_treino()
101-
print(f"\nO método de treino ideal para você é:\n{metodos_treino[metodo_treino]}")
171+
172+
# Coletando dados do usuário
173+
idade = entrada_usuario_valida("Digite sua idade: ", int)
174+
175+
altura = entrada_usuario_valida("Digite sua altura (em cm): ", int)
176+
177+
peso = entrada_usuario_valida("Digite seu peso (em kg): ", int)
178+
179+
sexo = entrada_usuario_valida("Digite seu sexo (Masculino ou Feminino): ", str, ["Masculino", "Feminino"])
180+
181+
nivel_atividade = entrada_usuario_valida("Digite seu nível de atividade física (Sedentário, Iniciante, Intermediário, Avançado): ", str, ["Sedentário", "Iniciante", "Intermediário", "Avançado"])
182+
183+
objetivo = entrada_usuario_valida("Digite seu objetivo:\nEmagrecimento\n Ganho de Massa Muscular\n Condicionamento Físico\n Melhoria Geral da Saúde\n Outro\n): ", str, ["Emagrecimento", "Ganho de Massa Muscular", "Condicionamento Físico", "Melhoria Geral da Saúde", "Outro"])
184+
185+
condicao_medica = entrada_usuario_valida("Digite sua condição médica:\nSaudável\n Lesões Musculares ou Articulares\n Problemas Cardíacos\n Diabetes\n Asma ou Problemas Respiratórios\n Deficiências Nutricionais\n Problemas na Coluna): ", str, ["Saudável", "Lesões Musculares ou Articulares", "Problemas Cardíacos", "Diabetes", "Asma ou Problemas Respiratórios", "Deficiências Nutricionais", "Problemas na Coluna"])
186+
187+
local_treino = entrada_usuario_valida("Digite seu local de treino (Academia, Casa, Parque, Outro): ", str, ["Academia", "Casa", "Parque", "Outro"])
188+
189+
duracao_treino = entrada_usuario_valida("Digite a duração do seu treino (em minutos): ", int)
190+
191+
# Convertendo entrada do usuário para formato do modelo
192+
entrada_usuario = np.array([
193+
idade, altura, peso,
194+
label_encoders["Sexo"].transform([sexo])[0],
195+
label_encoders["Nível Atividade"].transform([nivel_atividade])[0],
196+
label_encoders["Objetivo"].transform([objetivo])[0],
197+
label_encoders["Condição Médica"].transform([condicao_medica])[0],
198+
label_encoders["Local Treino"].transform([local_treino])[0],
199+
duracao_treino
200+
]).reshape(1, -1)
201+
202+
# Criando o dicionário para associar as codificações numéricas aos métodos, descrições e links
203+
204+
descricao_treino = dict(zip(dados_treinamento["Método Treino"], dados_treinamento["Descrição"]))
205+
link_treino = dict(zip(dados_treinamento["Método Treino"], dados_treinamento["link"]))
206+
207+
# Função para obter o treino recomendado
208+
previsao_codificada = modelo.predict(entrada_usuario)[0]
209+
210+
# Verifique a previsão e use diretamente a chave codificada
211+
if previsao_codificada in descricao_treino:
212+
descricao = descricao_treino[previsao_codificada]
213+
link = link_treino[previsao_codificada]
214+
215+
# Realize a inversão para o nome do método de treino
216+
metodo_treino = label_encoders["Método Treino"].inverse_transform([previsao_codificada])[0]
217+
218+
print(f"\nO método de treino ideal para você é: {metodo_treino}\nDescrição: {descricao}\nClique no link para ver um vídeo sobre o treino: {link}")
219+
else:
220+
print("Erro: O método de treino previsto não foi encontrado nos dados.")

0 commit comments

Comments
 (0)