前沿
2017年,國務(wù)院印發(fā)《新一代人工智能發(fā)展規(guī)劃》,“人工智能 ”寫入2024年政府工作報告。在醫(yī)學(xué)領(lǐng)域,人工智能已經(jīng)在影像、內(nèi)鏡圖像識別,電子病歷邏輯判斷等有著大量應(yīng)用,也寫入專家共識,例如《 人工智能在肺結(jié)節(jié)的應(yīng)用專家共識(2022年)》。
近幾年逐步提倡科研與轉(zhuǎn)化相結(jié)合,科研要服務(wù)于應(yīng)用。醫(yī)學(xué)人工智能的研究就可以很好的實際應(yīng)用于臨床工作。《Nature》《Science》等學(xué)術(shù)期刊均有專題報道,課題方面也是熱門的立項方向。
一、AI醫(yī)學(xué)優(yōu)勢:
(一)適合非高校的醫(yī)院的科研:
1、絕對大部分非高校直屬的醫(yī)院,少有獨立的生物學(xué)實驗室,生物學(xué)實驗室的維護成本極高。而人工智能醫(yī)學(xué)研究,算是一種輕資產(chǎn),最為核心的研究環(huán)節(jié)就是算法的構(gòu)建、算力的運用。固然,有專門的軟件和公司提供服務(wù),也可以采取醫(yī)院自建的模式,投入最大的是智力和精力。在經(jīng)費上投入不算多,因為是用于科學(xué)研究,對于信息安全等級要求不高,也沒有多少維護費用。
2、跟蛋白組學(xué)、基因組學(xué)研究類似,人工智能醫(yī)學(xué)的研究,其算法是對于臨床各個科室是通用的??蓱?yīng)用于影像組學(xué)的核心算法也可以用于構(gòu)建彩超圖像的模型。隨機森林、決策樹不僅可應(yīng)用于預(yù)測心肌梗死的預(yù)后,也可以應(yīng)用于護理的跌倒風(fēng)險評估,甚至可擴展到醫(yī)院行政管理。
3、目前,大部分醫(yī)院均實現(xiàn)電子病歷,產(chǎn)生海量的數(shù)據(jù)。而人工智能醫(yī)學(xué)的基礎(chǔ)在于數(shù)據(jù)。研究的設(shè)計簡單地歸納為兩個部分,① 臨床數(shù)據(jù)采集和需求、② 模型構(gòu)建和運行。臨床數(shù)據(jù)收集、臨床需求的確定,這個對于絕對部分醫(yī)院來說,是完全沒有問題的。而其中問題最大的是模型構(gòu)建和運行。而這塊跟高校的計算機實驗室恰恰相反,他們?nèi)鄙俚氖桥R床數(shù)據(jù)和需求。
4、做好人工智能醫(yī)學(xué)研究,可以有幾個方式。與高校的計算機實驗室合作、第三方集成平臺。但經(jīng)過實踐,再加上絕大部分代碼均可以在github上找到。以及論文的發(fā)表需要調(diào)參和提供原始代碼,醫(yī)院完全可以獨立開發(fā)算法和模型。構(gòu)建自己的人工智能醫(yī)學(xué)實驗室。
(二)軟件編程技能培養(yǎng):
目前人工智能的主流編程語言為python。近幾年P(guān)ython流行起來,除了在人工智能領(lǐng)域的應(yīng)用,它在資料收集、數(shù)據(jù)分析方面實在強勢。
只需要幾行簡短的代碼,它就可以:
● 網(wǎng)絡(luò)爬蟲,一鍵爬取全網(wǎng)公開資料
● 對實驗結(jié)果進行數(shù)據(jù)分析,讓觀點更科學(xué)嚴(yán)謹(jǐn)
● 批量處理上百個Excel、Word、PDF文件
● 生成可視化圖表,成果展示更專業(yè)……
工欲善其事,必先利其器。大數(shù)據(jù)時代,科研人想要如魚得水,學(xué)會Python應(yīng)當(dāng)提上日程。
當(dāng)前,醫(yī)院為了質(zhì)控控制和流程改造。院內(nèi)上線了各類系統(tǒng),并且還在不斷增加,醫(yī)療信息化建設(shè)是必然趨勢。
對信息系統(tǒng)使用和優(yōu)化,單純依賴信息科會導(dǎo)致迭代周期變慢。熟悉和了解編程原理,這對使用院內(nèi)信息系統(tǒng)有極大的幫助。更好服務(wù)于臨床工作。
(三)研究方向:
醫(yī)學(xué)人工智能從應(yīng)用場景角度,可以有以下領(lǐng)域:
① 機器學(xué)習(xí)(深度學(xué)習(xí))決策系統(tǒng):
基于一些復(fù)雜數(shù)據(jù)的結(jié)果預(yù)測。例如,手術(shù)結(jié)局預(yù)測,死亡風(fēng)險預(yù)測。
以手術(shù)成敗,死亡作為target,臨床診療過程中的所有因素做為Feature。流程為① 環(huán)境搭建 ② 數(shù)據(jù)預(yù)處理 ③ 選擇算法 ④ 算法訓(xùn)練 ⑤ 生成模型 ⑥ 模型測試(結(jié)果輸出)。這其中“選擇算法”可以選擇多種算法,對不同算法的結(jié)果進行比較;結(jié)果預(yù)測一般涉及機器學(xué)習(xí)(machine learning)。
“結(jié)果輸出”的指標(biāo):precision,ROC,F(xiàn)1, recall。
② 視覺識別(圖像識別):
屬于無監(jiān)督學(xué)習(xí)。對醫(yī)療圖像進行標(biāo)簽,主要涉及深度學(xué)習(xí)(deep learning)。就發(fā)表論文的成功概率來說,圖像識別更容易發(fā)表論文。
③ 自然語言處理:
可用于對病歷文本的數(shù)據(jù)分析和處理。
④ 語音處理:
適用于臨床問診和溝通。
(四)可投稿期刊列表:
1、Ann Transl Med
2、Math Biosci Eng
3、 Sci Rep
4、artificial intelligence in medicine(IF=5.3)
5、Journal of Digital Health
二、零基礎(chǔ)入門步驟:
(一)名詞與關(guān)系:
1.名詞解釋:
人工智能:人工智能(Artificial Intelligence),英文縮寫為AI。它是研究、開發(fā)用于模擬、延伸和擴展人工智能的理論、方法、技術(shù)及應(yīng)用系統(tǒng)的一門新的技術(shù)科學(xué)。
人工智能是計算機科學(xué)的一個分支,它企圖了解智能的實質(zhì),并生產(chǎn)出一種新的能與人類智能相似的方式做出反應(yīng)的智能機器,該領(lǐng)域的研究包括機器人、語言識別、圖像識別、自然語言處理和專家系統(tǒng)等。
機器學(xué)習(xí):機器學(xué)習(xí)(ML, Machine Learning)是一門多學(xué)科交叉專業(yè),涵蓋概率論知識,統(tǒng)計學(xué)知識,近似理論知識和復(fù)雜算法知識,使用計算機作為工具并致力于真實實時的模擬人類學(xué)習(xí)方式,并將現(xiàn)有內(nèi)容進行知識結(jié)構(gòu)劃分來有效提高學(xué)習(xí)效率。
機器學(xué)習(xí)還有下面幾種定義:
(1)機器學(xué)習(xí)是一門人工智能的科學(xué),該領(lǐng)域的主要研究對象是人工智能,特別是如何在經(jīng)驗學(xué)習(xí)中改善具體算法的性能。
(2)機器學(xué)習(xí)是對能通過經(jīng)驗自動改進的計算機算法的研究。
(3)機器學(xué)習(xí)是用數(shù)據(jù)或以往的經(jīng)驗,以此優(yōu)化計算機程序的性能標(biāo)準(zhǔn)。
深度學(xué)習(xí):深度學(xué)習(xí)(DL, Deep Learning)是機器學(xué)習(xí)(ML, Machine Learning)領(lǐng)域中一個新的研究方向,它被引入機器學(xué)習(xí)使其更接近于最初的目標(biāo)——人工智能(AI, Artificial Intelligence)。
深度學(xué)習(xí)是學(xué)習(xí)樣本數(shù)據(jù)的內(nèi)在規(guī)律和表示層次,這些學(xué)習(xí)過程中獲得的信息對諸如文字,圖像和聲音等數(shù)據(jù)的解釋有很大的幫助。它的最終目標(biāo)是讓機器能夠像人一樣具有分析學(xué)習(xí)能力,能夠識別文字、圖像和聲音等數(shù)據(jù)。深度學(xué)習(xí)是一個復(fù)雜的機器學(xué)習(xí)算法,在語音和圖像識別方面取得的效果,遠(yuǎn)遠(yuǎn)超過先前相關(guān)技術(shù)。
Python:一種流行的計算機編程語言。
2. 名詞關(guān)系:
人工智能是一個比較大的概念,更多是面向公眾。機器學(xué)習(xí)是人工智能實現(xiàn)的一個具體方法,而深度學(xué)習(xí)是機器學(xué)習(xí)的一個分支,難度更高。而目前實現(xiàn)機器學(xué)習(xí)、深度學(xué)習(xí)的編程,主流還是應(yīng)用python語言。有很多也使用R語言來做機器學(xué)習(xí)的研究。
(二)工作環(huán)境的搭建:
安裝:目前主流推薦Anaconda。其具體步驟可以按照知乎的這個教程:
① Anaconda安裝
https://zhuanlan.zhihu.com/p/339690068
② Anaconda安裝
https://zhuanlan.zhihu.com/p/432043531
說的是Anaconda安裝好后,就包含了python了。不過,我也沒理清之間的關(guān)系,保險一點可以把Python也安裝了。
Python的安裝:
https://zhuanlan.zhihu.com/p/363708165
費用:以上軟件商用是要收費的,不過,安裝的時候選擇個人使用是免費的。
(三)編輯器選擇:
編輯器就是我們編寫代碼的地方,安裝好Anaconda會有多種編輯器。具體哪一種更好,我也正在摸索。
(四)基礎(chǔ)知識:
Python也是一種編程語言,編程語言都有一些規(guī)則。比如,什么是字符串,引號是什么意思,怎么輸出結(jié)果。由于Python應(yīng)用于各個領(lǐng)域,厲害的Python大神都是各大公司搶著要的,我們跨界過去也不可能那么多精力,就主要學(xué)習(xí)最基本的框架和主要用于醫(yī)學(xué)領(lǐng)域的。這里推薦一個B站教學(xué)視頻:
https://www.bilibili.com/video/BV1rg411G7mp\”>
此外,也可以看官方文檔:
https://docs.python.org/3/tutorial/modules.html#importing-from-a-package
1、Python內(nèi)部環(huán)境部署:
1.1 python庫的安裝:
python庫的安裝有四個方法,主要分為在線安裝和離線安裝。
在線安裝:使用Anaconda prompt 界面 > pip install XXX
離線安裝:
1)在Python Extension Packages for Windows – Christoph Gohlke (uci.edu) 下載輪子>使用Anaconda prompt 界面 > cd 工作目錄 >pip install 輪子路徑 輪子名稱
2)github上下載源碼,對于醫(yī)學(xué)人工智能,最需要用到feature-selector的庫, 而這個庫只有g(shù)ithub上有。
WillKoehrsen/feature-selector: Feature selector is a tool for dimensionality reduction of machine learning datasets (github.com)github.com/WillKoehrsen/feature-selector
我在這個問題上卡了很久。下好源碼后,解壓壓縮包。使用Anaconda prompt 界面 > cd 工作目錄 >python setup.py install
1.2 機器學(xué)習(xí)環(huán)境部署標(biāo)準(zhǔn)三聯(lián):
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
常用語法和邏輯:
1)對于Python而言,冒號和縮進是一種語法。它會幫助Python區(qū)分代碼之間的層次,理解條件執(zhí)行的邏輯及先后順序。【注:縮進是四個空格或一個Tab鍵】
2)注意大小寫:name 'Fs' is not defined,F(xiàn)s,沒有被定義。最后發(fā)現(xiàn)是大小寫錯誤。前后代碼的大小寫一定要一致,否則會報錯。
3)使用jupter的時候,由于賦值的問題,需要重頭開始運行。如果,在某個代碼段運行報錯,有可能出現(xiàn)賦值錯誤。
1.3 ROC曲線的制作:
ROC曲線的全稱是“受試者工作特性”曲線(Receiver Operating Characteristic),源于二戰(zhàn)中用于敵機檢測的雷達信號分析技術(shù)。是反映敏感性和特異性的綜合指標(biāo)。它通過將連續(xù)變量設(shè)定出多個不同的臨界值,從而計算出一系列敏感性和特異性,再以敏感性為縱坐標(biāo)、(1-特異性)為橫坐標(biāo)繪制成曲線,曲線下面積越大,判別的準(zhǔn)確性越高。在ROC曲線上,最靠近坐標(biāo)圖左上方的點為敏感性和特異性均較高的臨界值。
## 輸出高清圖像
%config InlineBackend.figure_format = 'retina'
%matplotlib inline
ROC曲線做出來是一個圖像,所以,需要matplotlib這個庫,這個庫是python里面非常有用的庫。還可以做直方圖、散點圖、折線圖。也就不必另外用統(tǒng)計圖軟件了。
matplotlib.rcParams['axes.unicode_minus']=False
import seaborn as sns
sns.set(font= "Kaiti",style="ticks",font_scale=1.4)
import pandas as pd
pd.set_option("max_colwidth", 200)
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.preprocessing import LabelEncoder,label_binarize
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import *
這其中,sklearn.metrics 就是我們用來數(shù)據(jù)歸回/分類評估的核心庫。這個import*,后面這個*要注意,是包含所有模塊,但是使用有爭議,暫時也沒有找到其他代碼,先用著吧。
2、數(shù)據(jù)處理:
2.1、數(shù)據(jù)格式與提?。?/span>
我們就可以數(shù)據(jù)預(yù)處理。Python是可以支持CSV、Excel的數(shù)據(jù)庫格式,CSV可以直接從醫(yī)院的HIS系統(tǒng)導(dǎo)出,如果對于海量數(shù)據(jù)還是要選擇這種格式。用EXCEL比較適合大部分醫(yī)療從業(yè)者。
CSV格式:(代碼如下)
import pandas as pd
import csv
with open('A.csv','r') as csvfile:
reader = csv.DictReader(csvfile)
column = [row['Age'] for row in reader]
Execl格式:(代碼如下)
import numpy as npimport pandas as pdplt.rc('font',family='Times New Roman')a = 'C:/Users/46685/Desktop/科研數(shù)據(jù)//腎內(nèi)科/DKD數(shù)據(jù)庫給韜哥5.xlsx'dataset= pd.read_excel(a,sheet_name = 'Sheet1')dataset.head() #顯示前幾排數(shù)據(jù)x=dataset.iloc[:,0:49] # iloc 定位到列y=dataset.iloc[:,49]print(x)print(y)
2.2數(shù)據(jù)結(jié)構(gòu):
數(shù)組(Array)是由相同類型的元素(element)集合組成的固定長度(Size)的一種數(shù)據(jù)結(jié)構(gòu)。
2.3 數(shù)據(jù)處理:
這里用了泰坦尼克號的數(shù)據(jù)案例:
train = pd.read_csv("data/Titanic處理后數(shù)據(jù).csv")
# 將字符串類型的分類變量進行重新編碼
label = LabelEncoder()
train["Name"] = label.fit_transform(train["Name"])
train["Embarked"] = label.fit_transform(train["Embarked"])
train["Sex"] = label.fit_transform(train["Sex"])
Python的符號格式有三種:字符串、整數(shù)、浮點數(shù),那么,像臨床常用的基線數(shù)據(jù),“姓名”“性別”就需要轉(zhuǎn)換為Python可識別的數(shù)據(jù)。以上代碼就是轉(zhuǎn)換用。
3、模型構(gòu)建:
# 確定目標(biāo)變量和自變量,目標(biāo)變量:我們要研究的目標(biāo)。例如,我如果想研究息肉切除后出現(xiàn)風(fēng)險,就可以定義為:
Target= [“bleed”]
# 定義模型的自變量名
train_x = ["Pclass", "Name", "Sex", "Age", "SibSp", "Parch","Fare","Embarked"]
也可以表述為自己提取對應(yīng)的數(shù)據(jù):
x=dataset.iloc[:,0:17]y=dataset.iloc[:,17]print(x)print(y)
使用feature_selector進行,feature篩選。累積權(quán)重不同,可以影響最后結(jié)果輸出的效果。
##將訓(xùn)練集切分為訓(xùn)練集和驗證集
from sklearn.model_selection import train_test_split #導(dǎo)入樣本劃分的庫x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.2,random_state=0) # 樣本進行劃分
機器學(xué)習(xí)的數(shù)據(jù)要分為兩個部分:訓(xùn)練集、驗證集。這句代碼就是把數(shù)據(jù)進行分割。不過,一般都是2:8分。20%用來驗證。
下面的程序中使用RandomForestClassifier()函數(shù)建立了包含100個決策樹,最大深度為5的隨機森林模型,針對訓(xùn)練好的模型并計算出其它訓(xùn)練集和驗證集上的預(yù)測精度。
## 使用隨機森林對泰坦尼克數(shù)據(jù)進行分類
rfc1 = RandomForestClassifier(n_estimators = 100, # 樹的數(shù)量
max_depth= 5, # 子樹最大深度
oob_score=True,
class_weight = "balanced",
random_state=1)
rfc1.fit(X_train,y_train)
4、結(jié)果輸出:
## 輸出其在訓(xùn)練數(shù)據(jù)和驗證數(shù)據(jù)集上的預(yù)測精度
rfc1_lab = rfc1.predict(X_train)
rfc1_pre = rfc1.predict(X_val)
print("隨機森林的OOB score:",rfc1.oob_score_)
print("訓(xùn)練數(shù)據(jù)集上的精度:",accuracy_score(y_train,rfc1_lab))
print("驗證數(shù)據(jù)集上的精度:",accuracy_score(y_val,rfc1_pre))
但是,為了讓論文更好發(fā)表,最好有圖片。
## 可視化在驗證集上的Roc曲線
pre_y = rfc1.predict_proba(X_val)[:, 1]
fpr_Nb, tpr_Nb, _ = roc_curve(y_val, pre_y)
aucval = auc(fpr_Nb, tpr_Nb) # 計算auc的取值
plt.figure(figsize=(10,8))
plt.plot([0, 1], [0, 1], 'k–')
plt.plot(fpr_Nb, tpr_Nb,"r",linewidth = 3)
plt.grid()
plt.xlabel("假正率")
plt.ylabel("真正率")
plt.xlim(0, 1)
plt.ylim(0, 1)
plt.title("隨機森林ROC曲線")
plt.text(0.15,0.9,"AUC = " str(round(aucval,4)))
plt.show()
最后得出這么一個ROC結(jié)果。
三、常用python算法庫:
1)Scikitlearn:是一個常用的算法庫:相關(guān)代碼可參考:
https://mp.weixin.qq.com/s/c-Sl7n_ceawz6AHm5Mtw0w
2)機器學(xué)習(xí)常用算法:
eXtreme Gradient Boosting (XGBoost),
Adaptive Boosting(AdaBoost),
Decision Tree (DT),
Support vector machines (SVM),
Random Forest (RF)
Gradient Boosting Decision Tree (GBDT)
LogisticRegression(LR)
四、未完待續(xù):
除了預(yù)測類的機器學(xué)習(xí),還有結(jié)合深度學(xué)習(xí)的影像組學(xué),難度更高,但真實世界中的應(yīng)用場景更多,更有利于轉(zhuǎn)化,可以參考:
https://www.madao33.com/post/7/
該教程文檔不斷更新,版本號越高,就是最新版,上面很多代碼在運行中還有很多bug,希望更多同行進行交流,互相提供代碼和教程,目前跟朋友一起合作了一篇文章,相關(guān)代碼分享在ganbingliangyi (taoliang梁韜) (github.com)
版權(quán)聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶自發(fā)貢獻,該文觀點僅代表作者本人。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如發(fā)現(xiàn)本站有涉嫌抄襲侵權(quán)/違法違規(guī)的內(nèi)容, 請發(fā)送郵件至 舉報,一經(jīng)查實,本站將立刻刪除。