摘要:一引言本項目基于邏輯回歸理論,運用語言對數據集進行分析,實現對糖尿病視網膜病變的檢測。可以確定這五個變量是導致糖尿病視網膜病變的主要因素。
一. 引言
本項目基于邏輯回歸理論,運用Python語言對數據集messidor_features.arff進行分析,實現對糖尿病視網膜病變的檢測。糖尿病視網膜病變(DR)是糖尿病最常見的微血管并發癥之一,是慢性進行性糖尿病導致的視網膜微血管滲漏和阻塞從而引起一系列的眼底病變,如微血管瘤、硬性滲出、黃班水腫甚至視網膜脫離。DR檢測對于糖尿病人群篩查、糖尿病患者早期治療具有重要意義。
二. 數據集描述
1. 下載地址messidor_features.arff
2. 數據集開頭有一些描述信息,訓練是用不到的,我選擇刪掉,方便用pd.read_csv()函數讀取。
當然不刪也是可以的,有專門的函數讀取.arff文件
from scipy.io import arffimport pandas as pddf = arff.loadarff("messidor_features.arff") #讀取出來是一個元組dataframe = pd.DataFrame(df[0]) 3.數據集messidor_features.arff包含從 Messidor 圖像集中提取的特征,用于預測圖像是否包含糖尿病視網膜病變的跡象。所有特征都代表檢測到的病變、解剖部位的描述特征或圖像級描述符。該數據集有20條屬性,類標簽是最后一條,如圖。
4. 對數據集有大概了解后,來簡單探索性分析一下它。首先查看data.info(),看看有沒有缺失值及數據類型。
import pandas as pdpath="E:/Python_file/zuoye/messidor_features.arff"Cnames = ["x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "y"]#刪掉與數據集無關的內容data=pd.read_csv(path,header=None,names=Cnames)print("數據集基礎信息:")print(data.info()) 可以看到數據里沒有缺失值。再統計一下,類標簽為‘1’的數據有611條,占比為53.1%;標簽為‘0’的數據有540條,占比為46.9%。說明正例數據與負例數據的數量分布是均衡的。
5. 這里推薦使用pandas-profiling庫,可以一鍵生成對數據集的分析報告,非常好用。沒有安裝的話用pip install pandas_profiling 命令安裝一下。
import pandas_profilingreport= pandas_profiling.ProfileReport(data)report.to_file("output_file.html") 運行后生成一個可交互的.html文件,通常包含對數據的類型檢測;計算唯一值、缺失值;分位數統計如最小最大值、四分位數、中位數等;描述統計如平均數、眾數、峰度偏度等;變量間相關系數的熱力圖,等等。
我們來看看該數據集下各屬性間用Spearman秩相關系數(ρ)描述的單調相關的度量熱力圖,ρ的值介于-1和+1之間,-1表示完全負單調相關,0表示沒有單調相關,1表示完全正單調相關。
三. 方法介紹
邏輯回歸的原理有很多博主寫的很好,我就不班門弄斧了,主要說說代碼。利用sklearn庫提供的LogisticRegression()可以很方便的完成訓練和預測。
from sklearn.linear_model import LogisticRegressionfrom sklearn.model_selection import train_test_splitX=data[data.columns[0:19]] #提取特征,不要標簽y=data["y"] #train_size=0.8,80%的訓練集占比x_train,x_test,y_train,y_test=train_test_split(X,y,train_size=0.8,random_state=90)lr=LogisticRegression(max_iter=3000)clm=lr.fit(x_train,y_train)print("對測試集的預測結果:")#輸出預測結果、預測結果的結構類型及尺寸result=clm.predict(x_test) LogisticRegression()的參數很多,但需要設置的不多。我們的數據集是分布均衡的,參數類別權重class_weight不需要設置;關于參數優化算法solver用默認的‘liblinear’就好,因為這是二分類問題(只看有沒有病變),而且我們是小數據集,也用不到面向大數據集的‘sag’和‘saga’;而max_iter是設置迭代次數,如果小了,可能模型沒收斂就運行結束了,這里我設置為3000次。
四. 結果和模型評價及可視化
1.測試集的檢測結果如圖,1代表有病變,0代表沒有。要注意的是劃分訓練集和測試集時,random_state等于不同的值,會得到不同的測試集,我這里是random_state=90,改成其他數,預測結果就和我不同,但對模型評價沒有影響。
2. 模型評價的指標有很多,比如召回率、精度、準確率、F統計量、決定系數R2、ROC曲線的包絡面積AUC等。可以用classification_report()一鍵生成評估報告。
from sklearn.metrics import classification_reportprint("性能報告;")print(classification_report(y_test,result))confusion = metrics.confusion_matrix(y_test, result)
3. 以FPR為橫軸,TPR為縱軸,繪制ROC曲線,并由曲線計算得AUC=0.77。
from sklearn.metrics import roc_curve,aucfrom matplotlib import pyplot as pltfpr, tpr, thr = roc_curve(y_test, result, drop_intermediate=False)fpr, tpr = [0] + list(fpr), [0] + list(tpr)plt.plot(fpr, tpr)plt.title("ROC curve for diabetes classifier")plt.xlabel("False Positive Rate (1 - Specificity)")plt.ylabel("True Positive Rate (Sensitivity)")plt.grid(True)plt.show()print("AUC:"+ str(auc(fpr,tpr)))
該模型的檢測能力還是可以的。
4. 從邏輯回歸模型中導出各個變量的回歸系數,由此作出重要程度的條形圖。
print("邏輯回歸各變量系數:")print(clm.coef_)coef_lr = pd.DataFrame({"var" : x_test.columns, "coef" : clm.coef_.flatten() })index_sort = np.abs(coef_lr["coef"]).sort_values().indexcoef_lr_sort = coef_lr.loc[index_sort,:]# 水平柱形圖繪圖fig,ax=plt.subplots()x, y = coef_lr_sort["var"], coef_lr_sort["coef"]rects = plt.barh(x, y, color="dodgerblue")plt.grid(linestyle="-.", axis="y", alpha=0.4)plt.tight_layout()#添加數據標簽for rect in rects: w = rect.get_width() ax.text(w, rect.get_y()+rect.get_height()/2,"%.2f" %w,ha="left",va="center")
邏輯回歸就是把線性回歸的結果輸入到了sigmoid函數,所以各變量的系數還是有的。
可以看到對視網膜病變檢測結果影響最大的五個變量分別是x14,x1,x2,x0,x15,它們的含義參照上文。可以確定這五個變量是導致糖尿病視網膜病變的主要因素。
五. 完整代碼
import pandas as pdfrom sklearn.linear_model import LogisticRegressionfrom sklearn.model_selection import train_test_splitfrom sklearn.metrics import accuracy_score, precision_score, recall_score, f1_scorefrom sklearn.metrics import classification_reportfrom sklearn import metricsfrom sklearn.metrics import roc_curve,aucfrom matplotlib import pyplot as pltimport numpy as nppath="/content/drive/MyDrive/messidor_features.arff"Cnames = ["x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "y"]#首先刪掉與數據集無關的內容data=pd.read_csv(path,header=None,names=Cnames)X=data[data.columns[0:19]] y=data["y"]x_train,x_test,y_train,y_test=train_test_split(X,y,train_size=0.8,random_state=90)lr=LogisticRegression(max_iter=3000)clm=lr.fit(x_train,y_train)print("對測試集的預測結果:")#輸出預測結果、預測結果的結構類型及尺寸result=clm.predict(x_test)print(result,type(result),result.shape) print("模型評分:"+ str(clm.score(x_test,y_test))) #用決定系數來打分print("性能報告;")print(classification_report(y_test,result))confusion = metrics.confusion_matrix(y_test, result)print("混淆矩陣:")print(confusion)TP = confusion[1, 1]TN = confusion[0, 0]FP = confusion[0, 1]FN = confusion[1, 0]print("TPR(正確識別的正例數據在實際正例數據中的占比):"+str(TP/(TP + FN)))print("TNR(正確識別的負例數據在實際負例數據中的占比):"+str(TN/(TN + FP)))print("Accuracy score: ", format(accuracy_score(y_test, result)))print("Precision score: ", format(precision_score(y_test, result)))print("Recall score: ", format(recall_score(y_test, result)))print("F1 score: ", format(f1_score(y_test, result)))fpr, tpr, thr = roc_curve(y_test, result, drop_intermediate=False)fpr, tpr = [0] + list(fpr), [0] + list(tpr)plt.plot(fpr, tpr)plt.title("ROC curve for diabetes classifier")plt.xlabel("False Positive Rate (1 - Specificity)")plt.ylabel("True Positive Rate (Sensitivity)")plt.grid(True)plt.show()print("AUC:"+ str(auc(fpr,tpr)))print("邏輯回歸各變量系數:")print(clm.coef_)coef_lr = pd.DataFrame({"var" : x_test.columns, "coef" : clm.coef_.flatten() })index_sort = np.abs(coef_lr["coef"]).sort_values().indexcoef_lr_sort = coef_lr.loc[index_sort,:]# 水平柱形圖繪圖fig,ax=plt.subplots()x, y = coef_lr_sort["var"], coef_lr_sort["coef"]rects = plt.barh(x, y, color="dodgerblue")plt.grid(linestyle="-.", axis="y", alpha=0.4)plt.tight_layout()#添加數據標簽for rect in rects: w = rect.get_width() ax.text(w, rect.get_y()+rect.get_height()/2,"%.2f" %w,ha="left",va="center") 如果有錯,還望指正。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://www.hztianpu.com/yun/124492.html
摘要:過去的測試包括,在皮膚病診斷中的表現大致上和人類專家持平。和其同事也在皮膚癌等其他皮膚病上測試了深度學習。使用數據集進行驗證時,基底細胞癌診斷的敏感度是。 人工智能目前在與專業醫生的能力對比上還罕有勝跡。但深度神經網絡方法最近已經可以在灰指甲這一真菌疾病的診斷上擊敗 42 名皮膚科專家了——這種疾病每年困擾著 3500 萬美國人。人工智能在醫療領域的這一巨大成功很大程度上得歸功于韓國研究者提...
摘要:現場宣布全球領先的深度學習開源框架正式對外發布版本,并保證的本次發布版本的接口滿足生產環境穩定性要求。有趣的應用案例皮膚癌圖像分類皮膚癌在全世界范圍內影響深遠,患病人數眾多,嚴重威脅身體機能。 前言本文屬于介紹性文章,其中會介紹許多TensorFlow的新feature和summit上介紹的一些有意思的案例,文章比較長,可能會花費30分鐘到一個小時Google于2017年2月16日(北京時間...
閱讀 11016·2025-12-16 18:22
閱讀 1094·2023-04-26 00:30
閱讀 3046·2021-11-23 09:51
閱讀 1403·2021-11-02 14:38
閱讀 3203·2021-09-07 10:23
閱讀 2623·2021-08-21 14:09
閱讀 1791·2019-08-30 10:57
閱讀 1883·2019-08-29 11:20