亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

是否可以通過機器學習學習和預測 NaN 值?

是否可以通過機器學習學習和預測 NaN 值?

PIPIONE 2023-06-13 16:32:41
我正在嘗試用兩個輸出值解決回歸問題。輸出值充當傳入預訂值的兩個不同閾值,以接受或拒絕預訂。這兩個輸出值是在業務案例中手動設置的,但這應在機器學習的幫助下自動完成。在業務案例中,其中一個輸出值可以是 Nan,那么所有預訂都將接受此標準。因此,如果一個輸出值未填充,則它對業務案例有效。例子:X_train = np.array([(1,1),(2,2),(3,3),(4,4)])Y_train =np.array([(1,1),(2,2),(3,3),(4,np.nan)])X_test = np.array([(5,5),(6,6),(7,7)])Y_test = np.array([(5,5),(6,np.nan),(7,7)])reg  = MLPRegressor()reg = reg.fit(X_train,Y_train)我的問題是當我為輸出 Y_train/Y_test 設置 NaN 值時,例如 scikit-learn 會拋出錯誤。ValueError: Input contains NaN, infinity or a value too large for dtype('float64').我不想用平均值或 0 來估算這些值,因為如上所述,缺失值是業務案例的有效設置。是否有可能用 scikit-learn 或一般的機器學習來解決這樣的問題?編輯:業務未設置的輸出值不直接存儲為 NaN 而是存儲為 -9999999999 以表示無窮大。我用 NaN 替換了這些值,因為我認為如此高的值會扭曲結果。所以如果我不替換任何東西,變量實際上會導致以下結果:X_train = np.array([(1,1),(2,2),(3,3),(4,4)])Y_train =np.array([(1,1),(2,2),(3,3),(4,-9999999999)])X_test = np.array([(5,5),(6,6),(7,7)])Y_test = np.array([(5,5),(6,-9999999999),(7,7)])是保留這些值比保留 NaN 更好,還是它們會扭曲結果而必須被忽略?
查看完整描述

3 回答

?
烙印99

TA貢獻1829條經驗 獲得超13個贊

也許將您的問題分成兩個任務是一個可以接受的解決方案。一個用于回歸和分類是否提供數據。


X_train = np.array([(1,1),(2,2),(3,3),(4,4)])

Y1_train = np.array([(1,1),(2,2),(3,3),(4,4)])

Y2_train = np.array([(1,1),(1,1),(1,1),(1,0)])


X_test = np.array([(5,5),(6,6),(7,7)])

Y1_test = np.array([(5,5),(6,6),(7,7)])

Y2_test = np.array([(1,1),(1,0),(1,1)])

對于回歸,請執行與對 X_train 和 Y1_train 對相同的操作。


分類部分的示例代碼


from sklearn.neural_network import MLPClassifier

clf = MLPClassifier()

clf.fit(X_train, Y2_train)


查看完整回答
反對 回復 2023-06-13
?
有只小跳蛙

TA貢獻1824條經驗 獲得超8個贊

訓練數據的全部意義在于監督模型,教它預測具有一組特征的輸出。因此,將 nan 值作為訓練 X, y 的一部分是沒有意義的。模型不會在“填補空白”的同時繼續學習。噸

標準方法是使用缺失值技術,例如 - 按均值/0 估算,使用 KNN 通過檢測包含缺失數據的樣本的最近鄰居來替換值,順序數據的估算技術(線性、akima、二次、樣條等)或可以處理丟失數據的編碼方法。

如果您不想使用缺失值處理策略,則不應將該行保留為訓練數據集的一部分。

是否有可能用 scikit-learn 或一般的機器學習來解決這樣的問題?

是的,正如我提到的,有一個完整的研究領域來解決這個問題(KNN 是處理這個問題的最流行和最容易獲得的機器學習方法)。本文可能有助于指導您更多


編輯(基于 OP 編輯)

將 99999999 值替換為 Nan 是正確的方法,因為我們不知道為什么業務部門將它們設置為該值。很可能是丟失了數據,他們將這些數據歸為垃圾值,以便能夠將數據存儲在數據庫中而不會出現太多問題。其次,將它們視為 Nan 值而不是異常值會更明智。因此,出于監督培訓的目的,我建議刪除具有這些值的行。

另一件事是我注意到這些值是 Y train 和 Y test 的一部分。如果 Nans 僅在 Y 數據中,這會使事情變得更容易,因為您可以簡單地將這些行保留為數據的一部分以進行預測。在非 nan 數據上訓練模型,并使用該模型預測行的 Y 值以替換 Nan 值。

但是,如果您認為這些是極值并且應該被視為異常值,您仍然必須將它們從模型訓練中刪除,因為它們會瘋狂地偏向模型結果。

最后,如果這是一個分類練習(不是回歸),那么您實際上可以將 999999 視為一個單獨的類,并像其他任何類一樣對其進行預測。這不適用于回歸,因為在回歸中 999999 是將要進行預測的連續尺度的一部分。


查看完整回答
反對 回復 2023-06-13
?
一只斗牛犬

TA貢獻1784條經驗 獲得超2個贊

即使您的模型可以在輸出時生成 NaN,也無法判斷這是錯誤還是實際估計。我不會在訓練集中使用 NaN。

不僅因為 NaN 不能用任何數值數據類型表示,而且因為不可能對 NaN 執行算術運算:這意味著您無法計算它的梯度,無法計算與其相交的直線或斜率. 簡而言之,您的模型無法將其學習為數值,因為它不是數字。


查看完整回答
反對 回復 2023-06-13
  • 3 回答
  • 0 關注
  • 236 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號