跳轉到主要內容
工程的博客

檢測高危患者真實世界數據

如何使用機器學習健康三角洲湖上運行時和MLflow預測病人的疾病
分享這篇文章

隨著低成本的崛起基因組測序和AI-enabled醫療成像,已經有大量的精密醫學的興趣。在精密醫學,我們的目標是使用數據和AI想出最好的治療疾病。雖然精密醫學改善結果病人患有罕見疾病和癌症,精密醫學活性:病人生病精密醫學部署。

當我們看醫療開支,結果,有一個巨大的機會來提高醫療費用和生活質量防止慢性疾病如糖尿病,心髒病,或物質使用障礙。在美國,7的死亡和85%的醫療支出是由慢性疾病,發現類似的趨勢在歐洲東南亞。非傳染性疾病通常可預防通過病人教育和解決潛在的問題,推動慢性病。這些問題包括潛在生物風險等因素已知基因驅動神經疾病的風險、社會經濟等因素環境汙染或缺乏健康食品/預防保健,風險行為如吸煙狀態、飲酒或久坐不動的生活方式

精密的預防重點是使用數據,以確定患者群體的風險患上某種疾病,然後提供幹預措施,減少疾病的風險。幹預可能包括數字應用程序遠程監控高危患者並提供生活方式和治療建議,增加疾病狀態的監測,或提供補充預防保健。然而,部署這些幹預措施首先取決於識別高危病人。

最有力的工具之一識別高危患者是使用真實世界的數據(RWD),集體一個術語,是指由醫療生態係統生成的數據,如電子病曆(EMR)和健康記錄(EHR)住院治療,臨床實踐、藥房、衛生保健提供者,和越來越多的數據收集從其他來源,如基因組學、社交媒體和衣物。在我們的上一篇博文我們演示了如何建立一個臨床數據從EHR數據湖。在這個博客中,我們在此基礎上通過使用磚統一數據分析平台的跟蹤病人的旅程並創建一個機器學習模型。Beplay体育安卓版本使用這個模型,因為病人的遭遇曆史和人口統計信息,我們可以評估病人的風險對於一個給定的條件在一個給定的時間窗內。在這個例子中,我們將著眼於藥物過度使用,考慮到一個重要的話題廣泛的不良健康狀況由物質使用障礙。通過跟蹤模型MLflow,我們可以很容易地跟蹤模型已經改變隨著時間的推移,添加信心的過程部署模型轉換為病人護理

疾病預測磚上使用機器學習

從電子健康檔案數據參考體係結構預測疾病風險

數據準備

培訓風險模型來預測在給定的時間,我們需要一個數據集,捕捉有關病人的人口統計信息(如年齡時遇到、種族等)以及對病人的診斷曆史時間序列數據。我們可以使用這些數據來訓練模型,學習影響病人的診斷和人口風險的可能性被診斷出患有一種疾病在即將到來的時期。

圖顯示的模式和表之間的關係從電子健康檔案中提取。
圖1:數據模式和表之間的關係從電子健康檔案中提取

訓練該模型中,我們可以利用病人的遇到記錄和統計信息,可以在電子健康記錄(EHR)。圖1描繪了表中,我們將使用工作流。這些表是準備使用我們之前的筆記本的博客。我們將繼續加載接觸,組織和病人數據從三角洲湖(PII混淆信息)並創建一個dataframe所有病人的遭遇以及病人的人口統計信息。

patient_encounters=(遇到加入(病人,“病人”])加入(組織、“組織”]))顯示器(patient_encounters.filter (REASONDESCRIPTION不是空的).limit (10))

基於目標的條件,我們也選擇的一組病人資格被包括在訓練數據。即,我們包括病例,患者至少有一次被診斷出患有這種疾病通過他們遇到曆史,和同等數量的控製,病人沒有任何疾病的曆史。

positive_patients=(patient_encounters選擇(“病人”)在哪裏(較低的(“REASONDESCRIPTION”)。就像(“% {}%”.format (條件))).dropDuplicates ().withColumn (“is_positive”點燃(真正的)))negative_patients=(all_patients加入(positive_patients=(“病人”),如何=“left_anti”).limit (positive_patients。()).withColumn (“is_positive”點燃()))patients_to_study=positive_patients.union (negative_patients)

現在我們限製我們組遇到患者納入研究。

qualified_patient_encounters_df=(patient_encounters加入(patients_to_study=(“病人”])過濾器(描述不是零))

現在我們有興趣的記錄,我們的下一步是添加功能。對於這個預測任務,除了人口統計信息,我們選擇的總數乘以他已被診斷出患有條件或任何已知的共存條件(並發症)和以前遇到的數量作為給定遇到的曆史背景。

盡管對於大多數疾病有廣泛的文獻共病情況,我們還可以利用數據在我們的現實世界的數據集來確定與目標相關的並發症情況。

comorbid_conditions=(positive_patients。加入(patient_encounters,(“病人”])在哪裏(坳(“REASONDESCRIPTION”).isNotNull ()).dropDuplicates ([“病人”,“REASONDESCRIPTION”]).groupBy (“REASONDESCRIPTION”)。().orderBy (“數”,提升=).limit (num_conditions))

在我們的代碼中,我們使用筆記本電腦部件指定數量的並發症包括,以及長時間(天)在遇到。這些參數使用MLflow記錄的跟蹤API

使用MLflow記錄參數,就像我們學習的條件。

現在我們需要添加到每個遇到疾病特征。相應疾病我們添加一個列,顯示多少次感興趣的條件已經觀察到的過去,即。

指標函數求和,xi, c,因為我在線性調頻≤我< t, c。

在哪裏

習指標函數的定義,c, 1如果病人被診斷為條件c時,我,否則為0。

我們在兩個步驟添加這些特性。首先,我們定義一個函數,疾病指標函數(即補充道。x我,c):

def add_comorbidities (qualified_patient_encounters_df comorbidity_list):output_df=qualified_patient_encounters_dfidx=0伴隨疾病comorbidity_list:output_df=(output_df.withColumn (“comorbidity_ % d”%idx (output_df [“REASONDESCRIPTION”]。就像(“%”+伴隨疾病(“REASONDESCRIPTION”]+“%”))。(“int”)).withColumn (“comorbidity_ % d”%idx,合並(坳(“comorbidity_ % d”%idx),點燃(0)))#替換0.cache ())idx+=1返回(output_df)

然後我們和這些指標函數在一個連續的天使用的範圍引發SQL的強大支持窗口函數:

def add_recent_encounters (encounter_features):lowest_date=(encounter_features選擇(“START_TIME”).orderBy (“START_TIME”).limit (1).withColumnRenamed (“START_TIME”,“EARLIEST_TIME”))output_df=(encounter_features.crossJoin (lowest_date).withColumn(“天”,datediff(坳(“START_TIME”)、坳(“EARLIEST_TIME”))).withColumn (“patient_age”, datediff(坳(“START_TIME”)、坳(“生日”))))w=(Window.orderBy (output_df [“天”]).partitionBy (output_df [“病人”]).rangeBetween (- - - - - -int(num_days),1))comorbidity_idx範圍(num_conditions):col_name=“recent_ % d”%comorbidity_idxoutput_df=(output_df.withColumn (col_name總和(坳(“comorbidity_ % d”%comorbidity_idx))。(w)).withColumn (col_name合並(坳(col_name),點燃(0))))返回(output_df)

添加疾病特性後,我們需要添加目標變量,這表明病人是否患有目標條件在一個特定的窗口在未來的時間(例如一個月後當前遇到的)。這個操作的邏輯非常類似於前麵的步驟中,隨著時間的不同窗口覆蓋未來事件。我們隻使用一個二進製標簽,表明診斷我們感興趣是否會發生在未來。

def add_label (encounter_features num_days_future):w=(Window.orderBy (encounter_features [“天”]).partitionBy (encounter_features [“病人”]).rangeBetween (0num_days_future))output_df=(encounter_features.withColumn (“標簽”,馬克斯(坳(“comorbidity_0”))。(w)).withColumn (“標簽”,合並(坳(“標簽”),點燃(0))))返回(output_df)

現在我們寫這些功能特性存儲在三角洲湖。為了保證重現性,我們添加mlflow實驗ID和運行ID列存儲的特性。這種方法的優點是,我們得到更多的數據,我們可以將新特性添加到featurestore可以重用是指在未來。

控製在我們的數據質量問題

在我們推進培訓任務之前,我們看一下數據,看看不同的標簽類間分布。二進製分類在許多應用程序中,一個類可以是罕見的,例如在疾病預測。這個類不平衡將產生負麵影響學習過程。在評估過程中,模型往往集中在多數類的罕見的事件。此外,評估過程也大打折扣。例如,在一個不平衡數據集分別與標簽分布的95%和0/1 % 5,模型總是0,預計會有95%的準確性。如果標簽不平衡,那麼我們需要申請一個常見的技術為糾正不平衡數據。

隻有4%的相遇在我們訓練集之前疾病診斷。

看著我們的訓練數據,我們看到(圖2),這是一個很不平衡的數據集:超過95%的觀測時間窗口沒有顯示診斷的證據。為不平衡調整,我們可以downsample控製類或生成合成樣品。這個選擇的數量取決於數據集的大小和功能。在這個例子中,我們downsample多數類來獲得一個平衡的數據集。注意,在實踐中,您可以選擇相結合的方法,例如downsample大多數類也分配類權重訓練算法

df1=dataset_df.filter (“標簽= = 1”)n_df1=df1。()df2=dataset_df.filter (“標簽= = 0”)采樣(,0.9).limit (n_df1)training_dataset_df=df1.union (df2)采樣(,1.0)顯示器(training_dataset_df.groupBy (“標簽”)。())

使用抽樣來平衡我們的數據集。

模型訓練

訓練模型,我們增加我們的條件與人口和伴隨疾病特性的一個子集,每個觀察應用標簽,並將數據傳遞給下遊模型的訓練。例如,在這裏我們增加我們的近期並發症診斷遇到類(例如,這是任命預防保健還是一個ER訪問?),和訪問的成本,對人口統計信息,我們選擇種族、性別、Zip和病人的年齡時的遭遇。

最常見的,雖然最初的臨床數據可以添加字節,後進行過濾和基於包含/排除標準限製記錄,我們最終得到一個數據集,可以在單個機器上訓練。我們可以很容易地改變dataframes火花熊貓dataframes和火車模型基於任何算法的選擇。當使用磚毫升運行時,我們可以訪問一個廣泛的開放毫升庫可用。

任何機器學習算法需要設置的參數(超參數),並根據輸入參數可以改變。此外,在某些情況下,錯誤的參數或算法會導致過度擬合。確保模型表現良好,我們使用hyperparameter調優選擇最佳模型的體係結構,然後我們將培訓最終模型通過指定的參數獲得這一步。

執行模型調優,我們首先需要預處理數據。在這個數據集,除了數字特征(例如項近期並發症),我們也有定我們想使用的人口數據。分類數據,最好的方法是使用one-hot-encoding。主要有兩個原因:第一,大多數分類器(在這種情況下,邏輯回歸),操作數值特性。第二,如果我們隻是分類變量轉換為數字指標,將在我們的數據可以介紹ordinality誤導分類:例如,如果我們國家名稱轉換為指標,例如加州5和紐約23,然後比加州紐約變得“更大的”。雖然這反映了每個州的名字按字母順序排列的索引列表,在我們的模型中,這個命令並不意味著什麼。One-hot-encoding消除這種影響。

預處理步驟在這種情況下並不需要任何輸入參數和hyperparameters隻影響分類器而不是預處理部分。因此,我們分別進行預處理,然後使用生成的數據集對模型調優:

sklearn.preprocessing進口OneHotEncoder進口numpy作為npdefpre_process(training_dataset_pdf):X_pdf = training_dataset_pdf.drop (“標簽”軸=1)y_pdf = training_dataset_pdf [“標簽”]onehotencoder = onehotencoder (handle_unknown =“忽略”)one_hot_model = onehotencoder.fit (X_pdf.values)X = one_hot_model.transform (X_pdf)y = y_pdf.values返回(X, y)

接下來,我們想選擇最好的參數模型。這個分類中,我們使用LogisticRegression彈性淨處罰。注意應用one-hot-encoding之後,根據分類變量的基數問題,我們可以得到許多功能可以超越樣本的數量。為了避免過度擬合的問題,一個點球是應用於目標函數。彈性網的advanaget正規化是它結合了兩種處罰技術(套索嶺回歸)和混合的程度可以由一個控製變量,在hyperparameter調優。

改進模型,我們搜索hyperparameters使用網格hyperopt找到最好的參數。此外,我們使用SparkTrialshyperopt模式執行hyperparameter並行搜索。這個過程利用磚”管理MLflow自動對應於每個hyperparameter運行日誌參數和指標。驗證每組參數,我們使用一個k倍交叉驗證使用脫脂F1的分數作為指標評估模型。注意,因為k倍交叉驗證生成多個值,我們選擇的最低得分(最壞的情況)和嚐試,當我們使用hyperopt最大化。

應用dataframe預處理功能訓練。

數學進口經驗def params_to_lr (params):返回{“懲罰”:“elasticnet”,“multi_class”:“表達”,“random_state”:43,“n_jobs”:1,“規劃求解”:“傳奇”,“托爾”:經驗值(params [“托爾”]),#經驗值()因為hyperparams日誌空間“C”:經驗值(params [“C”]),“l1_ratio”:經驗值(params [“l1_ratio”])}def tune_model (params):mlflow.start_run (run_name=“tunning-logistic-regression”、嵌套=真正的)作為運行:clf=LogisticRegression (**params_to_lr (params))。fit (X, y)損失=- - - - - -cross_val_score (clf, X, y, n_jobs=1,得分=“f1”)。最小值()返回{“狀態”:STATUS_OK,“損失”:損失}

改善我們的搜索空間,我們在logspace選擇參數的網格,定義一個轉換函數將建議由hyperopt參數。為一個偉大的概述的方法,為什麼我們選擇定義hyperparameter這樣的空間,看看這個演講覆蓋如何管理端到端毫升生命周期數據磚。

hyperopt進口fmin、惠普、tpe、SparkTrials STATUS_OKsearch_space = {#使用統一loguniform隻是為了使指標出現更好在mlflow比較,logspace“托爾”:hp.uniform (“托爾”,3,0),“C”:hp.uniform (“C”,2,0),“l1_ratio”:hp.uniform (“l1_ratio”,3,1),}spark_trials = SparkTrials(並行=2)best_params = fmin (fn=tune_model,空間=search_space,算法=山丘建議,max_evals= 32,rstate=np隨機RandomState(43),試用=spark_trials)

這是最好的運行參數的結果,評估基於F1-score交叉驗證。

params_to_lr (best_params)(46]:{“懲罰”:“elasticnet”,“multi_class”:“表達”,“random_state”:43,“n_jobs”:1,“規劃求解”:“傳奇”,“托爾”:0.06555920596441883,“C”:0.17868321158011416,“l1_ratio”:0.27598949120226646}

現在讓我們看一下MLflow儀表板。MLflow自動組的所有運行hyperopt在一起,我們可以使用各種陰謀檢查每個hyperparameter損失函數的影響,如圖3所示。這是特別重要的獲得更好的理解我們的行為模型和hyperparameters的效果。例如,C,我們指出,降低值的逆正則化力量,導致更高的F1值。

為我們的模型在MLflow平行坐標圖。
圖3所示。為我們的模型在MLflow平行坐標圖。

尋找最優參數組合後,我們的火車的二元分類器最優使用MLflow hyperparameters和日誌模型。MLflow的模型api可以方便地存儲模型,不管底層庫,用於培訓,作為一個python函數,可以在模型後來被稱為得分。與模型的可發現性,幫助我們記錄模型使用一個名稱與目標相關聯的條件(例如在這種情況下,“吸毒過量”)。

進口mlflow.sklearn進口matplotlib.pyplot作為pltsklearn.pipeline進口管道mlflow.models.signature進口infer_signature# #因為我們希望模型預測輸出概率(風險),而不是標簽,我們覆蓋# # mlflow。pyfun的預測方法:SklearnModelWrapper(mlflow.pyfunc.PythonModel):def__init__(自我,模型):自我。模型=模型def預測(自我,上下文,model_input):返回self.model.predict_proba (model_input) [:,1]def火車(參數個數):mlflow.start_run (run_name =“training-logistic-regression”嵌套=真正的)作為運行:mlflow.log_params (params_to_lr (params))X_arr = training_dataset_pdf.drop (“標簽”軸=1). valuesy_arr = training_dataset_pdf [“標簽”). values鹹寧= OneHotEncoder (handle_unknown =“忽略”)clf = LogisticRegression (* * params_to_lr (params))。fit (X, y)管道管= (((在一個炎熱的鹹寧),(“clf”,clf)))
              lr_model =管。fit (X_arr y_arr)分數= cross_val_score (clf ohe.transform (X_arr) y_arr, n_jobs = -1,得分=“準確性”).mean ()wrapped_lr_model = SklearnModelWrapper (lr_model)model_name =“- - -”. join (condition.split ())mlflow.log_metric (“準確性”,得分)mlflow.pyfunc。log_model (model_name python_model = wrapped_lr_model)displayHTML (模型的精度是:< b風格=“顏色:番茄;”> % s < / b > '%(分數))返回(mlflow.active_run () . info)

現在,我們可以通過訓練模型從上一步獲得的最佳參數。

注意模型訓練,包括預處理(一個炎熱的編碼)的一部分sklearn管道和日誌編碼器和分類器作為一個模型。在下一步中,我們可以簡單地調用模型對病人數據和評估他們的風險。

模型部署和productionalization

訓練後的模型和測井MLflow,下一步是使用模型評分新數據。MLflow的特點之一是,您可以搜索實驗基於不同的標簽。例如,在本例中,我們使用的運行名稱檢索構件URI指定在模型訓練的訓練模型。我們可以基於關鍵指標的順序檢索實驗。

進口mlflowbest_run = mlflow.search_runs (filter_string =“tags.mlflow.runName = training-logistic-regression”order_by = (的指標。準確性DESC”]).iloc [0]model_name =藥物過量的clf = mlflow.pyfunc.load_model (model_uri =“% s / % s”% (best_run.artifact_uri model_name))clf_udf = mlflow.pyfunc。spark_udf(火花,model_uri =“% s / % s”% (best_run.artifact_uri model_name))

一旦我們選擇了一個特定的模型,我們可以加載模型通過指定URI和名稱:

加載特性。

應用加載模型從MLflow dataframe的特性。

我們還可以使用磚的模型注冊中心來管理模型的版本,也生產生命周期和簡單模型服務。

預防疾病預測翻譯成精密

在這個博客中,我們走過需要精密預防係統,確定臨床和人口,反是推動慢性病的發病。然後我們看著一個端到端的機器學習工作流程,使用模擬數據從一個EHR識別病人服藥過量的風險。這個工作流,年底我們可以導出毫升模型我們從MLflow訓練,我們應用到一個新的病人數據流。

雖然這個模型是有用的,但它並沒有影響到轉化為實踐。在現實世界中實踐中,我們已經與許多客戶合作,將這些和類似的係統部署到生產。beplay体育app下载地址例如,在南卡羅萊納醫科大學的,他們能夠部署用管道加工電子健康檔案數據,以確定患者膿毒症的風險。這導致檢測sepsis-related病人提前8小時下降。在INTEGRIS健康一個相似的係統,電子健康檔案數據監控對新興壓力潰瘍發展的跡象。在這兩個設置,當病人被發現,護理團隊注意到了他們的身體狀況。在健康保險的設置中,我們曾與部署為聯合健康集團類似的模型。他們能夠開發一種疾病預測引擎,複發性神經網絡用於長期短期架構確定疾病進展良好的泛化在九個不同的疾病領域。這個模型被用來使患者預防保健途徑,改善結果和對慢性疾病病人的醫療費用。

雖然我們大多數的博客都集中在疾病預測算法的使用在醫療環境中,還有一個強大的機會,構建和部署這些模型在製藥環境。疾病預測模型可以提供深入了解藥物使用時間設置,甚至發現先前未被發現的保護作用,可以通知標簽擴張的努力。此外,時可以有用的疾病預測模型在臨床試驗登記尋找珍貴、否則underdiagnosed-diseases。通過創建一個模型,觀察患者誤診之前收到一種罕見的疾病診斷,我們可以創建教育材料,培養臨床醫生對常見誤診模式,希望創建試驗入選標準導致增加試驗登記和更高的功效。

開始使用精密預防健康三角洲湖

在這個博客中,我們演示了如何使用機器學習在現實世界的數據,以確定患者患慢性疾病的風險。了解更多關於使用三角洲湖存儲和處理臨床數據集,我們的下載免費電子書使用真實世界臨床數據集。你也可以開始一個免費試用今天使用病人風險得分筆記本從這個博客。

免費試著磚

相關的帖子

看到所有工程的博客的帖子
Baidu
map