logo
Loading...

下列程式中, 為什麼資料傳入Label Encoder前需要把df[].values轉成list呢? - Cupoy

想請問老師,為甚麼下面第一行必須要把df[].values轉成list呢?關於第二行的操作我還不明白...

ml100,python,ml100-d29

下列程式中, 為什麼資料傳入Label Encoder前需要把df[].values轉成list呢?

2019/03/30 下午 02:46
機器學習共學討論版
Li-xuan Chen
觀看數:1
回答數:4
收藏數:1
ml100
python
ml100-d29

回答列表

  • 2019/04/01 下午 08:43
    陳明佑 (Ming You Chen)
    贊同數:0
    不贊同數:0
    留言數:0

  • 2019/04/02 下午 02:38
    Li-xuan Chen
    贊同數:0
    不贊同數:0
    留言數:0

  • 2019/04/03 上午 11:05
    陳明佑 (Ming You Chen)
    贊同數:
    不贊同數:
    留言數:

    因為同學問得比較詳細, 所以剛剛不是用理解, 

    而是深入追蹤這一段code問題在哪

    仔細逐行追蹤後, 發現問題似乎是在於上一行 -> df[c] = df[c].fillna(-1)


    因為 LabelEncoder 要編碼前, 

    要先找出內容總共有幾種 ( 呼叫 np.unique() 函數 ), 並且排序

    但是比較時, 原本欄位中都是字串 'str', 

    與補缺填入的 -1 (是整數 'int') 無法比大小

    (也就是說 字串跟字串 / 數值與數值 個別可以比大小, 但兩者之間不行)


    知道這個問題後, 我試著將D17程式改成下面這樣, 就能順利執行了

    如果是文字類別, 改填補 'None' 這個字串, 

    不僅不用 list(), 連 .values 也可以拿掉了, 應該比較容易理解吧?


    *但仔細想想, 就算放入整數, 用原本的方式雖然粗暴, 但也行得通呢...

    Python真是有趣的語言...

    LEncoder = LabelEncoder()
    MMEncoder = MinMaxScaler()
    for c in df.columns:
        if df[c].dtype == 'object':
            df[c] = df[c].fillna('None')
            df[c] = LEncoder.fit_transform(df[c]) 
        else:
            df[c] = df[c].fillna(-1)
        df[c] = MMEncoder.fit_transform(df[c].values.reshape(-1, 1))
    df.head()

  • 2019/04/03 下午 00:35
    張維元 (WeiYuan)
    贊同數:1
    不贊同數:0
    留言數:0