医学数据挖掘学习项目:他克莫司
目錄
1. 報告
2. 代碼1:從數據庫中提取數據
lambda,匿名函數,快速定義單行函數,可以用在任何需要函數的地方。
numpy.array 和 python.array
python.filter(function, iterable)函數
python zip(a, b)
pandas創建DataFrame()數據
pandas判斷是否是空值NaN,isnull(),notnull()
pandas.reset_index()
pandas.astype()
pandas.Excel_Writer()輸出到excel
mysql
pandas.concat()函數
pandas merge()方法
pandas.concat() 和 pandas.merge()區別
pandas rename()方法
pandas.DataFrame.columns
pandas.loc[行,列]?
pandas.iloc[行號,列號]
pandas.drop()函數
pandas.drop_duplicates()方法
pandas.isnull() 和 .notnull()
pandas.DataFrame.replace(to_place, value)
pandas數據透視表pivot_table(data,values,index,columns,aggfunc='mean')
pandas DataFrame.sort_values()方法
pandas.groupby()方法
pandas statsmodels
pandas DataFrame.describe()
pandas.get_dummies
3. 代碼2:初始方案數據清洗
pydotplus
pylab
Ipython.display.image
time.time()
datetime.datetime.strptime(x, %Y-%m-%d %H:%M:%S)
datetime.timedelta(days=2)
TDM
bug
python list(range(9))
4. 代碼3:調整方案數據清洗
5. 代碼4:初始&調整方案建模
sklearn.model_selection
sklearn.metrics
sklearn.train_test_split
sklearn分類器classifier和回歸其regressor的區別
sklearn選擇合適的算法/sklearn中各種分類器regressor都適用于什么樣的數據
python auto_ml
誤差(error),偏差(bias),方差(variance)有什么區別和聯系?
scipy.stats
Mann-Whitney U 檢驗
卡方檢驗,檢驗兩個變量之間有沒有關系
重要性評分柱狀圖
SHAP圖
matplotlib
from matplotlib import pyplot as plt
python seaborn
SPSS傾向性分析
logistic回歸
牛頓迭代法(Newton-Raphson)
1. 報告
know what, know how。知道是干什么的,怎么干的
目的:他克莫司用藥日劑量
XGBoost, GBDT, Boosting, boosting,誤分類樣本的權值之和影響誤差率,誤差率影響分類器在最終分類器中的權重。
基分類器,h1的權重,誤差越大,權重越小
分類器:
樣本權重更新:
XGBoost輸出變量重要性 -->xgb.importance返回由f分數測量的特征重要范圍
stepwise regression逐步回歸
propensity score傾向性評分 <--由于實驗組和對照組兩組病人的基線水平存在差異,傾向性評分匹配法消除數據集中的混雜因素。
==>兩獨立樣本t檢驗:方差齊性檢驗,p,0.05;t檢驗/修正t檢驗
比較特征的差異顯著性:連續特征,Mann-Whitney U檢驗;離散特征,卡方檢驗。
2. 代碼1:從數據庫中提取數據
(1) database:surgical_record
.ipynb文件為Jupyter notebook,是一個python交互式筆記本,包含代碼、運行結果展示、其他內部設置
data: surgical_record['surgery_NAME'].str.contains('腎’)
- .pandas.str.contains()篩選出包含特殊字符的數列,返回布爾值系列或索引
- .numpy.unique()函數,去除列表或數組中重復的元素,并按元素從小到大返回一個新的無重復元素的新列表或元組。
- .shape輸出DataFrame行列數。shape[0] 行;shape[1] 列
lambda,匿名函數,快速定義單行函數,可以用在任何需要函數的地方。
lambda 參數 :操作(參數)
- apply(),對數據框(DataFrame)(類似矩陣)的數據進行按行或按列操作時用apply(),默認axis=0,按行;axis=1,按列
- map(),對series的每一個數據進行操作時用map()
np.nan,創建空值
numpy.array 和 python.array
numpy.array,生成一個數組,他的強大在于可以生成多維數據,而python.array只支持以為數組。
python.filter(function, iterable)函數
- function -- 判斷函數
- iterable -- 可迭代對象/序列
python zip(a, b)
將對應的元素打包成一個個元組,然后返回由這些元組組成的列表
pandas創建DataFrame()數據
本質是通過list列表創建
- 方法1: 通過列表創建
li = [
? ? [1, 2, 3, 4],
? ? [2, 3, 4, 5]
]
# DataFRame對象里面包含兩個索引, 行索引(0軸, axis=0), 列索引(1軸, axis=1)
d1 = pd.DataFrame(data=li, index=['A', 'B'], columns=['views', 'loves', 'comments', 'tranfers'])
print(d1)
- 方法2: 通過numpy對象創建
narr = np.arange(8).reshape(2, 4)
# DataFRame對象里面包含兩個索引, 行索引(0軸, axis=0), 列索引(1軸, axis=1)
d2 = pd.DataFrame(data=narr, index=['A', 'B'], columns=['views', 'loves', 'comments', 'tranfers'])
print(d2)
- 方法3: 通過字典的方式創建;
dict = {
? ? 'views': [1, 2, ],
? ? 'loves': [2, 3, ],
? ? 'comments': [3, 4, ]
}
d3 = pd.DataFrame(data=dict, index=['粉條', "粉絲"])
print(d3)
- DataFrame提取某幾列數據
list = ['text', 'image', 'voice']
df_p = df[[list]]
pandas判斷是否是空值NaN,isnull(),notnull()
pd.DataFrame([('bird',389), ('bird',24), ('mammal',80), ('mammal', np.nan)], index(行)=['falcon','parrot','lion','monkey'], columns=('class', 'max_speed')?)
| class | max_speed | |
| falcon | bird | 389 |
| parrot | bird | 24 |
| lion | manmmal | 80.5 |
| monkeyh | manmmal | NaN |
pandas.reset_index()
把就索引列添加為列,并使用心得順序索引。drop參數=True,避免將舊索引添加為列,默認為False
- pandas.set_index,把數據列設為索引列
pandas.astype()
因為多個表合并到一個表,輸出列Excel表發生數據錯誤,e.g.數值型數據末尾變0,所以python強制類型轉換。
df.astype('數據類型')
df['列名'].astype('數據類型')? --一列數據類型改變
pandas.Excel_Writer()輸出到excel
writer=pd.ExcelWriter(project_path + '/data/data_from_mysql/df_檢驗序號索引.xlsx') test_record_tcms.to_excel(writer) writer.save()(2) 用藥醫囑表單
mysql
# 連接mysql數據庫 conn = MySQLDB.connect(host='localhost', port=3306, user='root', password='123456', db='mdnov_ciip_ipharma_zdy', charset='UTF8') cursor = conn.cursor() cursor.execute("Select version()") for i in cursor:print(i)try:sql = 'select TEST_RECORD_ID,PROJECT_CODE,PROJECT_NAME,TEST_RESULT,RESULT_UNIT,IS_NORMAL,REFER_SCOPE from test_result;'test_result = pd.read_sql(sql, conn) except MySQLDB.err.ProgrammingError as e:print('test_result Error is ' + str(e))sys.exit()where子句,有條件的從表中選取數據
pandas DataFrame.head(),返回數據幀或序列的前n行(默認值為5)
pandas.concat()函數
用來連接DataFrame對象,行列相同或行列不同,缺失部分為NaN
pandas merge()方法
left,拼接的左側DataFrame對象。
right,拼接的右側DataFrame對象。
on,要加入的列或索引級別名稱
how,inner,交集;outer,并集;left只用左側;right只用右側keys
pandas.concat() 和 pandas.merge()區別
concat() 是上下拼接;merge()是左右合并
pandas rename()方法
修改DataFrame的個別列名或索引,e.g. df.rename({'表1':'緯度'})
pandas.DataFrame.columns
返回列標簽
(3) 檢驗表單
pandas.loc[行,列]?
e.g. temp.loc[0:2,'Drug_Name'],loc表示location,.loc[['Drug_Name', 'Project_Name']]
pandas.iloc[行號,列號]
e.g. [0:3, [4:6]],第3行取不到,第6列能取到
pandas.drop()函數
DataFrame刪除一行或一列。默認axis=0,行;axis=1,列
pandas.drop_duplicates()方法
.drop_duplicates(subset='列名',keep='first',inplace='True'),刪除DataFrame某列中重復項的函數
- subset='列名1' 或 ['列名1','列名2']
- keep='first' 或 'last',保留第一個或最后一個
pandas.isnull() 和 .notnull()
判斷缺失值一般采用isnull()和notnull()。
.isnull().sum(),每列缺失值的數量
(4) 檢驗結果表單
pandas.DataFrame.replace(to_place, value)
將to_replace數值/字符串替換為value
pandas數據透視表pivot_table(data,values,index,columns,aggfunc='mean')
- values,可以對需要的計算數據進行篩選
- 每個pivot_table必須擁有一個index, index=['對手'],行
- columns,類似index可以設置列層次字段,它不是必要參數,作為一種分割數據的可選方式
- aggfunc,可以設置我們對數據聚合時進行的函數操作
pandas DataFrame.sort_values()方法
.sort_values(by='##', axis=0, ascending=True, inplace=Flase),根據指定列數據排序
- by,指定列名(axis=0,行) 或 索引名(axis=1,列)
- ascending, 默認True,升序
- inplace,默認False,排序后數據不替換原來的數據
(5) 診斷表單
pandas.groupby()方法
.groupby(by=['列名'], axis=0, as_index)
- as_index按某一列分組,相同字段分到同一組。將分組列名作為輸出索引
- mean()方法求平均值
pandas statsmodels
傳統頻率學派統計方法
- statsmodels.api:模型和方法
- statsmodels.tsa.api:統計和測試
- statsmodels.formula.api:模型,從公式和數據框創建模型
pandas DataFrame.describe()
用于查看一些基本的統計信息,e.g. 百分位數,均值,標準差
pandas.get_dummies
pandas從DataFrame數據實現one hot encode的方式。
3. 代碼2:初始方案數據清洗
pydotplus
pydotplus -->繪圖,比Graphviz支持中文
pylab
pylab是matplotlib的一個子包,適合交互式繪圖
pylab.mpl -->rcParams解決matplotlib無法顯示中文或負號的情況
# 支持顯示中文 mpl.rcParams['font.sans-serif'] = ['SimHei'] ##繪圖顯示中文 mpl.rcParams['axes.unicode_minus'] = FalseIpython.display.image
顯示圖像,Ipython是一個python的交互式shell,比python shell好用。利用python進行科學計算和交互可視化的一個最佳平臺
- 強大的python交互式shell
- 共Jupyter notebooks使用的一個Jupyter內核(Ipython notebook)
time.time()
獲取當前時間
datetime.datetime.strptime(x, %Y-%m-%d %H:%M:%S)
將數據轉換為日期的方法
datetime.timedelta(days=2)
對象代表兩個時間之間的時間差,兩個date或datetime對象相減可以返回一個timedelta對象。
TDM
治療藥物監測,測定藥物濃度,therapeutic drug monitoring
bug
python list(range(9))
可以把range()返回的可迭代對象轉化為一個列表
(2) 篩選初始方案中tdm符合終點事件的用藥和tdm檢測組合
(3) 篩選調整方案中tdm符合終點事件的用藥和tdm檢測組合
(4) 初始方案所有變量數據清洗
- BMI:身體質量指數
- DataFrame取多列數據用[]把多個列名括起來,[['drug_name', 'project_name']]
(5) 其他用藥
start_time <= TDM
end_time >= tcms_3 days前
4. 代碼3:調整方案數據清洗
Graphviz -->開源的強大繪圖工具,編寫dot腳本
%matplotlib inline -->用再Jupyter notebook中具體作用是當你調用matplotlib.pyplot的繪圖函數plot()進行繪圖時,或者生成一個figure畫布的時候,可以直接在你的python console里面生成圖像。
5. 代碼4:初始&調整方案建模
sklearn.model_selection
.model_selection,主要是對數據的分割,以及與數據分割相關的功能
train_test_split方法,將原始數據集劃分成train和test兩部分
sklearn.metrics
- accuracy_score -->所有分類正確的百分比,
- .log_log,對數損失或交叉熵損失
- confusion_matrix --> 混淆矩陣
| predictual class | ||
| Actual class | ||
- 計算R方。from sklearn.metrics import r2_score
R2的定義如下:![Alt]在這里插入圖片描述從公式來看,即使我們不使用任何模型,僅僅用目標集標簽的平均值,就能讓R2_score為0,如果值為負數,則表示我們預測的結果還不如測試集中的y_label的平均值準確
?
sklearn.train_test_split
用來隨機劃分樣本數據為訓練集和測試集
train_x, test_x, train_y, test_y = train_test_split(train_data,train_target,test_size=0.2,random_state=5)- train_data,待劃分樣本數據
- train_target,待劃分樣本數據結果標簽
- test_size:測試集占比
- random_state:設置隨機數種子。若為0或不填,則每次得到的數據都不同。隨機數種子用于生成偽隨機數,真隨機數是指現實物理現象。
sklearn分類器classifier和回歸其regressor的區別
標簽數據labeled data
- classification:which category,識別物體屬于哪一類。Identifying which category an object belongs to。應用:垃圾郵件檢測,圖像識別等。score函數計算的是精確度,accuracy_score --> mean accuracy
- regression:quantity,預測與物體相關的連續值屬性。Predicting a continuous-valued attribute associated with an object.應用:藥物反應、股票價格。score函數計算的是,r2_score -->預測的r2決定系數
- clustering: Automatic grouping of similar objects into sets.應用:用戶細分,分組實驗結果。
- Dimensionality relation:降維,reducing the number of random variables to consider。應用:可視化,提高效率
- Model selection: comparing, validating and choosing parameters and models. 應用:通過參數調整提高精度
- Processing:Feature extraction and normalization.應用:轉換輸入數據,例如用于機器學習算法的文本
sklearn選擇合適的算法/sklearn中各種分類器regressor都適用于什么樣的數據
選擇合適的ML Algorithms。不存在一個再各方面都最好的模型/算法,需要針對具體問題,找到最好的機器學習算法
python auto_ml
用于生產和分析的自動化機器學習模塊,包括:分析、特征工程、自動縮放、特征選擇、模型選擇、超參優化、大數據
from auto_ml import Predictor from auto_ml.utils import get_boston_dataset from auto_ml.utils_models import load_ml_modelfrom auto_ml import Predictor
1) 首先創建Predictor預測期
? ? Predictor(type_of_estimator=, column_descriptions=)
? ? ·type_of_estimator,指定預測器類型(classifier or regressor)
? ? ·column_descriptions,字典類型,指定字段描述信息,如果為分類任務,需要制定Y所在的列(output)
2) ml_predictor.train(train_data, model_names=['XGBoost'])
? 2.1) auto_ml集成了DeepLearningClassifier, DeepLearningRegressor, XGBClassifier, XGBRegressor, LGBMClassifier, LGBMRegressor, CatBoostClassifier, CatBoostRegressor,在model_names參數中選擇。
? 2.2) auto_ml中的feature_learning=Ture,用深度學習為我們學習特征,梯度提升將這些特征轉化為準確的預測 ==> 這種混合方法比任何一種方法都要精確5%,但要防止過擬合。
3) ml_predictor.score(test_x, test_x['日劑量']) 。
# Score the model on test data
Returns the coefficient of determination R^2 of the prediction. 不是計算準確度R^2,r2計算在from sklearn.metrics import r2_score
4) 保存。file_name = ml_predictor.save()
5) 導入訓練好的model。trained_model = load_ml_model(file_name)
6) 預測。predictions = trained_model.predict(test_x)?
報錯:
RuntimeError:
????????An attempt has been made to start a new process before the
????????current process has finished its bootstrapping phase.
??
????????This probably means that you are not using fork to start your
????????child processes and you have forgotten to use the proper idiom
????????in the main module:
解決:設置一個main()函數,控制多線程。
參考:Python多進程報錯:RuntimeError: An attempt has been made to start a new process before the current process...
誤差(error),偏差(bias),方差(variance)有什么區別和聯系?
error=bias + variance,反映的是整個模型的準確度。
- bias,偏差。描述的是樣本擬合出的model的輸出預測結果的期望與樣本真實結果的差距。簡單講,就是樣本你和的好不好。(training set) 要想在bias上表現好,low bias,就得復雜化模型,增加模型的參數,但這樣容易過擬合(overfitting),過擬合容易使正確的數據錯分,造成方差過大high variance,點很分散。
- variance,方差。描述的是樣本上訓練出來的模型在測試集上的表現,要想在variance上表現好,low variance,就要簡化模型,減少模型的參數,但這樣容易欠擬合(unfitting),欠擬合對應上面的high bias,錯誤的數據被誤認為正確,點偏離中心。
- bias可以理解為偏見,對數據是否一視同仁,高偏見high bias,準確但分散。high bias+low variance --> model太簡陋,準確度低;low bias + high variance --> model普適性差
- 在訓練集上,可以進行交叉驗證(cross-validation)。一種方法叫k-fold cross validation(k-折交叉驗證);初始樣本分割成k個子樣本,一個單獨的子樣本被保留作為驗證模型的數據,其他k-1個樣本用來訓練。交叉驗證重復k次,每個子樣本驗證一次,平均k次的結果或使用其他結合方式,最終得到一個單一估測 ==> 降低異常數據對模型的影響。k大時,偏差越小,方差越大;k小時,偏差越大,方差越小。
scipy.stats
python統計函數率,該模塊包含大量概率分布、匯總和頻率統計,相關函數和統計檢驗、屏蔽統計,核密度估計、Monte Carlo等。e.g. Mann-Whitney U test, Wilcoxon signed rank test, Chi-square test.
Mann-Whitney U 檢驗
是檢驗兩個獨立樣本差異性的測試(在數據分布上是否有差異)。當樣本正態分布、方差齊次等不能達到t檢驗的要求時,可以用Mann-Whitney U test。
檢驗基礎:若兩個樣本有差異,則他們中心位置不同。
e.g. 春夏季犯罪數據是否有差異。原假設:無,顯著性差異P值 < 0.05,顯著 ==> 有差異。
return: statistic: float = min(U for x, U for y); P值: float
卡方檢驗,檢驗兩個變量之間有沒有關系
from scipy.stats import chi2_contingency
卡方檢驗要求X、Y都是定類數據
自由度 = (行數-1) * (列數-1) ==>查詢得到臨界值 ==> 卡方< 臨界值,成立
scipy.stats.chi2_contingency(observed), observed, array_like, R*C table, 默認Pearson's 卡方統計
Return ==> chi2: float; p: float; dof: 自由度; expected: 預期頻率
· 用log-likelihood ratio --> chi2——contingency(obs, lambda_ = 'log-likelihood')
重要性評分柱狀圖
重要性評分~參考:Python中XGBoost的特性重要性和特性選擇_liuzh的博客-CSDN博客
1) 注意數據類型!!!
? ? ? ? .colums()函數返回index object;importance返回np.ndarray;pd.DataFrame主要是根據list列表數據生成。
2) ValueError: shape of passed value is (3,1), indices imply (3,3)
? ? ? ? np.array().reshape(3,4)
3) plt.bar不顯示中文
from pylab import mpl mpl.rcParams['font.sans-serif'] = ['SimHei'] ##繪圖顯示中文 mpl.rcParams['axes.unicode_minus'] = Falsefrom matplotlib import pyplot as plt import matplotlib.ticker as ticker from matplotlib import rcrc('mathtext', default='regular')SHAP圖
參考:SHAP:Python的可解釋機器學習庫 - 孫佳偉的文章 - 知乎
SHAP圖的基礎是shap values(歸因值)和shape interaction values(交互歸因值),基于此二值可以生成:
- force plot。單個樣本預測的解釋
- summary plot。全部樣本預測的解釋
- dependency plot。特征值大小與預測影響之間的關系。
matplotlib
-
.pyplot:繪圖模塊,讓用戶繪制2D圖表。
-
.ticker:用于配置刻度定位和格式的類。其中Locater類根據數據限制和刻度位置的選擇處理視圖限制的自動縮放
-
.rc:設置當前的rcParams,e.g. linewidth,color
-
axes.Axes.get_figure(),獲取fiture實例。
from matplotlib import pyplot as plt
- plt.plot(x,y,[fmt],**kwargs),點或線的x, y坐標,[fmt]包含顏色color,標記marker,linestyle等可迭代參數。label=' ' 是**kwargs中可用的其他參數
- plt.legend(loc, bbox_to_anchor=(1.1,1)),顯示圖例
- plt.xlabel 和 plt.ylabel,設置坐標軸標簽
- plt.savefig() 保存圖例,需要想創建好保存路徑,savefig只能保存不能創建。dpi分辨率
- plt.figure(figsize=(15, 8)),設置fiture的寬和高
- plt.sticks,設置x坐標軸的刻度及標簽。rotation=75 --> 標簽旋轉;tick,刻度
- plt.text(a, b+2, ha=, va=, fontsize= ) ,將文本添加到x,y的坐標軸上。hahorizontalalignment的縮寫,設置水平對齊方式;va是vertical縮寫,設置垂直對齊方式。
- plt.show() 畫圖。調用pyplot.show()后保存圖形會導致文件為空
-
matplotlib畫圖的時候怎么清空之前圖片。
python seaborn
實在matplotlib基礎上面的封裝,方便直接傳參調用。
- seaborn.boxplot(x,y, hu, data=df_box, color=()) 繪制箱線圖
SPSS傾向性分析
匹配估計的思想:if你要研究企業R&D投入對performance的影響。有兩家企業,其R&D投入明顯不同,但是其他各方面都高度相同,e.g. 公司規模、杠桿率、所屬行業、公司治理結構等,那么在其他各方面都高度相同的情況下,這是就可以吧公司performance的差異鬼影刀R&D投入的差異。
這種找到一個控制組(實驗)的個體,使得該個體與處理組(對照)的個體在除自變量外其他各因素都相似(也就是匹配),在通過自變量的差異解釋因變量差異的行為,就是匹配的思想。
一般來說,每個樣本有多個屬性,e.g.一家公司,屬性有公司規模、公司年齡、杠桿率、增長率、市場占有率、行業等,這就意味著匹配時要考慮諸多屬性,也就是進行高維度匹配,一個比較好的思路是定義高維空間的距離,然后計算兩個樣本在高維空間的距離。
但高維匹配并不容易,因為維度越高找一個各方面相似的兩個個體越難。
引入--> 傾向性評分匹配(Propensity score matching, PSM),定義一個個體進入處理組的概率。
PSM是指,某個體在處理組,找一個其他各方面與該個體盡量相似的控制組個體的概率。
PSM匹配的是自變量之外(R&D)的需要控制的其他所有協變量X。根據PS分值,SPSS篩選出匹配成功的match_id對(可根據實際情況選擇合適的ps限定,增加匹配成功數)
PSM:如果自變量是連續變量,需要轉換為二元離散變量。
協變量:指與因變量有線性相關,并在探討自變量與因變量關系時通過統計計數加以控制的變量。(除自變量與因變量外,其他需要控制的變量)
傾向得分匹配(PSM)的原理與步驟 - CanisMajoris的文章 - 知乎?
logistic回歸
logistic回歸為概率型非線性回歸模型,是研究二分類觀察結果y與一些影響因素(x1,x2,....,xn)之間關系的一種多變量分析方法。通常問題是,研究某些因素條件下某個結果是否發生,比如醫學中根據病人的一些癥狀來判斷它是否含有某種病。
在講解logistic回歸理論之前,先從LR分類器說起,logistic refression classifier。在分類情形下,經過學習后的LR分類器是一組權值w0,w1,.....,wn
x=wo+w1x1+.......+wnxn,xi為n個特征
之后按sigmoid函數的形式求出
因此,最基本的LR分類器適合二分類。
logistic回歸最關鍵的問題是研究如何求得w0, w1, .....wn這組權值 <=用極大似然估計來做。
logistic函數:,g(x) = w0+w1x1+......+wnxn
射條件概率P(y=1|x) =p為根據觀測量相對于某事件y發生的概率。
牛頓迭代法(Newton-Raphson)
?作用:用迭代的方法來求解函數方程的根。簡單來說,就是不斷求取切線的過程。
關鍵:構建迭代式。
- 根據泰勒展開近似:?==>?
- f(x)=0的近似根
- 迭代式:? ==>若序列收斂于a,a就是非線性方程根。
總結
以上是生活随笔為你收集整理的医学数据挖掘学习项目:他克莫司的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python programming t
- 下一篇: 医学数据挖掘工作项目(一):南方医院他克