머신러닝이 약학에 어떻게 적용될 수 있을지 간단히 정리해 보았다.
약동학 = 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]]
코드 원문 링크
'기타' 카테고리의 다른 글
Attack Lab(어택랩) 풀이 (ctarget 1~3, rtarget touch 2~3) (시스템프로그래밍) (1) | 2022.07.09 |
---|---|
Bomb Lab(밤랩) Phase 1 ~ Phase 6 + Secret Phase 풀이 (시스템프로그래밍) (0) | 2022.07.09 |
[C/C++] int 범위 초과 걱정 없이 코딩하는 방법 (int를 long long처럼 사용) (0) | 2022.05.13 |
코드포스 Educational Codeforces Round 127 풀이 (A ~ C) (0) | 2022.04.24 |
코드포스 Educational Codeforces Round 126 풀이 (A ~ C) (0) | 2022.04.10 |