糖尿病数据挖掘
- 一理:机器学习量化分析糖尿病致病因子
- 下载:临床数据
- 线性回归预测糖尿病
- LightGBM 预测糖尿病
- 糖尿病因子分析
- 变量相关性分析
- 一文:当前科学理解慢病之王的解决方案
- 是什么
- 怎么治疗
- 怎么预防
一理:机器学习量化分析糖尿病致病因子
下载:临床数据
这是一所大学统计系提供的数据:https://statistics.sciences.ncsu.edu/
数据集在审核中,也可以在官网下载。
数据下载:https://www4.stat.ncsu.edu/~boos/var.select/diabetes.html
点击 the original data set 获取原数据:
全选,把这些数据复制下来,保存到本地 .txt 文件。
再从 .txt 文件中全选,复制到 .excel 文件。
线性回归预测糖尿病
最小回归预测糖尿病论文:https://web.stanford.edu/~hastie/Papers/LARS/LeastAngle_2002.pdf
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
from sklearn import datasets, linear_model
from sklearn.metrics import mean_squared_error, r2_score,mean_absolute_error, median_absolute_error
from sklearn.model_selection import train_test_splitreadFileName="original_data.xlsx" # 原始数据
# readFileName="processed_data.xlsx" # 处理过的数据(提供数据的机构修剪了原始数据,方差不会太大)
# 读取excel
data=pd.read_excel(readFileName)
X=data.loc[:,"AGE":"S6"]
y=data["y"]# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 创建线性回归对象
regr = linear_model.LinearRegression()
# 使用训练集训练模型
regr.fit(X_train,y_train)# 使用测试集进行预测
y_pred = regr.predict(X_test)# 平均绝对误差:真实值 - 预测值的绝对值,累加,除以样本量
MAE = mean_absolute_error(y_test,y_pred)# 中值绝对误差:俩队数相减得到差值,求中位数
MedianAE = median_absolute_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
dict1 = {"y_predict": y_pred, "y_test": y_test}
df1 = pd.DataFrame(dict1)
df1.to_excel("MAE.xlsx")
print("MAE", MAE)
print("median_absolute_error", MedianAE)# 解释方差得分:1 是完美预测
print('r2: %.4f' % r2)
输出:
original_data
MAE 41.54836328325207
r2: 0.4
LightGBM 预测糖尿病
import lightgbm as lgb
import pandas as pd
from sklearn import model_selection
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error, r2_score, mean_absolute_error,median_absolute_errorreadFileName = "original_data.xlsx" # 原始数据
# readFileName = "processed_data.xlsx" # 处理过的数据(提供数据的机构修剪了原始数据,方差不会太大)# 读取excel
data = pd.read_excel(readFileName)
X = data.loc[:, "AGE": "S6"]
y = data["y"]# 划分训练集和测试集
X_train, X_test, y_train, y_test = model_selection.train_test_split(X, y, test_size=0.3, random_state=42)# lightgbm
model = lgb.LGBMRegressor()
model.fit(X, y)
y_pred = model.predict(X_test)MAE = mean_absolute_error(y_test, y_pred)
# 中值绝对误差
MedianAE = median_absolute_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
输出:
original_data
MAE 14.273899805021866
r2: 0.9
模型提升了 2 倍。
糖尿病因子分析
糖尿病因子分析,如性别。根据统计,男性患病率 9.6%,女性患病率 9.0%,性别差异不大。
反倒是年龄,年龄越大,患病概率越高:
所以,年龄越大,饮食越要控制,减少糖分摄入。
import lightgbm as lgb
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.preprocessing import StandardScaler
from sklearn import model_selection
from sklearn.model_selection import train_test_split
from sklearn.metrics import r2_score
from sklearn.ensemble import RandomForestRegressor# readFileName="original_data.xlsx"
readFileName="processed_data.xlsx"
# 读取excel
data=pd.read_excel(readFileName)
X=data.loc[:,"AGE":"S6"]
y=data["y"]# 划分训练集和测试集
X_train, X_test, y_train, y_test = model_selection.train_test_split(X, y, test_size=0.3, random_state=42)# lightgbm
model=lgb.LGBMRegressor(max_depth=13)
# model=lgb.LGBMRegressor()
model.fit(X, y)y_pred = model.predict(X_test)
# rms = (np.mean((y - y_pred)**2))**0.5
MAE=sum(abs(y_test - y_pred))/len(y_test)
score=1/(1+MAE)
# print ("RF RMS", rms)
print("MAE",MAE)
print("score:",score)# Explained variance score: 1 is perfect prediction
print('r2: %.4f' % r2_score(y_test,y_pred))feature_importances=model.feature_importances_
names=X.columns
list_feature_importances=list(zip(feature_importances,names))
df_feature_importances=pd.DataFrame(list_feature_importances)
# df_feature_importances.to_excel("catboost_110变量重要性.xlsx")
df_feature_importances.to_excel("lightgbm变量重要性.xlsx")n_features=X.shape[1]
plt.barh(range(n_features),model.feature_importances_,align='center')
plt.yticks(np.arange(n_features),X.columns)
plt.title("lightgbm feature importance")
plt.xlabel('Feature Importance')
plt.ylabel('Feature')
plt.show()
# plt.savefig("featureImportance_original_data.png")
plt.savefig("featureImportance_processed_data.png")
输出:
MAE 13.823899600226756
score: 0.06745863281377751
r2: 0.9388
Age(年龄)、性别(Sex)、Body mass index(体质指数)、Average Blood Pressure(平均血压)、S1~S6一年后疾病级数指标。
影响糖尿病的致病因素,主要是 BMI、S5(血压)、AGE(年龄),BMI 指数高(肥胖)是导致糖尿病最重要的风险因素。
变量相关性分析
# 变量相关性
def Relation(df1,method,fileName):# 共线性分析cor=df1.corr(method)cor.to_excel("correlation_table.xlsx")cor.loc[:,:]=np.tril(cor,k=-1)cor=cor.stack()# 仅仅列出高相关系数,数据呈现结构化high_cor=cor[(cor>0.6)|(cor<-0.6)]# 转换为dataframe结构df_high_cor=pd.DataFrame(high_cor)# 保存到Exceldf_high_cor.to_excel(fileName)Relation(data,'pearson',"high_correlation_pearson.xlsx") # 数据正态分布
Relation(data,'spearman',"high_correlation_spearman.xlsx") # 数据不是正态分布
完整代码:
import lightgbm as lgb
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.preprocessing import StandardScaler
from sklearn import model_selection
from sklearn.model_selection import train_test_split
from sklearn.metrics import r2_score
from sklearn.ensemble import RandomForestRegressor# readFileName="original_data.xlsx"
readFileName="processed_data.xlsx"
# 读取excel
data=pd.read_excel(readFileName)
X=data.loc[:,"AGE":"S6"]
y=data["y"]# 划分训练集和测试集
X_train, X_test, y_train, y_test = model_selection.train_test_split(X, y, test_size=0.3, random_state=42)# lightgbm
model=lgb.LGBMRegressor(max_depth=13)
# model=lgb.LGBMRegressor()
model.fit(X, y)y_pred = model.predict(X_test)
# rms = (np.mean((y - y_pred)**2))**0.5
MAE=sum(abs(y_test - y_pred))/len(y_test)
score=1/(1+MAE)
# print ("RF RMS", rms)
print("MAE",MAE)
print("score:",score)# Explained variance score: 1 is perfect prediction
print('r2: %.4f' % r2_score(y_test,y_pred))feature_importances=model.feature_importances_
names=X.columns
list_feature_importances=list(zip(feature_importances,names))
df_feature_importances=pd.DataFrame(list_feature_importances)
# df_feature_importances.to_excel("catboost_110变量重要性.xlsx")
df_feature_importances.to_excel("lightgbm变量重要性.xlsx")n_features=X.shape[1]
plt.barh(range(n_features),model.feature_importances_,align='center')
plt.yticks(np.arange(n_features),X.columns)
plt.title("lightgbm feature importance")
plt.xlabel('Feature Importance')
plt.ylabel('Feature')
plt.show()
# plt.savefig("featureImportance_original_data.png")
plt.savefig("featureImportance_processed_data.png")def Relation(df1,method,fileName):cor=df1.corr(method)cor.to_excel("correlation_table.xlsx")cor.loc[:,:]=np.tril(cor,k=-1)cor=cor.stack()# 仅仅列出高相关系数,数据呈现结构化high_cor=cor[(cor>0.6)|(cor<-0.6)]df_high_cor=pd.DataFrame(high_cor)df_high_cor.to_excel(fileName)Relation(data,'pearson',"high_correlation_pearson.xlsx")
Relation(data,'spearman',"high_correlation_spearman.xlsx")
相关性最高的是 S1、S2。
一文:当前科学理解慢病之王的解决方案
中国是重大的慢病市场,糖尿病是慢病之王。
数据来自真实的临床机构,毕竟机器学习受数据影响,数据不够量、不够均衡就会产生偏差。
-
国际糖尿病联合会:https://idf.org/
-
英国糖尿病组织官网:http://www.diabetes.org.uk/
科学是一个社会行为。所谓科学知识,其实是当前这一代科学家的集体共识,仅此而已。
当前科学理解,是一线科学家穷尽人类目前所有的知识,对一个事物最好的判断。对科学家来说,它是新研究的出发点和讨论的基本线;对一般公众来说,它可能是认知的天花板。
一般人得病后都喜欢吃贵的补品,鹿茸、虎骨、熊掌、人参、阿胶、海参、鱼翅、虫草。
比如虫草,而现在整个学术界的共识就是,虫草不仅没用,而且可能有害。
如果冬虫夏草真的没用,为什么还有那么多人趋之若鹜呢?
如果用博弈论来看,现在的市场就是一个两因素市场。
要想打破这个均衡,只对少数人科普是不够的。
第一,互联网并不是一个是非不分、黑白不明的地方,事实上很多的网站会列举了冬虫夏草的种种功效,包括补肾益精、止血化痰、补虚……一直到抑癌抗癌、美容养颜等等一共12 项功能,简直就是神药;再加上价格贵,大家都信了。
冬虫夏草,你知道它没用,这只是一个因素,这还不足以让你彻底不买它。
还有一个因素是 “很多人认为它很值钱”。
所以,买冬虫夏草并不是为了自己吃,而是作为一个贵重礼品送人。人们不一定认同它的功效,但是人们认同它的价格。
除非哪天,社会习俗把 “冬虫夏草没用” 变成一个公共知识,以至于送冬虫夏草就等于是对智商的侮辱才行。
嗨,冬虫夏草和燕窝等各类补品,就是一个“中国式”大骗局。
每年的九月到第二年四月是金丝燕的繁殖期。这期间,它们用来建巢的唾液很丰富,雌燕和雄燕会一起建巢,就是用唾液和其他东西混合在一起,形成一个杯子状的窝。
古代人的判断标准就是物以稀为贵,稀有的吃了就对身体有好处。
于是,悬崖上的燕窝比屋檐下的燕窝吃了更长寿,金丝燕呕血做出来的血燕窝更是稀奇,于是它就能卖出天价。
中国是印尼燕窝出口的最大目的地,但是印尼当地采燕窝的农民说,根本没有血燕窝这种东西。
当地有从内地来的黑心商人收购来燕窝后,把燕窝用燕子的粪便再熏蒸五天,这时候,燕窝有些部分会变红,而后就被当作血燕窝来卖,价格会贵很多。
这些人就是摸准了有相当多的人对什么是健康、什么是营养这方面的认识,还停留在1000年前的水平,才敢这样下狠手的。
燕窝有什么神奇功效吗?一个也没有。
普通功效呢?多吃的话可以解饱、治饿,除此之外就没有其他特别的了。
其实这个道理也一样适用于鹿茸、虎骨、熊掌、人参、阿胶、海参、鱼翅、虫草等传统上认为的滋补品。
因为它们都不是提纯过的物质,所以物质结构和大部分生物体差异并不大。
如果要体现出特别的功效,就要把那一点点微不足道的差异放大再放大,放大到和生物体的组成成分截然不同的时候,就有可能不一样了。
比如,有的人发烧时,啃柳树皮能退烧,但必须啃春天的,啃秋天的就没用。
为什么呢?因为水杨酸在春天的柳树皮中的含量是秋天的几百倍。也就是说,功效不在柳树皮,而在水杨酸,你能不能把水杨酸从柳树皮中提纯出来才是关键。
你不提纯,怎么能期待一种微量物质有什么功效呢?
我们再来看鹿茸、虎骨、熊掌、人参、阿胶、海参、鱼翅,它们根本没有希望成为成功的商品(真的有功效、畅销全球)。
它们之所以依然常见于市场,主要就是生产者利用消费者的无知进行诈骗。
有名人故事做背景,再把功效用古代医学解释一番,燕窝自然是很受欢迎的。
中国几乎没有燕窝生产,全部依靠进口燕窝,据统计,燕窝总进口量是 80 吨左右,而中国每年燕窝产品的消费是 600 多吨,多出的 520 吨都是什么呢?
燕窝风味饮品。这个道理就像,番茄酱里没有番茄但也叫番茄酱,椰汁里没有椰子但也叫椰汁是一样的。
吃补品对身体可能不仅没有好处,还有坏处,对身体好的反而是最基础的规律作息、饮食均衡、合理运动。
是什么
即使是在医学如此发达的今天,糖尿病仍然是一种几乎无法根治、无法逆转的疾病。绝大多数时候,人们能够期待的最好结果,也无非是“控制”,尽量延缓病情恶化的程度。
最后,糖尿病本身并不致死,但是会引发各种致命的疾病。
这就是所谓的“糖尿病并发症”。一个糖尿病患者如果得不到很好的治疗,几乎一定会在10年内患上各种各样的并发症。这些并发症不仅可能发生在全身各处,眼睛、双脚、肾脏、血管、心脏、大脑都有可能;而且非常痛苦难治,甚至连患者的寿命都会受到很大影响。
怎么治疗
型糖尿病,本质上都是负责降低血糖的胰岛素系统失灵的结果。因此自然而然的,提到糖尿病,人们首先想到的就是胰岛素。
在糖尿病治疗的市场上,销售额最大的品类也确实是胰岛素。
除此之外,几乎在全世界所有医院,任何一个患者被确诊 2型糖尿病(分1型、2型,2型居多)后,医生都会立刻为他开出一张二甲双胍的处方。每天全世界有超过1亿人,使用这种药物控制血糖。
至少截至目前,二甲双胍还是一种治疗糖尿病的处方药物,它也有不少副作用需要警惕,比如说,可能会导致腹痛腹泻、恶心呕吐等胃肠道反应;再比如说,可能会导致肾功能有问题的人的肾病加重,所以不建议你随便就去吃。
针对1型糖尿病,我们有各种胰岛素药物,未来还可能拥有升级版的生物胰腺;针对2型糖尿病,我们拥有“神药”二甲双胍,也有基于病理研发出来的各类“格列汀”、“格列净”药物。
怎么预防
糖尿病的复杂症状,其实归根结底都是血糖上升导致的。
人,就是喜欢甜的;大脑对糖上瘾,抵挡不住不是自控力低,而是无法克服人性的本能。
下面几个方法,既可以不那么痛苦的自律,也不会得糖尿病。
1、一顿饭吃了,土豆、白薯、山药、莲藕等,就不要吃米饭。
2、喝饮料时选择无糖的。
3、吃完整的水果,不要喝果汁。
吃完饭,走路溜达30分钟,消化一下。正常人稍微控制下,一般不会得糖尿病。