生物信息学竞赛:糖尿病数据挖掘

Posted Debroon

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了生物信息学竞赛:糖尿病数据挖掘相关的知识,希望对你有一定的参考价值。

 


一理:机器学习量化分析糖尿病致病因子

 


下载:临床数据

这是一所大学统计系提供的数据: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_split

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 = 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_error

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()
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)
    # 保存到Excel
    df_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。

 


一文:当前科学理解慢病之王的解决方案

中国是重大的慢病市场,糖尿病是慢病之王。

数据来自真实的临床机构,毕竟机器学习受数据影响,数据不够量、不够均衡就会产生偏差。

科学是一个社会行为。所谓科学知识,其实是当前这一代科学家的集体共识,仅此而已。

当前科学理解,是一线科学家穷尽人类目前所有的知识,对一个事物最好的判断。对科学家来说,它是新研究的出发点和讨论的基本线;对一般公众来说,它可能是认知的天花板。

一般人得病后都喜欢吃贵的补品,鹿茸、虎骨、熊掌、人参、阿胶、海参、鱼翅、虫草。

比如虫草,而现在整个学术界的共识就是,虫草不仅没用,而且可能有害。

如果冬虫夏草真的没用,为什么还有那么多人趋之若鹜呢?

如果用博弈论来看,现在的市场就是一个两因素市场。

要想打破这个均衡,只对少数人科普是不够的。

第一,互联网并不是一个是非不分、黑白不明的地方,事实上很多的网站会列举了冬虫夏草的种种功效,包括补肾益精、止血化痰、补虚……一直到抑癌抗癌、美容养颜等等一共12 项功能,简直就是神药;再加上价格贵,大家都信了。

冬虫夏草,你知道它没用,这只是一个因素,这还不足以让你彻底不买它。

还有一个因素是 “很多人认为它很值钱”。

所以,买冬虫夏草并不是为了自己吃,而是作为一个贵重礼品送人。人们不一定认同它的功效,但是人们认同它的价格。

除非哪天,社会习俗把 “冬虫夏草没用” 变成一个公共知识,以至于送冬虫夏草就等于是对智商的侮辱才行。

嗨,冬虫夏草和燕窝等各类补品,就是一个“中国式”大骗局。

每年的九月到第二年四月是金丝燕的繁殖期。这期间,它们用来建巢的唾液很丰富,雌燕和雄燕会一起建巢,就是用唾液和其他东西混合在一起,形成一个杯子状的窝。

古代人的判断标准就是物以稀为贵,稀有的吃了就对身体有好处。

于是,悬崖上的燕窝比屋檐下的燕窝吃了更长寿,金丝燕呕血做出来的血燕窝更是稀奇,于是它就能卖出天价。

中国是印尼燕窝出口的最大目的地,但是印尼当地采燕窝的农民说,根本没有血燕窝这种东西。

当地有从内地来的黑心商人收购来燕窝后,把燕窝用燕子的粪便再熏蒸五天,这时候,燕窝有些部分会变红,而后就被当作血燕窝来卖,价格会贵很多。

这些人就是摸准了有相当多的人对什么是健康、什么是营养这方面的认识,还停留在1000年前的水平,才敢这样下狠手的。

燕窝有什么神奇功效吗?一个也没有。

普通功效呢?多吃的话可以解饱、治饿,除此之外就没有其他特别的了。

其实这个道理也一样适用于鹿茸、虎骨、熊掌、人参、阿胶、海参、鱼翅、虫草等传统上认为的滋补品。

因为它们都不是提纯过的物质,所以物质结构和大部分生物体差异并不大。

如果要体现出特别的功效,就要把那一点点微不足道的差异放大再放大,放大到和生物体的组成成分截然不同的时候,就有可能不一样了。

比如,有的人发烧时,啃柳树皮能退烧,但必须啃春天的,啃秋天的就没用。

为什么呢?因为水杨酸在春天的柳树皮中的含量是秋天的几百倍。也就是说,功效不在柳树皮,而在水杨酸,你能不能把水杨酸从柳树皮中提纯出来才是关键。

你不提纯,怎么能期待一种微量物质有什么功效呢?

我们再来看鹿茸、虎骨、熊掌、人参、阿胶、海参、鱼翅,它们根本没有希望成为成功的商品(真的有功效、畅销全球)。

它们之所以依然常见于市场,主要就是生产者利用消费者的无知进行诈骗。

有名人故事做背景,再把功效用古代医学解释一番,燕窝自然是很受欢迎的。

中国几乎没有燕窝生产,全部依靠进口燕窝,据统计,燕窝总进口量是 80 吨左右,而中国每年燕窝产品的消费是 600 多吨,多出的 520 吨都是什么呢?

燕窝风味饮品。这个道理就像,番茄酱里没有番茄但也叫番茄酱,椰汁里没有椰子但也叫椰汁是一样的。

吃补品对身体可能不仅没有好处,还有坏处,对身体好的反而是最基础的规律作息、饮食均衡、合理运动。

 


是什么

即使是在医学如此发达的今天,糖尿病仍然是一种几乎无法根治、无法逆转的疾病。绝大多数时候,人们能够期待的最好结果,也无非是“控制”,尽量延缓病情恶化的程度。

最后,糖尿病本身并不致死,但是会引发各种致命的疾病。

这就是所谓的“糖尿病并发症”。一个糖尿病患者如果得不到很好的治疗,几乎一定会在10年内患上各种各样的并发症。这些并发症不仅可能发生在全身各处,眼睛、双脚、肾脏、血管、心脏、大脑都有可能;而且非常痛苦难治,甚至连患者的寿命都会受到很大影响。
 


怎么治疗

型糖尿病,本质上都是负责降低血糖的胰岛素系统失灵的结果。因此自然而然的,提到糖尿病,人们首先想到的就是胰岛素。

在糖尿病治疗的市场上,销售额最大的品类也确实是胰岛素。

除此之外,几乎在全世界所有医院,任何一个患者被确诊 2型糖尿病(分1型、2型,2型居多)后,医生都会立刻为他开出一张二甲双胍的处方。每天全世界有超过1亿人,使用这种药物控制血糖。

至少截至目前,二甲双胍还是一种治疗糖尿病的处方药物,它也有不少副作用需要警惕,比如说,可能会导致腹痛腹泻、恶心呕吐等胃肠道反应;再比如说,可能会导致肾功能有问题的人的肾病加重,所以不建议你随便就去吃。

针对1型糖尿病,我们有各种胰岛素药物,未来还可能拥有升级版的生物胰腺;针对2型糖尿病,我们拥有“神药”二甲双胍,也有基于病理研发出来的各类“格列汀”、“格列净”药物。
 


怎么预防

糖尿病的复杂症状,其实归根结底都是血糖上升导致的。

人,就是喜欢甜的;大脑对糖上瘾,抵挡不住不是自控力低,而是无法克服人性的本能。

下面几个方法,既可以不那么痛苦的自律,也不会得糖尿病。

1、一顿饭吃了,土豆、白薯、山药、莲藕等,就不要吃米饭。

2、喝饮料时选择无糖的。

3、吃完整的水果,不要喝果汁。

吃完饭,走路溜达30分钟,消化一下。正常人稍微控制下,一般不会得糖尿病。
 


以上是关于生物信息学竞赛:糖尿病数据挖掘的主要内容,如果未能解决你的问题,请参考以下文章

《Python生物信息学数据管理》高清中文版PDF+英文版PDF+源代码学习

文献详解丨16+文章教你如何用机器学习挖掘2型糖尿病特征

上海市青少年计算机应用操作竞赛含金量

用于一型糖尿病血糖调节的无模型iPID控制器

五大学科竞赛

bioinfo生物信息学——代码遇见生物学的地方