기타

머신러닝이 약학에 어떻게 적용될 수 있을까?

restudy 2024. 7. 17. 21:24
반응형

머신러닝이 약학에 어떻게 적용될 수 있을지 간단히 정리해 보았다.

 

약동학 = pharmacokinetic

- 약물이 체내에서 어떻게 ADME(흡수, 분포, 대사, 배설) 되는지 연구

- 약물의 체내 행동을 시간에 따라 분석하고, 약물의 농도-시간 곡선을 평가하여 약물의 효과를 예측

 

 

ECMO (체외막산소요법, Extracorporeal Membrane Oxygenation)

- (회복 가능성이 있는 심부전 환자에 대해) 정맥혈을 뽑아내어 혈액에 산소를 공급하고 환자의 순환 및 호흡 기능을 보조하는 장치

- 사용 시 병용되는 약물: 항응고제, 항생제, 진정제 및 진통제, 이뇨제, 심혈관계 약물

 

 

머신러닝(ML)과 딥러닝(DL)의 활용

환자의 연령, 체중, 신장 기능, 간 기능, 병력 등 약물 투여에 중요한 변수에 따른 최적의 약물 투여량을 ML/DL로 결정할 수 있다.

다만, 여기에 어떤 머신러닝 모델을 선택할지 문제의 특성데이터의 특성에 따라 달라진다.

 

 

머신러닝(ML) 모델의 종류

- 선형 회귀: 비선형 관계를 잘 처리하지 못함 (당연히 최적의 약물 농도 구할 때에는 쓸 수 없음)

- 랜덤 포레스트: 여러 개의 트리가 각각의 추론을 수행하고, 여러 트리들의 추론 결과를 종합하여 최종 결정

  - 큰 데이터셋에서 훈련 시간 오래 걸린다고 함

 

 

Scikit-learn과 Tensorflow

Scikit-learn: 머신러닝에 자주 사용되는 라이브러리

Tensorflow: 딥러닝에 자주 사용되는 라이브러리

 

다음은 훈련 데이터로 선형 회귀를 학습시키고, 랜덤으로 생성한 테스트 데이터를 가지고 MSE를 측정해서 얼마나 학습이 잘 되었는지 확인하는 예제 코드이다.

 

- Scikit-learn 라이브러리의 머신러닝을 이용한 예제

import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error

X = np.array([[1], [2], [3], [4], [5]])
y = np.array([1, 3, 3, 2, 5])

# 훈련 데이터와 테스트 데이터로 분리
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 모델 초기화 및 훈련
model = LinearRegression()
model.fit(X_train, y_train)

# 예측 및 성능 평가
y_pred = model.predict(X_test)
mse = mean_squared_error(y_test, y_pred)

print("Mean Squared Error:", mse)
print("Predictions:", y_pred)
Mean Squared Error: 1.6530612244897955
Predictions: [1.71428571]

 

- Tensorflow 라이브러리의 딥러닝을 이용한 예제

import numpy as np
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.optimizers import Adam
from sklearn.model_selection import train_test_split

X = np.array([[1], [2], [3], [4], [5]])
y = np.array([1, 3, 3, 2, 5])

# 훈련 데이터와 테스트 데이터로 분리
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 모델 정의
model = Sequential()
model.add(Dense(10, input_dim=1, activation='relu'))
model.add(Dense(1))

# 모델 컴파일
model.compile(optimizer=Adam(learning_rate=0.01), loss='mean_squared_error')

# 모델 훈련
model.fit(X_train, y_train, epochs=100, verbose=0)

# 예측 및 성능 평가
y_pred = model.predict(X_test)
mse = np.mean((y_test - y_pred.flatten())**2)

print("Mean Squared Error:", mse)
print("Predictions:", y_pred.flatten())
Mean Squared Error: 1.2140690288737375
Predictions: [1.898152]

 

 

최적의 약물 투여량을 ML/DL로 구하는 방법

- 먼저 다음과 같은 데이터를 수집합니다.

  - 환자 데이터: 나이, 성별, 체중, 키, 병력 등 환자의 기본 정보
  - 약물 데이터: 약물 종류, 투여량, 투여 빈도
  - 생체 지표: 혈압, 혈당 수치, 심박수약물 투여 후 측정된 생체 지표
  - 치료 결과: 치료의 효과와 부작용 여부 등

 

- 딥러닝 모델(ANN, LSTM)을 이용하여 약물 투여와 결과 사이의 관계를 학습시켜 모델링합니다.

  (- 간단한 경우, 위에서 소개한 간단한 머신러닝 모델(선형 회귀, 랜덤 포레스트 등)을 활용할 수도 있음)

  (- 약물 투여량에 따른 생체 지표는 당연히 비선형으로 나오는 것이 상식적)

  - 딥러닝은 머신러닝에 비해 큰 규모의 학습 데이터가 필요합니다.

  - 하이퍼파라미터 튜닝 과정을 통해 최적의 성능을 내기 위한 하이퍼파라미터를 찾습니다.

 

 

다층 퍼셉트론(MLP)을 가진 인공 신경망(ANN)을 사용해 최적의 약물 투여량을 찾는 예제 코드

 - X: 환자의 다양한 특징을 나타내는 수치형 데이터 (여기서는 각각이 10개의 특징을 가진 데이터셋, 이것이 실제로는 환자의 나이, 성별, 체중, 키 등의 변수일 수 있음)
- Y: 각 환자에 대한 최적의 약물 투여량
- 결과적으로 얻어지는 것: '비선형'의 회귀 모델. 이 비선형의 회귀 모델을 통해 임의의 입력 데이터(= 환자 데이터)에 대해 최적의 약물 투여량을 예측할 수 있음

import numpy as np
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from sklearn.model_selection import train_test_split

# 가상의 예제 데이터 생성
# 실제로는 환자 데이터, 약물 데이터, 생체 지표 등으로 이루어진 데이터셋 사용
X = np.random.rand(1000, 10)  # 1000명의 환자, 10개의 특징
y = np.random.rand(1000)  # 1000명의 환자에 대한 약물 투여량

# 데이터를 훈련 데이터와 테스트 데이터로 분리
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 신경망 모델 정의
model = Sequential()
model.add(Dense(64, input_dim=X_train.shape[1], activation='relu'))
model.add(Dense(32, activation='relu'))
model.add(Dense(1))  # 약물 투여량을 예측하는 하나의 출력 뉴런

model.compile(optimizer='adam', loss='mean_squared_error')

# 모델 훈련 과정
model.fit(X_train, y_train, epochs=100, batch_size=32, verbose=1, validation_split=0.2)

# 모델을 평가
mse = model.evaluate(X_test, y_test)
print("Mean Squared Error:", mse)

# 새로운 데이터 예측
new_data = np.random.rand(1, 10)  # 가상의 새로운 환자 데이터
predicted_dosage = model.predict(new_data)
print("Predicted Dosage:", predicted_dosage)
Epoch 1/100
20/20 [==============================] - 1s 9ms/step - loss: 0.2945 - val_loss: 0.1110
Epoch 2/100
20/20 [==============================] - 0s 3ms/step - loss: 0.1119 - val_loss: 0.1002
Epoch 3/100
20/20 [==============================] - 0s 3ms/step - loss: 0.0952 - val_loss: 0.0989

...

Epoch 98/100
20/20 [==============================] - 0s 3ms/step - loss: 0.0414 - val_loss: 0.1202
Epoch 100/100
20/20 [==============================] - 0s 3ms/step - loss: 0.0411 - val_loss: 0.1229
7/7 [==============================] - 0s 1ms/step - loss: 0.1183
Mean Squared Error: 0.1182592362165451
Predicted Dosage: [[0.3699172]]

 

 

코드 원문 링크

 

GitHub - yeohj0710/ml-dl-simple-sample

Contribute to yeohj0710/ml-dl-simple-sample development by creating an account on GitHub.

github.com

 

 

반응형