使用 Spark ML + Jieba + Pandas 實現一個疾病智慧診功能(Python)
阿新 • • 發佈:2019-01-10
一、前言
電子病歷,很多市中心醫院都在使用,卻很少有人將其中的資料用於機器學習,以達到智慧診斷的功能
本文對此做了一個實戰案例。
二、可行性分析
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 版本要注意,其他版本會報錯。