华为数学建模D题

  • 第一题:选取感兴趣的20个变量
  • 第二题建立回归模型
  • 第三题 建立五个因变量(ADMET)的分类模型
  • 第四题 每个变量对活性的定量分析
  • 总结
  • 引用

大致分享一下自己在建模过程中的思路,仅仅是做个记录


第一题:选取感兴趣的20个变量

对于729个属性变量建立回归和分类模型而言显得相对有点多,因此需要维度压缩,通常在使用维度压缩时有很多方法如:PCA、DAN(深度自编码)等,但是这样得到的维度压缩不会对应到相应的原有属性,类似于特征映射而非筛选。因此第一题采取的思路是选用XGBoost和Random Forest和信息增益[1]筛选共有的特征。

import xgboost
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.metrics import r2_score
from xgboost import XGBRegressor
import numpy as np
from imblearn.metrics import geometric_mean_score# 读取文件内容
input = pd.read_excel(r"D:\BaiduNetdiskDownload\2021年D题\Molecular_Descriptor.xlsx", sheet_name="training")
output = pd.read_excel(r'D:\BaiduNetdiskDownload\2021年D题\ERα_activity.xlsx',sheet_name='training')
# 区分自变量(X)和因变量(Y)
independentCol = input.columns[1:-1]
dependentCol = output.columns[-1]
X = input[independentCol]
Y = output[dependentCol]# 修改自变量名称为正整数,为后面的训练做准备
numForCol = [i for i in range(0, len(independentCol), 1)]
colReplace = dict(zip(independentCol, numForCol))
X = X.rename(columns=colReplace)# 随机获得训练集和测试集
x_train, x_test, y_train, y_test = train_test_split(X, Y, test_size=0.8, shuffle=True)# 初始化 gmean(0) 和 指标组合(空)
gmean = 0
feaFinal = set()# 不断简化指标组合,以获得最优指标集
while (1):# 按步骤二随机抽取80%样本,进行只保留重要性大于0的指标x_1, _, y_1, _ = train_test_split(x_train, y_train, test_size=0.8, shuffle=True)m1 = xgboost.XGBRegressor(use_label_encoder=False)m1.fit(x_1, y_1)  # 讲样本放入XGBoostf1 = dict(zip(x_1.columns, m1.feature_importances_))  # 讲指标序号和重要性分数进行对应f1 = {k: v for (k, v) in f1.items() if v > 0}  # 保留重要性分数大于0的指标f1 = set(f1.keys())  # 讲指标序号以set形式存放# 步骤三,与步骤二相似,获得另一组指标x_2, _, y_2, _ = train_test_split(x_train, y_train, test_size=0.8, shuffle=True)m2 = xgboost.XGBRegressor(use_label_encoder=False)m2.fit(x_2, y_2)f2 = dict(zip(x_2.columns, m2.feature_importances_))f2 = {k: v for (k, v) in f2.items() if v > 0}f2 = set(f2.keys())# 取两个指标组的交集,并将该交集放入XGBoostfeatureUnion = f1.union(f2)x_train = x_train[featureUnion]x_test = x_test[featureUnion]model = xgboost.XGBRegressor(use_label_encoder=False)model.fit(x_train, y_train)y_pred = model.predict(x_test)  # 进行预测# 利用预测结果和y_test, 计算gmeangmean_new = r2_score(y_test, y_pred)# 若新计算的gmean上次小或一样,则优化结束if gmean_new <= gmean:break# 否则,更新最佳的gmean和指标选择else:gmean = gmean_newfeaFinal = featureUnion# print("Update: " + str(gmean_new))# print("Update: " + str(feaFinal))findName = {v: k for k, v in colReplace.items()}
feaFinal = sorted(feaFinal)
SelectedFeatures = [findName[i] for i in feaFinal]
# print("指标集最优解:" + str(SelectedFeatures))
# print("最后G-mean: " + str(gmean))
col_im = str(SelectedFeatures)import pandas as pd
from xgboost import XGBClassifier,XGBRegressor
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestRegressor
file_label_act = r'D:\BaiduNetdiskDownload\2021年D题\ERα_activity.xlsx'
file_feature = r'D:\BaiduNetdiskDownload\2021年D题\Molecular_Descriptor.xlsx'
data_label_activity = pd.read_excel(file_label_act,sheet_name='training')
data_feature = pd.read_excel(file_feature,sheet_name='training')
x = np.array(data_feature.iloc[:,1:])
y = np.array(data_label_activity.iloc[:,-1])
x_train,x_val,y_train,y_val = train_test_split(x,y,test_size=0.1)
#随机森林
# cls = XGBRegressor()
cls = RandomForestRegressor()
cls.fit(x_train,y_train)
f  = cls.feature_importances_
f_l = data_feature.columns.tolist()
# print('集成学习筛选特征前模型的得分效果:',cls.score(x_val,y_val))
dic_ = {j:i for i,j in zip(f,f_l)}
d_order=sorted(dic_.items(),key=lambda x:x[1],reverse=True)  # 按字典集合中,每一个元组的第二个元素排列。                                                          # x相当于字典集合中遍历出来的一个元组。
col_rf = [i[0] for i in d_order[:30]]#Xgboost
cls = XGBRegressor()
cls.fit(x_train,y_train)
f  = cls.feature_importances_
f_l = data_feature.columns.tolist()
# print('集成学习筛选特征前模型的得分效果:',cls.score(x_val,y_val))
dic_ = {j:i for i,j in zip(f,f_l)}
d_order=sorted(dic_.items(),key=lambda x:x[1],reverse=True)  # 按字典集合中,每一个元组的第二个元素排列。                                                          # x相当于字典集合中遍历出来的一个元组。
col_xg = [i[0] for i in d_order[:30]]print('rf:',len(col_rf),'xg:',len(col_xg),'im:',len(col_im))
col_xg_ = []
for i in col_rf:if i in col_xg:col_xg_.append(i)
print('xg:',len(col_xg_),col_xg_)col_im_ = []
for i in col_rf:if i in col_im:col_im_.append(i)
print('im:',len(col_im_),col_im_)col_xg_im = []
for i in col_rf:if i in col_im or i in col_xg:col_xg_im.append(i)
print('xg or im:',len(col_xg_im),col_xg_im)col_xg_im_and = []
for i in col_rf:if i in col_im and i in col_xg:col_xg_im_and.append(i)
print('xg and im:',len(col_xg_im_and),col_xg_im_and)col_ = col_xg_im_and.copy()
x = np.array(data_feature[col_])
y = np.array(data_label_activity.iloc[:,-1])
x_train,x_val,y_train,y_val = train_test_split(x,y,test_size=0.1)
cls = RandomForestRegressor()
cls.fit(x_train,y_train)
print('集成学习筛选特征前模型的得分效果:',cls.score(x_val,y_val))for i in col_xg_:if i not in col_:col_.append(i)
for i in col_im_:if i not in col_:col_.append(i)col_ = col_[:20]

第二题建立回归模型

利用随机森林和XGBoost在筛选的特征上建立活性回归模型

col_ =  ['MDEC-22', 'gmin', 'minHBint10', 'minaaN', 'maxHBint10', 'minHBint4', 'SHBint10', 'MDEO-11', 'C2SP1', 'maxdO', 'MDEN-33', 'fragC', 'ntsC', 'SHBint9', 'MDEC-24', 'BCUTw-1h', 'nAtomLAC', 'ATSc2', 'WPOL', 'ATSc1']print('final col:',len(col_),col_)
x = np.array(data_feature[col_])
y = np.array(data_label_activity.iloc[:,-1])
x_train,x_val,y_train,y_val = train_test_split(x,y,test_size=0.1)
# cls = RandomForestRegressor()
cls = XGBRegressor()
import xgboost as xgb
import matplotlib.pyplot as pltcls.fit(x_train,y_train)
xgb.plot_tree(cls)
xgb.plot_tree(cls, num_trees=0)
fig = plt.gcf()
fig.set_size_inches(150, 100)
# plt.show()
fig.savefig(r'tree.png')
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号dtrain = xgb.DMatrix(x_train, label=y_train, feature_names=col_)
param = {}
# use softmax multi-class classification
# param['objective'] = 'binary:logistic'
# scale weight of positive examples
# param['eta'] = 0.1
# param['max_depth'] = 6
# param['silent'] = 1
# param['nthread'] = 4
# param['num_class'] = 9
model = xgb.train(param, dtrain)xgb.plot_importance(model,height=0.8,title='活性分析的特征重要性', ylabel='特征')
plt.rc('font', family='Arial Unicode MS', size=14)
plt.show()print('集成学习筛选特征前模型的得分效果:',cls.score(x_val,y_val))plt.figure()
plt.plot(range(len(x_val)),y_val,label='real')
# plt.plot(range(len(x_val)),cls.predict(x_val),label='xgb')xgb_reg = RandomForestRegressor()
xgb_reg.fit(x_train,y_train)
print('xgb score:',xgb_reg.score(x_val,y_val))plt.plot(range(len(x_val)),xgb_reg.predict(x_val),label='pred')
plt.title('RF')plt.legend()
plt.show()

第三题 建立五个因变量(ADMET)的分类模型

利用sklearn调用11个分类模型的api,最终选取五个效果比较好的模型,再进行集成对五个变量分类

from xgboost import XGBClassifier,XGBRegressor
from sklearn.ensemble import RandomForestClassifier,AdaBoostClassifier,ExtraTreesClassifier,BaggingClassifier
from sklearn.model_selection import train_test_split
import numpy as np
import pandas as pd
from sklearn.metrics import precision_score,recall_score,r2_score,accuracy_score
from sklearn.linear_model import LogisticRegression
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.svm import LinearSVC
from sklearn.neural_network import MLPClassifier
from sklearn.naive_bayes import GaussianNB
import warnings
warnings.filterwarnings("ignore")file_feature = r'D:\BaiduNetdiskDownload\2021年D题\Molecular_Descriptor.xlsx'
file_label = r'D:\BaiduNetdiskDownload\2021年D题\ADMET.xlsx'
#Caco-2 CYP3A4 hERG HOB MN
x = np.array(pd.read_excel(file_feature,sheet_name='training').iloc[:,1:])
y = np.array(pd.read_excel(file_label,sheet_name='training')['Caco-2'].astype('int'))x_train,x_val,y_train,y_val = train_test_split(x,y,test_size=0.1)model = [GradientBoostingClassifier(),AdaBoostClassifier(),XGBClassifier(),RandomForestClassifier(),ExtraTreesClassifier()]
name = ['GDBC','AdaC','XGB','RF','EtC']# rf = RandomForestClassifier()
# xgb = XGBClassifier()
#
# xgb.fit(x_train,y_train)
# print(xgb.score(x_val,y_val))def fit_evaluate_1(x_train,x_val,y_train,y_val,model,name,x_test):result = []result_test = []for j,i in zip(name,model):i.fit(x_train,y_train)print(j,':',i.score(x_val,y_val))res_ = i.predict(x_val)res_test = i.predict(x_test)result.append(res_)result_test.append(res_test)result_test = np.array(result_test).Tresult = np.array(result).T  #5,100result_ = []for i in result:if sum(i)>=1+len(name)//2:result_.append(1)else:result_.append(0)print('precision:',precision_score(y_val,result_))print('recall:', recall_score(y_val, result_))print('accuracy:',accuracy_score(y_val,result_))print('\n\n')# print('r2:',r2_score(y_val,result_))result_ = []for i in result_test:if sum(i) >= 1 + len(name) // 2:result_.append(1)else:result_.append(0)return result_# print(fit_evaluate_1(x_train,x_val,y_train,y_val,model,name))
# fit_evaluate_1(x_train,x_val,y_train,y_val,model,name)x = pd.read_excel(file_feature,sheet_name='training').iloc[:,1:]
y = pd.read_excel(file_label,sheet_name='training')
# x_train,x_val,y_train,y_val = train_test_split(x,y,test_size=0.1)def fit_all(x,y,model,name):x_in = pd.read_excel(file_feature,sheet_name='test').iloc[:,1:]y_in = pd.read_excel(file_label, sheet_name='training')y_out = pd.read_excel(file_label, sheet_name='test')x_train,x_val,y_train,y_val = train_test_split(x,y,test_size=0.1)columns_ = ['Caco-2', 'CYP3A4', 'hERG', 'HOB', 'MN']for i in columns_:print('The next fit is ',i)x_train_,x_val_,y_train_,y_val_ = np.array(x_train),np.array(x_val),np.array(y_train[i]),np.array(y_val[i])res_ = fit_evaluate_1(x_train_, x_val_, y_train_, y_val_, model, name,np.array(x_in))y_out[i] = res_print(y_out)writer = pd.ExcelWriter(file_label)  # 写入Excel文件y_in.to_excel(writer, 'training', float_format='%.10f')y_out.to_excel(writer, 'test', float_format='%.10f')  # ‘page_1’是写入excel的sheet名writer.save()writer.close()
fit_all(x,y,model,name)

第四题 每个变量对活性的定量分析

这一题属于比较开放性的问题,主要思路1、求解相关性系数矩阵并可视化;2、控制变量法

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.ensemble import RandomForestRegressor,RandomForestClassifierplt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号
from einops import rearrange, repeat
file_label_act = r'D:\BaiduNetdiskDownload\2021年D题\ERα_activity.xlsx'
file_feature = r'D:\BaiduNetdiskDownload\2021年D题\Molecular_Descriptor.xlsx'
file_label_cls = r'D:\BaiduNetdiskDownload\2021年D题\ADMET.xlsx'col_ =  ['MDEC-22', 'gmin', 'minHBint10', 'minaaN', 'maxHBint10', 'minHBint4', 'SHBint10', 'MDEO-11', 'C2SP1', 'maxdO', 'MDEN-33', 'fragC', 'ntsC', 'SHBint9', 'MDEC-24', 'BCUTw-1h', 'nAtomLAC', 'ATSc2', 'WPOL', 'ATSc1']x = pd.read_excel(file_feature,sheet_name='training')[col_]
y = pd.read_excel(file_label_act,sheet_name='training').iloc[:,-1]
y_cls = pd.read_excel(file_label_cls,sheet_name='training').iloc[:,-1]q = 0x['label'] = np.array(y_cls)     #AMDET用这个
# x['label'] = np.array(y)       #回归活性用这个# print(x.head())# rf = RandomForestRegressor()     #回归活性用这个
rf = RandomForestClassifier()      #AMDET用这个
rf.fit(np.array(x.iloc[:,:-1]),np.array(x.iloc[:,-1]))    #后面的-1代表AMDET的T,换成-2代表AMDET的E#以此类推,回归活性就是-1不用修改# print(x.head())
gmin = np.array(x['%s'%col_[q]])
gmin_scatter = np.arange(min(gmin)-0.5,max(gmin)+0.5,0.01)sample = [np.array(x.iloc[0,:-1]).tolist()]gmin_,y_ = sample[0][q],float(x.iloc[0,-1])
plt.scatter(gmin_,y_,label='real',c='r')act = []
for i in gmin_scatter:sample[0][q] = iact.append(rf.predict(sample))plt.plot(gmin_scatter,act,label='predict')
plt.title('%s对活性的影响'%col_[q])
plt.xlabel('%s'%col_[q])
plt.ylabel('活性')
plt.legend()
plt.show()# x = np.array(x.corr())
# # print(x["label"].corr(x[col_]))
# print(x)
#
# print(x.shape)
#
# x = np.clip(x,0,1)
# x = repeat(x, 'h w -> h w c', c=3)
#
# print(x.shape)
# plt.imshow(x)
# plt.show()

总结

老老实实的迈好每一步,相信成功就在你身边,有疑惑可以在评论区留言噢! 甘愿为理想“头破血流”

引用

[1]周颖.基于信息增益的小型工业企业信用评级模型[J].运筹与管理,2021,30(01):209-216.

华为数学建模2021 D题相关推荐

  1. 2021 年高教社杯全国大学生数学建模竞赛A题分析

    2021 年高教社杯全国大学生数学建模竞赛A题分析 题目 赛题分析 前言 问题一分析 问题二分析 问题三分析 题目 A 题 "FAST"主动反射面的形状调节 中国天眼--500 米 ...

  2. 2021 年第十一届 MathorCup 高校数学建模挑战赛A题分析

    2021 年第十一届 MathorCup 高校数学建模挑战赛A题分析 题目:自动驾驶中的车辆调头问题 问题分析 前言 综述 问题一分析 问题二分析 问题三分析 问题四分析 问题五分析 问题六分析 题目 ...

  3. A6.2021年全国数学建模竞赛C题分析-生产企业原材料的订购与运输

    Python小白的数学建模课-A6.2021年全国数学建模竞赛 C题分析. 2021全国大学生数学建模 赛题将于9月9日18时公布. 『Python小白的数学建模课 @ Youcans』带你从数模小白 ...

  4. A5.2021年全国数学建模竞赛B题-赛题分析与评阅要点(乙醇偶合制备C4烯烃分析)

    A5.2021年全国数学建模竞赛B题-赛题分析与评阅要点(乙醇偶合制备C4烯烃分析),本文转载竞赛赛题.评阅要点,进行赛题解读和分析. 评阅要点为竞赛组委会官方公布,完整体现了解题思路. 本文首发于 ...

  5. A4.2021年全国数学建模竞赛A题-赛题分析与评阅要点(FAST主动反射面的形状调节)

    Python小白的数学建模课-A4.2021年全国数学建模竞赛A题(FAST主动反射面的形状调节),本文转载竞赛赛题.评阅要点,进行赛题解读和分析. 评阅要点为竞赛组委会官方公布,完整体现了解题思路. ...

  6. 2022年华为杯中国研究生数学建模竞赛B题思路

    一.思路获取方式 获取代码方式: 2022年华为杯中国研究生数学建模竞赛思路 备注: 点击上面蓝色字体2022年华为杯中国研究生数学建模竞赛思路,扫描上面二维码,付费29.9元订阅海神之光博客付费专栏 ...

  7. 2021东三省数学建模竞赛a题

    2021东三省数学建模竞赛a题解题所需资料 内含火星高程图 模拟火星车着陆过程完整代码 动力学方程的建立过程及代码 一篇2014年国赛类似题的获奖论文及代码  10余篇相关研究论文pdf  没有思路的 ...

  8. 2022年华为杯中国研究生数学建模竞赛D题思路

    一.思路获取方式 获取代码方式: 2022年华为杯中国研究生数学建模竞赛思路 备注: 点击上面蓝色字体2022年华为杯中国研究生数学建模竞赛思路,扫描上面二维码,付费29.9元订阅海神之光博客付费专栏 ...

  9. 2021年 美国大学生数学建模竞赛 赛题发布!【英文原文 中文翻译】

    原文链接[微信公众号:校苑数模   ]:2021年美国大学生数学建模竞赛赛题发布! 原文链接[微信公众号:校苑服务号]:[中文翻译]2021年美国大学生数学建模竞赛赛题! [2021美赛赛题(英文原文 ...

最新文章

  1. k均值聚类算法考试例题_K-均值聚类法实例解析
  2. java 中文符号占位_java – ‘占位符’字符以避免积极比较?
  3. 教程 | OpenCV深度神经网络实现人体姿态评估
  4. 还需要“注意力层”吗?一堆“前馈层”在ImageNet上表现得出奇得好
  5. 通俗理解LightGBM并图解举例
  6. 数据结构---关键路径
  7. “引用作为函数参数”与 “引用作为函数返回值”
  8. stm32cubemx adc_STM32CubeMX__Exp5_ADC1_2CH_DMA_TIM3_Trig__简明指导文件__jyb
  9. linux ftp中文乱码方块,Ubuntu下NetBeans中文乱码及方框问题的解决方法
  10. 如何使用JavaScript或JQuery检测一个URL文件是否存在?
  11. 浏览器 调用 vue 组件_父子组件的通信
  12. Python借助百度搜索引擎爬取Python小屋密切相关文章
  13. 计算机硬盘驱动器越大,计算机基础知识1.3摘要.doc
  14. python第五十二课--自定义异常类
  15. A Better Finder Attributes 7 Mac版(文件批量重命名)
  16. SPICE 协议 USB 重定向
  17. vtk-m的安装与配置
  18. C语言之结构体 共用体 枚举 typedef
  19. 强推Markdown神器,一秒钟拯救微信公众号排版
  20. asp.net实现识别客户端浏览器或操作系统

热门文章

  1. 帝国cms html5 编辑器,帝国编辑器自动排版插件
  2. AndroidUI图片图标素材大全
  3. html文件显示controls,HTML video controls 属性
  4. QT线程读取excel表格问题解决
  5. elementui 样式渲染的慢_解决vue+elementui项目打包后样式变化问题
  6. Python(四)迭代器与生成器
  7. swift5.0 封装Alamofire
  8. 学习游戏引擎对新人游戏开发的重要性
  9. ansys 内聚力模型_内聚力界面单元与复合材料的界面损伤分析
  10. AlmaLinux 9安装Epel