돌연변이 위치에 따른 항체 생산량 예측하기
0. 목적¶
mljar-supervised
라는 AutoML 패키지를 사용해 돌연변이 위치에 따른 항체 발현량 예측하는 문제를 풀어보겠습니다.
0.1. 데이터 출처¶
Ohri R, Bhakta S, Fourie-O'Donohue A, et al. High-Throughput Cysteine Scanning To Identify Stable Antibody Conjugation Sites for Maleimide- and Disulfide-Based Linkers. Bioconjug Chem. 2018;29(2):473-485. doi:10.1021/acs.bioconjchem.7b00791
0.2. 데이터셋 설명¶
데이터셋은 다음 9개의 열로 구성되어 있습니다.
- Linker: maleimide linker(vc) 또는 pyridyl disulfide linker(PDS) 링커 구분
- HC/LC: 항체의 light chain(LC) 혹은 heavy chain(HC) 표기
- Residue: 원래의 아미노산 잔기
- MutationSite: 돌연변이 부위
- Conc(mg/ml): 단백질 농도는 280nm에서 흡광도와 280nm에서 항체의 흡광 계수를 사용하여 계산되었습니다.
- %Agg: 응집된 항체의 비율은 SE-HPLC에 의해 평가되었습니다.
- DAR: 약물 대 항체 비율, mAb에 접합 된 약물의 수는 LC/MS 분석에 의해 정량화되었습니다.
- Reox: LC/MS 분석을 통해 항체가 정상적으로 reoxidation되었는지 판단합니다.
- Stability: 랫(Rat)의 혈장에서 37도로 48시간 두었을때 변화한 DAR 비율
1. mljar-supervised¶
mljar-supervised
는 테이블 형식 데이터에 작동하는 자동화된 기계 학습 파이썬 패키지입니다. 데이터를 전처리하고, 기계 학습 모델을 구성하고, 하이퍼 매개 변수 조정을 수행하여 최상의 모델을 찾는 일반적인 방법을 추상화 해서 우리의 시간을 절약하도록 설계되었습니다😎.
1.1. 설치¶
다음과 같이 pip
명령어를 사용해 설치할 수 있습니다.
pip install mljar-supervised
더 자세한 설치방법은 다음의 링크 https://github.com/mljar/mljar-supervised 를 확인하세요.
2. 분석하기¶
먼저 pandas
를 사용해 해당 데이터셋의 내용을 살펴봅니다.
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
df = pd.read_csv("adc.csv")
df.head(10)
데이터셋의 컬럼 목록, 모양, 간단한 수치 통계도 살펴봅니다.
df.columns
df.shape
df.describe()
seaborn
을 사용해서 간단한 시각화도 해봅니다.
g = sns.PairGrid(df, diag_sharey=False)
g.map_upper(sns.scatterplot, s=15)
g.map_lower(sns.kdeplot)
g.map_diag(sns.kdeplot, lw=2)
데이터들이 대체로 두가지 분류로 나뉘는 것을 알 수 있습니다. 예를 들면 농도가 0인 것과 2인 것으로 분류할 수 있고 %Agg 도 0에 가깝거나 100에 가까운 그룹으로 나눌 수 있겠습니다. 이런 데이터셋은 바이어스(bias)가 있을 가능성이 커서 기계 학습하기에는 적합하지 않다고 볼 수 있습니다.
3. mljar-supervised 사용하기¶
데이터셋을 학습용과 테스트용으로 나눕니다. 그리고 각각의 크기를 출력합니다.
from sklearn.model_selection import train_test_split
from supervised.automl import AutoML # mljar-supervised
X = df[
[
"Linker",
"HC/LC",
"Residue",
"MutationSite",
"%Agg",
"DAR",
"Reox",
"Avg.Stability",
]
]
y = df["Conc.(mg/mL)"]
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.20, random_state=42
)
print(X_train.shape, X_test.shape)
3.1 AutoML로 모델 학습¶
automl = AutoML(mode="Explain")
automl.fit(X_train, y_train)
학습된 모델의 성능은 rmse으로 측정되었으며 가장 좋은 값은 0.579981
입니다. mljar-supervised
은 결과를 AutoML_XX
라는 폴더로 저장해줍니다. 폴더 안을 각각의 모델에 대한 분석값이 들어 있습니다.
3.2. 예측 결과 시각화 하기¶
x축은 실제 값으로 y축은 예측된 값인 scatter plot을 그려봅니다.
predict_1 = automl.predict_all(X_test)
df_plot = pd.DataFrame()
df_plot["True_value"] = y_test.values
df_plot["Pred_1"] = predict_1.prediction.values
g = sns.jointplot(
x="True_value", y="Pred_1", data=df_plot, kind="reg", truncate=False, height=7
)
3.3. hyper parameter 최적화하기¶
mljar-supervised
에는 hyper parameter를 다음과 같이 손쉽게 최적화 할 수 있습니다.
automl = AutoML(algorithms=["Random Forest", "Xgboost"], mode="Compete")
automl.fit(X_train, y_train)
가장 좋은 rmse값은 0.569267
입니다. 큰 진전은 없어보입니다. 다시 시각화를 해서 살펴보겠습니다.
predict_2 = automl.predict_all(X_test)
df_plot["Pred_2"] = predict_2.prediction.values
g = sns.jointplot(
x="True_value", y="Pred_2", data=df_plot, kind="reg", truncate=False, height=7
)
기존 모델과 최적화된 모델의 차이를 scatter plot 시각화해서 살펴보겠습니다.
plt.figure(figsize=(7, 7))
plt.plot(y_test, predict_1.prediction, ".", label="model1")
plt.plot(y_test, predict_2.prediction, ".", label="model2")
plt.ylim(-0.1, 4.5)
plt.xlim(-0.1, 4.5)
plt.xlabel("True value")
plt.ylabel("Predicted value")
plt.legend()
큰 차이는 보이지 않지만 hyper parameter가 최적화된 모델에는 몇개의 데이터가 중심에서 벗어난 것 처럼 보입니다.
4. 마치며¶
그동안 기계 학습에서 적합한 모델을 선택하고 hyper parameter를 최적화하는 작업은 사용자가 할 일이라고 여겨져왔습니다. 그러나 AutoML이라는 개념이 등장하면서 이제 사용자들은 feature engineering에 집중할 수 있게 되었습니다. 그런 AutoML 도구 중에 mljar-supervised
패키지는 쉬운 사용법과 상당히 깔끔한 보고서를 만들 수 있게 해줍니다. 앞으로는 feature engineering 마져 자동화하는 도구가 나올지도 모른다는 생각이 듭니다.