3 回答

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)

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 是將要進行預測的連續尺度的一部分。

TA貢獻1784條經驗 獲得超2個贊
即使您的模型可以在輸出時生成 NaN,也無法判斷這是錯誤還是實際估計。我不會在訓練集中使用 NaN。
不僅因為 NaN 不能用任何數值數據類型表示,而且因為不可能對 NaN 執行算術運算:這意味著您無法計算它的梯度,無法計算與其相交的直線或斜率. 簡而言之,您的模型無法將其學習為數值,因為它不是數字。
添加回答
舉報