Datawhale 演算法實踐第2期 Task 2 - 模型評估
文章目錄
任務描述
記錄7個模型(邏輯迴歸、SVM、決策樹、隨機森林、GBDT、XGBoost和LightGBM)關於accuracy、precision,recall和F1-score、auc值的評分表格,並畫出Roc曲線。
1. 程式碼優化 - 資料集載入
由於train_test_split 支援輸入為Dataframes格式的資料。所以對於資料的讀取程式碼,建議修正如下:(比較簡潔)
data = pd.read_csv("data_all.csv")
# train_test_split支援dataframes格式的資料, 無需將資料轉為矩陣
X = data.drop(labels=["status"], axis=1)
y = data[["status"]]
略冗餘的程式碼用到了以下方法:
.values.ravel()、.values 或 .as_matrix()
2. 資料未歸一化情況下,LR和SVM求出的precision和recall為0?
@007 同學寫的很有道理,可參照一下他的部落格:
“如果你不用正則,那麼,標準化並不是必須的,如果你用正則,那麼標準化是必須的。”(LogisticRegression的預設引數是使用C=1.0, penalty=‘l2’)
因為不用正則時,我們的損失函式只是僅僅在度量預測與真實的差距,加上正則後,我們的損失函式除了要度量上面的差距外,還要度量引數值是否足夠小。而引數值的大小程度或者說大小的級別是與特徵的數值範圍相關的。
此外,測試了一下,如果選用L2正則化,無論懲罰因子C的取值如何變化,最終的precision和recall仍為0。選用L1正則時,precision和recall不為0(或許是因為L1正則只是對係數取絕對值,木有取平方導致差異那麼大?)
3. 關於SVM的decision_function和predict_proba?
經典的SVM獲得的是距離,不是嚴格意義的概率。所以計算auc值時,建議使用decision_function。
【decision_function方法】:
是對每個樣本都會給出在各個類別上的分數(在二元分類問題中,是對每個樣本給出一個分數)。
【predict_proba方法】:
如果建構函式的probability被設為True,則可以得到屬於每個類別的概率估計(通過predict_proba和predict_log_proba方法)。
在二元分類中,概率使用Platt縮放進行調整:通過在訓練機上做額外的交叉檢驗來擬合一個在SVM分數上的Logistic迴歸。在多元分類中,這種方法被Wu et al. (2004)擴充套件了。顯而易見的是,Platt縮放中的交叉檢驗在大資料集上是一個代價很高的操作。此外,概率估計與實際得分可能會不一致,即使得分取得了最大值,概率並不一定也能取到最大值。
(例如在二元分類中,某個樣本經由predict方法得到的分類標籤,如果使用predict_proba計算可能概率小於1/2。)Platt的方法在理論上也有一些問題。
如果需要拿到置信分數,而這些分數又不一定非得是概率,則建議把probability置為False,並且使用decision_function,而不是predict_proba。
參考文獻:
Wu, Lin and Weng, “Probability estimates for multi-class classification by pairwise coupling”. JMLR 5:975-1005, 2004.
4. 評分表格怎麼畫?
看好多同學沒有畫評分表格,下面介紹兩種畫表格的方法~
法1 - 程式碼實現
可參照@010的如下程式碼:
table_1 = pd.DataFrame(index = ['acc','auc'],columns = [['lr','sm','tr','rfc','gbdtc','xgbc','lgbc']])
for i in ['lr','sm','tr','rfc','gbdtc','xgbc','lgbc']:
table_1.loc['acc',i] = eval('{}_acc'.format(i))
table_1.loc['auc',i] = eval('auc_{}'.format(i))
法2 - 利用markdown的表格
| 模型 | 準確率 | 精準率 | 召回率 | F1-score | AUC值 | ROC曲線 |
|----|----|----|----|----|----|----|
| LR | xx| xx |xx | xx | xx |(插入圖片)|
效果如下:
模型 | 準確率 | 精準率 | 召回率 | F1-score | AUC值 | ROC曲線 |
---|---|---|---|---|---|---|
LR | xx | xx | xx | xx | xx | (插入圖片) |
5. 關於metrics.recall_score裡的average引數
@014 同學程式碼如下:
train_precision = metrics.precision_score(y_train, y_train_pred, average='micro')
train_recall = metrics.recall_score(y_train, y_train_pred, average='micro')
train_F1score = metrics.f1_score(y_train, y_train_pred, average='micro')
遇到的問題是:求出來accuracy、precision,recall和F1-score值一樣,而將設定的引數average='micro’去掉的話,每個值就不一樣了。
二分類問題時,取預設的average=‘binary’。當average='micro’時,precison、recall和F1-score的取值都變成了accuracy。具體看一下,下述網址裡的公式就清楚了:
micro和macro F1 score分別是什麼意思?
Another供參考
sklearn中 F1-micro 與 F1-macro區別和計算原理
6. 其他
@006模型評估的函式中兩句話冗餘了,fit了兩次
clf = model.fit(x_train_standard, y_train)
clf.fit(x_train_standard, y_train)
可改為
clf = model.fit(x_train_standard, y_train)