2017-08-17 110 views
1

熊貓分類https://pandas.pydata.org/pandas-docs/stable/categorical.html如何處理新的和看不到的水平?我正在考慮像設置一樣的scikit-learn。目前,我有這樣的: https://gist.github.com/geoHeil/5caff5236b4850d673b2c9b0799dc2ce熊貓分類新級別

def: fit() 
    for each column: 
    fit a label encoder: 
def: transform() 
    for each column: 
    check if column was unseen 
     yes(unseen) replace 
     no: label encode 

但這是相當緩慢。

顯然,像xgboost或lightbm這樣的決策樹可以直接處理分類數據,即不需要手動擺弄這種慢速轉換。 但是,當他們看他們的代碼 https://github.com/Microsoft/LightGBM/blob/master/python-package/lightgbm/sklearn.py#L532他們似乎使用LGBMLabelEncoder這是一個標準scikit學習LabelEncoder

我想知道如何處理看不見的數據。

如果需要手動轉換,pandas.Categorical允許更快的轉換 - 即使新數據中有看不見的級別?

編輯

請參閱https://github.com/geoHeil/pythonQuestions/blob/master/categorical-encoding.ipynb的概述,我怎麼能不得到scikit學習的通常嫌疑人的工作。 仍在尋找比我的解決方案更高性能的產品。另外lightGBM https://github.com/Microsoft/LightGBM/issues/789建議使用自定義編碼策略。

+1

Pandas.Categorical只是填補他們與南。 Scikit-learn也不處理新數據,它們很可能會被刪除或替換爲Nan。嘗試使用LabelEncoder與不可見的數據,你會得到'ValueError:y包含新標籤:'。 –

+0

爲什麼這個問題downvoted ??我想一個小的可重複數據集和理想的人可以幫助更好地理解問題... – MaxU

+2

@MaxU也許是因爲在我看來,它更多的是算法方法問題而不是編程問題。這是機器學習中關於如何處理不可見數據的常見問題,[交叉驗證](http://stats.stackexchange.com)是正確的地方。 –

回答

0

有可能是熊貓solutin,但它的工作原理可能是最好用sklearns LabelBinarizer

from sklearn.preprocessing import LabelBinarizer 
df= pd.DataFrame({'A':['a','b','c','a']}) 
lb = LabelBinarizer() 
lb.fit(df["A"]) 
lb.transform(df["A"]) 

[[1 0 0] 
[0 1 0] 
[0 0 1] 
[1 0 0]] 

df2 = pd.DataFrame({'A':['a','b','d']}) 
lb.transform(df2['A']) 
[[1 0 0] 
[0 1 0] 
[0 0 0]] 

所以我們看到, 'd' 基本上映射到既不是 'A', 'B' 或 'C'。 但請注意,有一個bug可能會在下一個sklearn版本中解決。

LabelBinarizer適合在訓練過程中調用並傳遞給它的值。新值將映射到全零。使用pandas get_dummies編寫變壓器(如編輯前所示)可能更爲可行。

由於列的名稱匹配,這可能非常簡單。第一步適合存儲列名稱,而不僅僅是在變換步驟中進行變換,而只保留在擬閤中確定的列名(如果訓練級別不存在於測試集中,可能會添加zome零列)。然後你就完成了;)

+0

但是缺少關鍵詞 - 你不能保證第二個df具有潛在的不可見分類層次或不同順序的水平,以便正確編碼。 –

+0

您是對的,缺少排序可能會丟失,但是,在處理具有離散值的列時,新類別/值將在每列中映射爲零。 – Quickbeam2k1

+0

關於排序,如果df_1包含a,b並將其映射到1,2並且df_2包含b,c這應該映射到2,0所以它不應該是個問題?或者我誤解了這個? –