1、背景介绍
近年来,人工智能技术日新月异,创新成果赋能生物医学、材料、金融、气象等千行百业,人工智能技术引领的新一轮科技革命和产业变革浪潮,将成为未来世界经济和高端制造的主导技术,更会对中国现代化产业体系建设发挥无可替代的作用。 在实际应用中,如何针对具体问题和生产数据开展数据挖掘与建模分析具有非常大的挑战性。本方案从电力能源、医疗和化学领域的实际问题出发,基于AI4S的通用范式和模型提出问题解决方案,从而为科学发现和创新提供有益借鉴和思路。
2、问题与挑战
领域 | 问题 | 挑战 | 数据量 | 数据来源 |
电力能源 | 电压失稳是电力系统安全的关键威胁,尤其在风力发电资源大规模并网的情况下。为了实现实时评估,基于数据驱动的电压稳定性评估方法被广泛的应用。 | 实际环境中数据驱动模型的输入是不完整的。本场景中训练数据电压特征数量为3900,测试数据的电压特征则存在缺失,只有1170。 | 2198 | IEEE New England 10-machine 39-bus系统的电压稳定性数据 |
医疗 | 心电图是临床最基础的一个检查项目,因为安全、便捷成为心脏病诊断的利器。每天都有大量的心电图诊断需求,但是全国范围内诊断心电图的专业医生数量不足,导致很多医院都面临专业心电图医生短缺的情况。 | 临床标准12导联心电图数据为不规则时序数据。 | 1600 | 由复旦大学附属中山医院和上海数创医疗科技有限公司联合提供的数据 |
生物化学 | 在药物发现和开发领域,传统的实验方法非常耗时耗力,且不适用于大规模的药物筛选。人工智能的方法和技术可以极大地减少药物发现和开发过程中的资金和时间消耗。 | 药物分子数据采用SMILES字符串表示,具有非结构化特点。 | 1513 | BACE-1数据集 |
3 编程环境
4 建模范式
5 模型配置
6 结果展示
7 总结
1、AI for Science的问题复杂之一在于各种性质形态不同的的数据集,采取合适的数据挖掘手段和方法才能充分提取其中的关键信息。 2、机器学习中规范科学的建模范式同样适用于AI for Science。 3、在分类精度和效果上,xgboost等代表的梯度提升树明显比传统的机器学习算法有更明显的优势。
8 主要代码
# 定义模型训练函数
def model1(train,y,test):
NFOLD = 5
random_state = 2021
KF = StratifiedKFold(n_splits=NFOLD, shuffle=True, random_state=random_state)
predictions_cat = np.zeros(len(test))
params_cat = {
'iterations': 10000,
'learning_rate':0.05,
'eval_metric': 'AUC',
'early_stopping_rounds':200,
'use_best_model':True,
'depth':10,
'subsample':0.8,
'random_state':random_state,
'rsm':0.8,
'bagging_temperature':0.8,
'thread_count':-1}
for fold_, (trn_idx, val_idx) in enumerate(KF.split(train,y)):
print('----------------------- fold {} -----------------------'.format(str(fold_+1)))
trn_data = Pool(train.iloc[trn_idx], y.iloc[trn_idx])
val_data = Pool(train.iloc[val_idx], y.iloc[val_idx])
clf_cat = CatBoostClassifier(**params_cat)
clf_cat.fit(trn_data,eval_set=val_data,verbose=100)
predictions_cat[:] += (clf_cat.predict(test,prediction_type='Probability')[:,1] / NFOLD)
return predictions_cat
def model2(train,y,test):
NFOLD = 5
random_state = 2021
KF = StratifiedKFold(n_splits=NFOLD, shuffle=True, random_state=random_state)
predictions_lgb = np.zeros(len(test))
params_lgb = {
'objective':'binary',
'metric':'auc',
'random_state':random_state,
'learning_rate':0.05,
'subsample':0.8,
'max_depth':10,
'bagging_freq':3,
'colsample_bytree':0.8,
'n_jobs':-1,
'verbose':-1}
for fold_, (trn_idx, val_idx) in enumerate(KF.split(train,y)):
print('----------------------- fold {} -----------------------'.format(str(fold_+1)))
trn_data = lgb.Dataset(train.iloc[trn_idx], label=y.iloc[trn_idx])
val_data = lgb.Dataset(train.iloc[val_idx], label=y.iloc[val_idx])
clf_lgb = lgb.train(params=params_lgb,
train_set=trn_data,
valid_sets=[trn_data, val_data],
valid_names=('train', 'val'),
num_boost_round=10000,
early_stopping_rounds=200,
verbose_eval=100)
predictions_lgb[:] += (clf_lgb.predict(test,num_iteration=clf_lgb.best_iteration) / NFOLD)
return predictions_lgb
def model3(train, y, test):
NFOLD = 5
random_state = 2021
KF = StratifiedKFold(n_splits=NFOLD, shuffle=True, random_state=random_state)
predictions_xgb = np.zeros(len(test))
params_xgb = {'booster': 'gbtree',
'objective': 'reg:logistic',
'eval_metric': 'auc',
'max_depth': 10,
'subsample': 0.8,
'colsample_bytree': 0.8,
'tree_method':'hist',
'seed': random_state,
'nthread': -1,
'eta':0.05}
for fold_, (trn_idx, val_idx) in enumerate(KF.split(train,y)):
print('----------------------- fold {} -----------------------'.format(str(fold_+1)))
train_matrix = xgboost.DMatrix(train.iloc[trn_idx], label = y.iloc[trn_idx])
valid_matrix = xgboost.DMatrix(train.iloc[val_idx], label = y.iloc[val_idx])
test_matrix = xgboost.DMatrix(test)
watchlist = [(train_matrix, 'train'),(valid_matrix, 'eval')]
clf_xgb = xgboost.train(params_xgb,
train_matrix,
num_boost_round=10000,
evals=watchlist,
verbose_eval=100,
early_stopping_rounds=200)
predictions_xgb[:] += (clf_xgb.predict(test_matrix , ntree_limit=clf_xgb.best_ntree_limit) / NFOLD)
return predictions_xgb
def train_and_predict(train,y,test,model_name):
random_state = 2021
if model_name == 'Logistic Regression':
model = LogisticRegression(random_state=random_state)
model.fit(train, y)
pred_y_proba = model.predict_proba(test)[:, 1]
elif model_name == 'Bernoulli Naive Bayes':
model = BernoulliNB()
model.fit(train, y)
pred_y_proba = model.predict_proba(test)[:, 1]
elif model_name == 'Decision Tree':
model = DecisionTreeClassifier(random_state=random_state)
model.fit(train, y)
pred_y_proba = model.predict_proba(test)[:, 1]
elif model_name == 'K-Nearest Neighbor':
model = KNeighborsClassifier(3)
model.fit(train, y)
pred_y_proba = model.predict_proba(test)[:, 1]
elif model_name == 'Catboost':
pred_y_proba = model1(train, y, test)
elif model_name == 'Lightgbm':
pred_y_proba = model2(train, y, test)
else:
pred_y_proba = model3(train, y, test)
return pred_y_proba