1. 程式人生 > >使用 Spark ML + Jieba + Pandas 實現一個疾病智慧診功能(Python)

使用 Spark ML + Jieba + Pandas 實現一個疾病智慧診功能(Python)

一、前言

電子病歷,很多市中心醫院都在使用,卻很少有人將其中的資料用於機器學習,以達到智慧診斷的功能

本文對此做了一個實戰案例。

二、可行性分析

1、功能介紹:

使用者輸入個人身體特徵的資訊,機器返回最可能的得出的疾病型別及其可能性 %。

2、分析:

① 使用者輸入個人病症時,為一段 中文 字串
② 首先要進行做特徵處理,即將文字進行分詞(英文則可以直接跳過!),
③ 打上標籤 label,進行 Spark 機器學習訓練
④ 預測

三、程式碼

1、開發環境

儲存模型

# -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com
# pip freeze > requirements.txt # pip install -r requirements.txt import jieba import pandas as pd from pyspark.ml import Pipeline from pyspark.ml.classification import LogisticRegression, SparkSession from pyspark.ml.feature import HashingTF, Tokenizer # 讀取原生資料 df = pd.read_excel("C:/Users/linhongcun/Desktop/t_sickness.xlsx"
) # 中文分詞 for indexs in df.index: string = df.loc[indexs].values[2] # print(string) con = jieba.cut(string, cut_all=True) content = list(con) c = ' '.join(content) # print(c) df.iloc[indexs, 2] = c # 0.構建 Spark 物件 spark = SparkSession.builder.master("local").appName("sickness"
).getOrCreate() # 1.訓練樣本 training = spark.createDataFrame(df) training.show(truncate=False) """ 必須要有欄位為 label 作為預測點——1婦科疾病、2神經系統疾病、3迴圈系統疾病、4呼吸系統疾病、5消化系統疾病 +---+--------+--------------------------+-----+ |id |name |symptom |label| +---+--------+--------------------------+-----+ |1 |月經失調 |月經 月經週期 週期 不 固定 |1 | |2 |痛經 |月經 來潮 前後 腹部 疼痛 |1 | |3 |盆腔炎 |發熱 下腹 下腹部 腹部 疼痛 |1 | |4 |膀胱炎 |尿急 瘙癢 灼熱 |1 | |5 |附件炎 |月經 量 增多 痛經 嚴重 |1 | |6 |陰道炎 |陰道 灼熱 痛癢 白帶 腥臭 |1 | |7 |乳腺炎 |乳房 紅腫 熱 痛 有 硬塊 |1 | |8 |宮頸炎 |以 白帶 增多 為主 主要 主要症狀 症狀 |1 | |9 |經前期緊張綜合徵|情緒 不穩 穩定 易怒 |1 | |10 |更年期綜合徵 |月經 紊亂 潮熱 盜汗 多疑 易怒 |1 | |11 |乳腺增生 |乳房 脹痛 並 有 腫塊 出現 |1 | |12 |葡萄胎 |閉經 腹痛 |1 | |13 |子宮肌瘤 |下腹 下腹部 腹部 出現 梨 大小 的 腫塊 |1 | |14 |宮頸癌 |月經 之外 的 出血 |1 | |15 |卵巢腫瘤 |腹痛 下腹 出現 腫塊 |1 | |16 |乳腺癌 |最 可怕 的 腫塊 往往 沒有 痛感 |1 | |17 |淋病 |尿 痛 尿急 尿道 尿道口 道口 口紅 紅腫|1 | |18 |頭痛 |頭部 出現 反覆 反覆無常 無常 的 疼痛 |2 | |19 |眩暈 |感覺 周圍 物體 旋轉 站立 不穩 |2 | |20 |暈動病 |乘車 時 頭暈 噁心 |2 | +---+--------+--------------------------+-----+ only showing top 20 rows """ # 2.引數設定:tokenizer、hashingTF、lr tokenizer = Tokenizer(inputCol="symptom", outputCol="words") hashingTF = HashingTF(inputCol=tokenizer.getOutputCol(), outputCol="features") lr = LogisticRegression(maxIter=10, regParam=0.001) pipeline = Pipeline(stages=[tokenizer, hashingTF, lr]) # 3.訓練模型 model = pipeline.fit(training) # 4.測試資料 test = spark.createDataFrame([ (0, "興奮"), (1, "拒食"), (2, "脹痛"), (3, "咳嗽") ], ["id", "symptom"]) test.show(truncate=False) """ +---+-------+ |id |symptom| +---+-------+ |0 |興奮 | |1 |拒食 | |2 |脹痛 | |3 |咳嗽 | +---+-------+ """ # 5.模型預測 prediction = model.transform(test) prediction.show(truncate=False) """ 正確率100%——1婦科疾病、2神經系統疾病、3迴圈系統疾病、4呼吸系統疾病、5消化系統疾病 +---+-------+-----+-----------------------+--------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------+----------+ |id |symptom|words|features |rawPrediction |probability |prediction| +---+-------+-----+-----------------------+--------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------+----------+ |0 |興奮 |[興奮] |(262144,[85159],[1.0]) |[-2.477496467830346,0.23894253214354277,2.502729581080473,-0.026096802888310178,-0.2103237120516836,-0.027755130453694155]|[0.005142032398933459,0.07778023963377388,0.7482030950579408,0.05967111542618967,0.04963127430859228,0.05957224317457003] |2.0 | |1 |拒食 |[拒食] |(262144,[70639],[1.0]) |[-2.479710267998232,0.22296399538676587,0.40711232995063407,0.12542881442781045,-0.22694517875278053,1.9511503069858014] |[0.007096899804584044,0.10588274523648426,0.12729161551306126,0.09604310718632243,0.06751995141297448,0.5961656808465735] |5.0 | |2 |脹痛 |[脹痛] |(262144,[204799],[1.0])|[-2.4936994604638585,0.815143389891353,0.29659283389333035,-0.024482861902893505,-0.2759726416266452,1.6824187402087265] |[0.00764809839775098,0.2092019162066145,0.12455524293424604,0.09034843000203284,0.07025868007154462,0.4979876323878109] |5.0 | |3 |咳嗽 |[咳嗽] |(262144,[222472],[1.0])|[-2.484678277185686,0.17511466926473163,0.36108768539188024,-0.20941504781420683,2.233242879410125,-0.0753519090668317] |[0.0060495948111361445,0.08646885081373447,0.10414219855157512,0.05886546146075085,0.6771632986309767,0.06731059573182673]|4.0 | +---+-------+-----+-----------------------+--------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------+----------+ """ # 6 模型儲存 pipeline.write().overwrite().save('C:\LLLLLLLLLLLLLLLLLLL\BigData_AI\pyspark\pipeline') model.write().overwrite().save('C:\LLLLLLLLLLLLLLLLLLL\BigData_AI\pyspark\model')

2、生產環境

直接讀取

from pyspark.ml import Pipeline, PipelineModel
from pyspark.ml.classification import SparkSession

# 0.構建 Spark 物件
spark = SparkSession.builder.master("local").appName("medical").getOrCreate()

# 2 訓練方法:載入的方式
loadedPipeline = Pipeline.load('C:\LLLLLLLLLLLLLLLLLLL\BigData_AI\pyspark\pipeline')

# 3.訓練模型:載入的方式
loadedPipelineModel = PipelineModel.load('C:\LLLLLLLLLLLLLLLLLLL\BigData_AI\pyspark\model')

# 4.測試資料
test = spark.createDataFrame([
    (0, "興奮")
], ["id", "symptom"])

# 5.模型預測 —— 1 婦科疾病、2 神經系統疾病、3 迴圈系統疾病、4 呼吸系統疾病、5 消化系統疾病
prediction = loadedPipelineModel.transform(test)
prediction.select("prediction").show(truncate=False)

四、訓練資料

① 疾病及其特徵
② 疾病型別

已經放到 GitHub 上了:https://github.com/larger5/SparkML_TrainingData.git
讀者可以先匯入 mysql 資料庫中,再匯出為 .xls 等檔案格式進行機器學習訓練。
包括 requirements.txt,Spark 版本要注意,其他版本會報錯。

五、使用 Django 部署演算法

https://github.com/larger5/dj_medical.git