본문 바로가기
Drawing (AI)/Models

체중 감소 예측 프로그램 (딥러닝)

by 생각하는 이상훈 2023. 2. 7.
728x90

Weight-Loss-Prediction (with ANN)

가상 데이터 생성하는 소스코드

data.py

import random
import numpy as np
import csv
import matplotlib.pyplot as plt

# Create a list to store the data
data = []
m_weight_graph = []
m_redu_graph = []
f_weight_graph = []
f_redu_graph = []
total_reduced_weight = 0
total_weight = 0
total_fat_per = 0
# Generate data for 10,000 people
for i in range(30000):
    # Create a dictionary to store the person's data
    person = {}

    gen = random.choice(["male", "female"])
    rand_fat = round(random.gauss(0, 4),2)
    m_weight = round(random.gauss(78, 5),2)
    f_weight = round(random.gauss(57, 5),2)
    ex_time = round(random.gauss(8, 2.5),1)
    if ex_time < 0:
        ex_time = 0
    m_cal_in = round(random.gauss(2250, 250),1)
    f_cal_in = round(random.gauss(1950, 250),1)
    reduced_weight = round(random.gauss(0, 0.7),2)
    age = int(random.gauss(30, 14))
    if age < 19:
        age = 19
    fat_per = 22 + rand_fat
    func_redu_m_weight = round(((m_weight*(fat_per*fat_per/10000)/20) + ((ex_time-6)/5) + ((2600-m_cal_in)//180) 
                        + ((int(age<25))*0.3) + reduced_weight)*(0.75 + (m_weight-60)/400), 1)
    func_redu_f_weight = round(1.5 + ((f_weight*(fat_per*fat_per/10000)/20) + ((ex_time-4)/5) + ((1800-f_cal_in)//180) 
                        + ((int(age<25))*0.3) + reduced_weight)*(0.7 + (f_weight-40)/300), 1)
    if (gen == "male"):
        weight = m_weight
        cal_in = m_cal_in
        func_redu_weight = func_redu_m_weight
    else:
        weight = f_weight
        cal_in = f_cal_in
        func_redu_weight = func_redu_f_weight
    
    m_weight_graph.append(m_weight)
    m_redu_graph.append(func_redu_m_weight)
    f_weight_graph.append(f_weight)
    f_redu_graph.append(func_redu_f_weight)

    person["Gender"] = gen
    person["Primary weight"] = weight
    person["Exercise hour per week"] = ex_time
    person["Calorie intake per day"] = cal_in
    person["Age"] = age
    person["Starting body fat percentage"] = fat_per
    person["Reduced weight"] = func_redu_weight
    total_reduced_weight += func_redu_weight
    total_fat_per += fat_per
    total_weight += weight
    # Add the person's data to the list
    data.append(person)
print(total_weight/30000)
print(total_fat_per/30000)
print(total_reduced_weight/30000)

# Plot the data
plt.scatter(m_weight_graph, m_redu_graph, s=3)
plt.scatter(f_weight_graph, f_redu_graph, s=3)

# Add labels and title
plt.xlabel('weight')
plt.ylabel('redu_weight')
plt.title('male & female')
# Show the plot
plt.show()




# Write the data to a CSV file
with open("weight_loss_data.csv", "w") as f:
    writer = csv.DictWriter(f, fieldnames=["Primary weight", "Exercise hour per week", "Calorie intake per day", 
    "Age", "Gender", "Starting body fat percentage", "Reduced weight"])
    writer.writeheader()
    writer.writerows(data)

 

csv파일로 생성된 3만명의 가상data

 

분포도

 

가중치를 저장해두는 소스코드

wlp_models.py

# Importing the libraries
import pandas as pd
import tensorflow as tf

# Data Preprocessing

# Importing the dataset
dataset = pd.read_csv('weight_loss_data.csv')
X = dataset.iloc[:, :-1].values
y = dataset.iloc[:, -1].values

# Label Encoding the "Gender" column
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
X[:,4] = le.fit_transform(X[:,4])

# Splitting the dataset into the Training set and Test set
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state = 0)

#Feature Scaling
from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
X_train = sc.fit_transform(X_train)
X_test = sc.transform(X_test)

# Building the ANN
ann = tf.keras.models.Sequential()

ann.add(tf.keras.layers.Dense(units=12, activation='relu'))
ann.add(tf.keras.layers.Dense(units=12, activation='relu'))
ann.add(tf.keras.layers.Dense(units=12, activation='relu'))
ann.add(tf.keras.layers.Dense(units=12, activation='relu'))
ann.add(tf.keras.layers.Dense(units=12, activation='tanh'))
ann.add(tf.keras.layers.Dense(units=12, activation='tanh'))

ann.add(tf.keras.layers.Dense(units=1, activation='linear'))

# Training the ANN
ann.compile(optimizer = 'adam', loss = 'mean_squared_error', metrics=['mse'])

ann.fit(X_train, y_train, batch_size = 32, epochs = 60)

ann.save("weight_loss_ann.h5")

 

저장해놓은 가중치를 이용하여 추론을 진행하는 소스코드

prediction.py

import tensorflow as tf
import pandas as pd
from sklearn.preprocessing import StandardScaler

loaded_model = tf.keras.models.load_model("weight_loss_ann.h5")

dataset = pd.read_csv('weight_loss_data.csv')
X = dataset.iloc[:, :-1].values
y = dataset.iloc[:, -1].values

from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
X[:,4] = le.fit_transform(X[:,4])

#Feature Scaling
sc = StandardScaler()
X = sc.fit_transform(X)

weight, hour, calorie, age, sex, fat = map(float,input().split())
#print(ann.predict(sc.transform([[몸무게, 주당 운동시간, 1일 섭취 칼로리, 나이, 성별(여자=0,남자=1), 체지방량]])))
print(loaded_model.predict(sc.transform([[weight, hour, calorie, age, sex, fat]])))

52kg 체지방률 25.2% 24살 여성이 매일 1800kcal를 먹고 일주일에 5시간 운동하면 1.55kg이 감소할 것이라는 예측 결과가 나온다.
81kg 체지방률 28.3% 24살 남성이 매일 1920kcal를 먹고 일주일에 5시간 운동하면 2.92kg이 감소할 것이라는 예측 결과가 나온다.

결과도 굉장히 합리적이고 그럴싸한 예측이 나왔다.

 

처음으로 완성해본 모델이어서 의미가 컸고 결국 sklearn이나 tensor의 library를 사용하기 때문에 모델을 만드는 것 자체에서 어려움은 크지 않지만 데이터를 구성하는 것이 정말정말 중요함을 느꼈다. 현실적이고 적절한 데이터를 만들어서 preprocessing하는 것이 정말 중요했고 시간을 많이 투자했다. 추가적으로 데이터를 다룰때 matplotlib 라이브러리를 이용하여 visualization을 해가며 데이터를 컨트롤 하는것이 굉장히 유용함을 느꼈다. 세부적인 것에 대해서는 차차 하나씩 자세히 공부하여 글로 남기려한다.


 

728x90

'Drawing (AI) > Models' 카테고리의 다른 글

Fake news detection  (0) 2023.06.15
OpenAI 숨바꼭질 전문(?) AI  (0) 2023.02.19