![](/img/trans.png)
[英]Why should LabelEncoder from sklearn be used only for the target variable?
[英]SkLearn - Why LabelEncoder().fit only to training data
我可能會丟失一些東西,但是在很長一段時間后,(對於一些高級數據科學家而言) LabelEncoder().fit
的建議僅適用於訓練數據,而不適合測試數據,然后我開始思考為什么這確實必要。
具體來說,在SkLearn
如果我只想讓LabelEncoder().fit
訓練數據,則有兩種不同的情況:
測試集相對於訓練集具有一些新標簽。 例如,測試集只有標簽['USA', 'UK']
而測試集只有標簽['USA', 'UK', 'France']
。 然后,正如其他地方所報道的那樣(例如,使用scikit learning的LabelEncoder時,Getting ValueError:y包含新標簽 ),如果嘗試根據此LabelEncoder()
轉換測試集,則會遇到錯誤,因為它恰好遇到了新標簽。
測試集具有與訓練集相同的標簽。 例如,訓練集和測試集都具有標簽['USA', 'UK', 'France']
。 但是,由於測試集具有與訓練集相同的已知值,所以僅LabelEncoder().fit
訓練數據的LabelEncoder().fit
本質上是多余的。
因此, LabelEncoder().fit
僅適用於訓練數據,然后LabelEncoder().tranform
訓練和測試數據的意義是什么,如果在情況(1)下拋出錯誤,而在情況(2)下冗余?
讓我澄清一下,我見過的LabelEncoder().fit
的(非常有知識的)高級數據科學家僅LabelEncoder().fit
訓練數據,他們通過說測試集甚至對於最簡單的模型(例如編碼器和請勿將其與培訓數據進行任何混合。 他們沒有提及任何有關生產或非語言用途的內容。
這樣做的主要原因是因為在推論/產生時間(不進行測試)中,您可能會遇到從未見過的標簽fit()
即使您願意,也無法調用fit()
)。
在場景2中,可以保證折疊時始終具有相同的標簽,並且在生產中確實是多余的。 但是,您仍然可以保證在生產中看到相同的東西嗎?
在方案1中,您需要找到一種處理未知標簽的解決方案。 一種流行的方法是將每個未知標簽映射到unknown
令牌中。 在自然語言處理中,這被稱為“詞匯不足”問題,並且經常使用上述方法。
為此,仍然使用LabelEncoder()
您可以預處理數據並自己執行映射。
很難猜測為什么高級數據科學家會在沒有上下文的情況下為您提供建議,但是我可以想到至少他們想到的一個原因。
如果您在第一種情況下,訓練集不包含完整的標簽集,那么了解這一點通常會很有幫助,因此錯誤消息是有用的信息。
隨機抽樣通常會遺漏稀有標簽,因此對您所有數據進行完全隨機抽樣並不總是生成訓練集的最佳方法。 如果法國未出現在您的訓練集中,則您的算法將不會從中學習,因此您可能希望使用隨機方法來確保您的訓練集中代表少數情況。 另一方面,使用不同的隨機方法可能會引入新的偏差。
獲得此信息后,將取決於您的數據和要解決的最佳解決方案問題,但是在某些情況下,必須具有所有標簽的重要性。 一個很好的例子就是確定一種非常罕見的疾病的存在。 如果您的訓練數據不包括表明存在該疾病的標簽,則最好重新采樣。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.