2021年華為杯數模賽D題總結
題目:
題目太長(網上能找到完整題目),背景資訊略過,這里把題目抽象一下:
已有條件:
- 給出了1974個訓練樣本和50個測驗樣本,每個樣本有729個特征
- 每個訓練樣本有7個標簽,分別是IC50值、pIC50值、和ADMET性質(包含5個標簽)
- IC50值、pIC50值是兩個相關的連續變數,pIC50是IC50的負對數
- ADMET性質的五個變標簽都是布林值
問題:
- 根據特征對IC50值和pIC50值影響的重要性進行排序,并給出前20個對IC50值和pIC50值最具有顯著影響的特征
- 選擇不超過20個特征,構建IC50值和pIC50值的定量預測模型,并計算測驗樣本的IC50值和pIC50值,
- 構建ADMET性質的分類預測模型,并計算測驗樣本的ADMET性質
- 尋找并闡述哪些特征,以及這些特征在什么取值范圍時,pIC50值取值較好,同時具有更好的ADMET性質(給定的五個ADMET性質中,至少三個性質較好)
把題目抽象以后,可以發現是一個很明顯的利用機器學習模型處理資料挖掘的問題,題目的大致思路就出來了:
第一問主要問題:特征選擇問題
第二問主要問題:回歸預測問題
第三問主要問題:二分類問題
第四問主要問題:最優化問題
在使用機器學習模型之前,為簡化模型,需要對題目做一些假設:
- 729個特征符合獨立同分布
- 729個特征的值是準確可靠的
- ADMET與IC50值和pIC50值是相互獨立的
不得不說,這個題目出得相當好,把資料挖掘的每個步驟都考到了,兼顧了回歸問題和分類問題,用到的技術及要求比較全面,但又不過分深入,是一道很有價值的題目,
第一問
步驟一
根據假設2,資料集中沒有臟資料,可略過資料清洗,直接進行特征選擇,
特征可以分為三類,:
- 相關特征(保留):對于學習任務(例如分類問題)有幫助,可以提升學習演算法的效果;
- 無關特征(剔除):對于我們的演算法沒有任何幫助,不會給演算法的效果帶來任何提升;
- 冗余特征(剔除):不會對我們的演算法帶來新的資訊,或者這種特征的資訊可以由其他的特征推斷出;
根據假設1,資料集中不存在冗余特征,我們只需將無關特征剔除即可,首先要把方差極小的特征洗掉,
1.資料歸一化(去量綱),保留原有特征分布, n o r m ( x ) = x ? m i n ( x ) m a x ( x ) ? m i n ( x ) norm(x) = \frac{x-min(x)}{max(x)-min(x)} norm(x)=max(x)?min(x)x?min(x)?
2.方差過濾,剔除方差較小的特征,
根據以上操作,剔除了568個無效的特征,剩余161個特征,
步驟二
這一步,我們使用了三種不同的方法進行特征選擇分別是:
- 灰色關聯分析(GRA)
- 遞回特征消除(RFE)
- 互資訊法(MIR)
為什么選擇這三種方法呢?首先,我們分析資料之后,沒能得出資料有什么特點,因此不知道什么樣的特征選擇方法是最優的,使用多種特征選擇方法,之后再對比這幾種方法的性能,總能選出一個最優的,其次,我們選擇的方法既包含能表征線性關系的方法(GRA),有包含能表征非線性關系的方法(RFE/MIR),
1.GRA:
GRA的原理和代碼可參考我的博客:灰色關聯分析
2.RFE:
遞回特征消除的主要思想是反復的構建回歸模型(這里用的是SVM),然后選出最好的(或者最差的)的特征,把選出來的特征剔除,然后在剩余的特征上重復這個程序,直到所有特征都遍歷了,這個程序中特征被消除的次序就是特征的排序,
from sklearn.svm import SVC
from sklearn.feature_selection import RFE
svc = SVC(kernel="linear", C=1)
rfe = RFE(estimator=svc, n_features_to_select=1, step=1)
rfe.fit(X, y)
ranking = rfe.ranking_.reshape(digits.images[0].shape)
3.MIR:
MIR使用了概率論和資訊論的知識,篇幅限制,我就貼一個總結的較好的博文吧:MIR
from sklearn.feature_selection import mutual_info_classif as MIC
result = MIC(X_fsvar,y)
k = result.shape[0] - sum(result <= 0)
X_fsmic = SelectKBest(MIC, k=20).fit_transform(X_fsvar, y)
cross_val_score(RFC(n_estimators=10,random_state=0),X_fsmic,y,cv=5).mean()
根據以上三種方法,我們得到了三組對pIC50影響最大的20個特征,那么該選那一組作為最終結果呢?我們將這三組特征使用第二問的模型進行對比,哪組擬合優度最好就選哪組,
在這先放個最終答案吧(剛發現,這個三線表的格式有問題… 猛男哭哭):

第二問
我們使用了很多模型進行試驗,包括SVM、線性回歸、手工設計的全連接神經網路和matlab工具箱中的BP神經網路,這個程序就不再贅述了,最終結論就是matlab工具箱中的BP神經網路是效果最佳的,
BP神經網路的原理和實作方法參見我的博客:BP神經網路
我們得到的結果如下:

GAR/RFE/MIR的迭代曲線:

可見MIR的擬合優度最高,因此第一問最終結果就是使用MIR得到的那組特征,
下面擬合的pIC值與真實的pIC50值的對比:

賽后思考:這一問其實是有點問題的,RFE做特征選擇的時候使用的模型是SVM,但實際性能對比的時候用到模型是BP神經網路,這是錯誤的,當選用BP神經網路時,我們應該讓RFE使用BP神經網路重新做一次特征選擇,這樣才能保證結果是可靠的,
第三問
由假設3可知,第三問與前兩問一毛錢關系都沒有,
第三問是一個經典的二分類問題,套路與前兩問類似——先做特征選擇,再做預測模型,而隨機森林演算法既可以做二分類模型,也可以進行特征選擇,因此這一問我們很自然的選擇了隨機森林演算法,
隨機森林是一種基于決策樹的集成學習演算法,具體的原理可以參考這篇博文:隨機森林(by the way, 這篇文章詳略得當,寫的確實不錯)
特征選擇:
import sklearn.feature_selection
from sklearn.model_selection import ShuffleSplit
from collections import defaultdict
from sklearn.ensemble import RandomForestClassifier
rf = RandomForestClassifier(n_estimators=100,
criterion='gini',
verbose=1,
n_jobs=-1,
oob_score=True)
scores = defaultdict(list)
rs = ShuffleSplit(n_splits=5, test_size=0.2)
for train_idx, test_index in rs.split(x_train):
X_train, X_test = x_train[train_idx], x_train[test_index]
Y_train, Y_test = y[train_idx], y[test_index]
r = rf.fit(X_train,Y_train)
acc = mean_absolute_error(Y_test, rf.predict(X_test))
for i in range(x_train.shape[1]):
X_t = X_test.copy()
np.random.shuffle(X_t[:, i])
shuff_acc = mean_absolute_error(Y_test, rf.predict(X_t))
scores[i].append(abs(acc-shuff_acc))
print("Features sorted by their score:")
print(sorted([(round(np.mean(score), 4), feat) for
feat, score in scores.items()], reverse=True))
五個標簽選擇的特征分別是:
Caco-2 (相關性閾值取0.5): [719, 677, 105, 725, 716, 655, 626, 27, 26, 175, 8, 678, 653, 286, 630, 615, 605, 604, 594, 266, 66, 638, 35, 3, 720, 88, 294]
CYP3A4 (相關性閾值取0.5): [225, 105, 102, 100, 99, 722, 7, 91, 30, 623, 238, 98, 26, 653, 101, 346, 31]
hERG (相關性閾值取0.5): [357, 238, 476, 653, 606, 291, 4, 587, 480, 95, 92, 648, 11, 7, 410, 346, 250, 155, 104, 22, 8, 725, 647, 630, 84, 97]
HOB (相關性閾值取0.5): [39, 238, 119, 291, 357, 615, 44, 585, 346, 86, 292, 94, 23, 172, 465, 411, 630, 4, 606, 493, 476, 344, 228, 81, 619, 618, 594, 591, 529, 504, 225, 88, 610, 589, 587, 531, 463, 383, 237, 60]
MN (相關性閾值取0.3): [724,722,346]
分類預測:
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report
X_train,X_test,Y_train,Y_test = train_test_split(x_train,y,test_size=0.2)
# 模型建立和訓練
rf = RandomForestClassifier(
n_estimators=100,
criterion='gini',
verbose=1,
n_jobs=-1,
oob_score=True
)
rf.fit(X_train,Y_train)
predict = rf.predict(X_test)
# 模型評估
print('The accuracy of random forest classifier is', rf.score(X_test, Y_test))
print(classification_report(predict, Y_test))
# 預測
predict_test = rf.predict(x_test)
print('Final prediction result is:')
print(predict_test)
最終得到的結果為:





第四問
第四問是一個最優化問題,我們嘗試了使用粒子群演算法,但最后效果非常離譜,,總而言之,我們在第四問遇到了困難(猛男哭哭),因此使用了一個非常不科學的方式:

這一部分我就不細講了,最后貼個結果吧,
| 分子描述符序號 | 分子描述符 | 取值范圍 |
|---|---|---|
| 68 | SCH-7 | (1.66 , +∞) |
| 73 | VCH-7 | (0.847 , +∞) |
| 78 | VC-3 | (2.46 , +∞) |
| 81 | VC-6 | (1.2, 1.25) |
| 90 | SP-2 | (18.481 , +∞) |
| 92 | SP-4 | (3.61 , +∞) |
| 346 | minwHBd | (-∞, 2.2) |
| 529 | maxssssNp | (1.2 , +∞) |
| 619 | ETA_BetaP_ns | (4.32 , +∞) |
| 665 | MDEO-11 | (8.91 , +∞) |
| 722 | WTPT-2 | (-∞, 9.2) |
| 724 | WTPT-4 | (-∞, 4.32) |
| 726 | WPATH | (30134.1 , +∞) |
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/325424.html
標籤:AI
下一篇:Logistic 回歸
