![](/img/trans.png)
[英]Difference between using train_test_split and cross_val_score in sklearn.cross_validation
[英]Different results between using train_test_split and cross_val_score in sklearn.cross_validation with randomized data
我在我的代碼中使用sklearn執行初步測試。
我正在測試:
1)sklearn.cross_validation.cross_val_score
2)sklearn.cross_validation.train_test_split
喜歡這個問題 。
代碼如下:
#X is my data and Y the corresponding binary labels
#My classifier
clf = svm.SVC(class_weight='auto', kernel=kernel, gamma=gamma,
degree=degree, cache_size=cache_size,probability=probability)
#1st method: ShuffleSplit and cross validation
cv = cross_validation.ShuffleSplit(X.shape[0], n_iter=5,
test_size=0.4, random_state=0)
#Scoring
scores = cross_validation.cross_val_score(clf, X, Y,
cv=cv, n_jobs=3, scoring="roc_auc")
#2nd method: train_test_split
X_train, X_test, y_train, y_test = cross_validation.train_test_split(
X, Y, test_size=0.4, random_state=42)
clf.fit(X_train, y_train)
pred_test = clf.predict(X_test)
#Scoring
score = roc_auc_score(y_test, pred_test)
與另一個問題的區別在於我的數據在1)和2)的情況下都是隨機的。
但我得到案例1)以下分數:
[ 0.9453893 0.94878745 0.95197478 0.95150763 0.94971746]
對於案例2):
0.867637
我實際上完全不明白這個不同分數的原因,也無法得到我在這里缺少的東西。
評分不應該相似嗎?
感謝您的時間。
我知道我已經遲到了,但我剛遇到類似的問題而且偶然發現了這篇文章。 使用train_test_split和cross_val_score比較答案時,我遇到了完全相同的問題 - 使用roc_auc_score指標。
我認為問題是通過將分類器的預測二進制輸出放入roc_auc_score比較而產生的。 這意味着度量標准只有兩個二進制輸出數組來進行分數。 如果您嘗試使用'predict_proba',那么這將為您提供一個包含兩列的數組(假設您在這里有兩類問題),這些數組的概率來自不同的采樣點。
在我的數據集中,我獲取了第二列並將其與真值一起輸入roc_auc_score,這返回的答案更符合cross_val_score的輸出。
更新:
在學習了更多(並閱讀文檔!)之后 - 這不是解決這個問題的最佳方法,因為它需要為SVC設置probability=True
,這在計算上要貴得多。 不要使用predict
或predict_proba
,而是使用decision_function
,然后將這些值作為預測值輸入roc_auc_score
。
更新:
在回應關於這個過程的評論時,我還附上了幾個數字來解釋這個過程。 我還將提供一些背景信息,幫助我了解這一點。
接收器操作特性曲線是通過查看真實與誤報的相對量的變化來做出的,因為決策邊界的閾值從嚴格變為更寬松。 然而,這種解釋似乎在某些地方難以理解,因此這里提供了一個數字。 這顯示了線性支持向量機對某些生成數據的決策邊界,這些數據具有2個特征,即“藍色”類和“紅色”類。 實線表示通過訓練SVM找到的二元決策的閾值。 所有點都代表用於訓練模型的數據。 任何新數據都可以添加到圖中; 如果它們出現在左下角,則會標記為“紅色”,右上角標記為“藍色”。 我們可以將'red'視為'正'類,因此預測的輸出是二進制{0,1}輸出(紅色= 1,藍色= 0)。
需要注意的一點是,數據點不是完全線性可分的 ,模型中有一個區域靠近決策邊界,紅色和藍色點重疊很多。 因此,這里的線性模型無法獲得完美的性能。
虛線表示SVM的邊距 。 SVM的訓練旨在最大化該邊緣的寬度,並且非常依賴於所提供的超參數C值。 實際上,較高的C值將迫使模型更好地適應訓練數據,而較低的值將允許此處的錯誤分類,目的是對新的和未看到的數據具有更好的通用性。 完整的描述可以在scikit-learn文檔中看到: http ://scikit-learn.org/stable/auto_examples/svm/plot_svm_margin.html#sphx-glr-auto-examples-svm-plot-svm-margin-py 。 請注意,所有要么錯誤分類的點,要么出現在此邊距區域中。 其他一點,我們對正確的超級自信。
所以關鍵是,如何計算AUC。 我在這張圖上添加了兩條額外的線,紅色和藍色邊界線。 這些可以被認為是主要決策線從高度選擇性區域的轉移 ,其中只有最自信的紅點實際上被歸類為紅色,到非常放松的邊界,其中每個點將被歸類為紅色。 請記住,此移動閾值右下角的任何點都將被歸類為紅色。
最初,沒有數據點符合要歸類為紅色的標准,但隨着線沿箭頭方向移動,它開始挖掘這些點。 在早期階段,所有這些都是正確的,因為所有數據點都是紅色的,但是當我們朝向邊緣區域時,我們很快就會開始獲得誤報(藍點),同時獲得更多的紅色。 這種以不同速率收集真假陽性的模式會影響ROC曲線。 顯示這個的最好方法是另一個數字:
想象一下,我們開始從左下角繪制曲線,並在我們改變閾值位置時進行小幅運動。 當我們收集真實的紅色正面時,我們在y軸方向繪制線條,但是當我們收集藍色時,我們在x軸方向繪制。 目的是盡可能靠近左上角發送線,最后我們將采用曲線下面積(AUC)作為我們的指標。 請注意,最后,該行始終位於右上角(最終,所有數據點將被歸類為紅色),在這種情況下,它只是沿着圖形的頂部移動。 這是因為,在此數據集中,隨着閾值越接近藍線,我們只會得到誤報。
現在想象兩種非常不同的情況:如果數據完全可線性分離,那么沒有一個訓練數據點在邊界的“錯誤”側,ROC線總是直接向上直到y軸,直到它到達左上角,沿着圖表頂部的頭部到右上角,AUC為1.但是,如果數據點只是一團噪音,所有混合在中心,你會得到誤報。與真陽性相同的速率,你的線將朝向對角線的方向,並給出0.5的AUC。 因此,為什么這個值代表完整的機會水平。
我不是scikit-learn的貢獻者,我沒有在這里檢查過源代碼,但我可以想象roc_auc_score
使用來自decision_function
或predict_proba
的值作為表示模型對積極點有多自信的表示(在我們的例子中是紅色)類。 因此,放寬邊界和觀察真假誤差的變化率的相同邏輯仍然存在。 如果這不對,那么請糾正我。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.